request和response的筆記

servlet ==>  server applet ==> 服務器端的小程序

1.作用是用來處理請求(request),完成響應(response)的.

2.如何創建一個servlet
	*實現servlet接口
	*繼承GenericServlet
	*繼承HttpServlet
	
3.servlet接口中的方法
	*init (ServletConfig )
	*service (ServletRequest , servletResponse )
	*destory ()
//=======
	*getServletConfig
	*getServletInfo
	
4.ServletConfig 的 作用.
	*getServletName
	*getInitParameter()
	*getInitParameterNames()
	*getServletContext()
5.servlet線程是不安全的.
	因爲在服務器中,一個servlet只存在一個實例.所以當有多個請求同時訪問的時候,如果使用成員變量接受線程參數,就會有問題.
	解決辦法: 使用局部變量接受線程參數.
6.url-pattern
	路徑匹配:   "/"開頭  例如: /AServlet 
	後綴名匹配:  "*"開頭 例如: *.do
注意: 1.匹配範圍越廣優先級越低
	  2.兩種匹配方式不能同時使用.
7.load on  startup
	該配置可以讓servlet在服務器啓動時加載.
	填入的數字表示優先級.數字越小,優先級越高.
	優先級一樣,按配置順序加載.
8.servletContext 
	範圍: 一個項目對應一個servletContext.
	獲取: 通過servletConfig獲取
	作用: 
		1.獲得配置文件(web.xml根下的)中的參數
			*getInitParameter()
			*getInitParameterNames()
		2.域的功能 => application
			增加一個:setAttribute
			刪除一個:removeAttribute
			獲得一個: getAttribute
			獲得所有鍵: getAttributeNames
		3.獲得項目內資源
			getResourceAsStream
			getRealPath
		*以上兩個方法都是填寫相對路徑. "/" ==> 項目的根下(WebRoot)
		
//----------------------------------------------------------------------------------------
Day08 --- request & response
//----------------------------------------------------------------------------------------
1.response 代表響應, 可以理解爲一個空的箱子,我們在裏面填入要發送到瀏覽器的內容. 服務器會把這些內容組裝成http響應.
	
	響應首行  協議/版本號  狀態碼  狀態碼描述
		添加狀態碼 和 描述
		void setStatus(int sc)  只設置狀態碼
		void setStatus(int sc, String sm)   設置狀態碼和描述
		void sendError(int sc) 只設置狀態碼,錯誤的
        void sendError(int sc, String msg)  設置狀態碼和描述
	響應頭
		添加響應頭
			void setHeader(String name, String value) 設置響應頭,如果key一樣會覆蓋
				setIntHeader(String name, int value) 
				setDateHeader(String name, long date) 

			void addHeader(String name, String value) 設置響應頭,無論如何都新增.
				 void addIntHeader(String name, int value) 
				 void addDateHeader(String name, long date)  
	響應空行
	響應正文
		發送字節流
			getOutputStream
		發送字符流
			getWriter
			
//==========================================================================================================
應用.

例一: 手動向瀏覽器發送404

例二: 重定向 

例三: Refresh頭.刷新 

例四: 發送字節流. 發送中文.
  
例五: 發送字符流. 發送中文.

字符流和字節流要注意的一個問題:
	字節流和字符流一定不能同時使用.
	
例六:使用字節流發送圖片
		
例七:使用字節流發送文件(文件下載)

//=============================================================================================================
request對象	
	一.封裝了瀏覽器發送來的請求信息.
	

	請求首行  請求方式 請求路徑  協議/版本號
		request.getMethod(): GET
		request.getRequestURI(): /Day08-request/AServlet
		request.getServletPath(): /AServlet
		request.getContextPath(): /Day08-request
		request.getScheme(): http
	請求頭
//--原始方式獲得請求頭
		String getHeader(String name)  
		long getDateHeader(String name) 
		int getIntHeader(String name)
		Enumeration getHeaders(String name)
		Enumeration getHeaderNames() 
		
//---javaee封裝好的方法.
		request.getContentLength(): -1
		request.getContentType(): null
		request.getLocale(): zh_CN
		request.getQueryString(): name=tom&age=18
		request.getRequestURL(): http://localhost:8080/Day08-request/AServlet
		request.getRemoteAddr(): 0:0:0:0:0:0:0:1
		request.getRemoteHost(): 0:0:0:0:0:0:0:1
		request.getRemotePort(): 52074
		request.getServerName(): localhost
		request.getServerPort(): 8080
	請求空行
	請求正文 表單傳送過來的鍵值對
	
	獲得表單提交的參數.
	1.GET  http://localhost:8080/Day08-request/AServlet?name=tom&age=18
		亂碼:只要確保編碼和解碼一致,就絕對沒有問題.
			1.瀏覽器負責編碼.瀏覽器使用的碼錶就是表單所在頁面的碼錶.
			
			2.服務器負責解碼.服務器默認使用ISO-8859-1解碼. 如下配置的URIEncoding來決定解碼碼錶
				 <Connector port="8080" protocol="HTTP/1.1"  URIEncoding="UTF-8"
					connectionTimeout="20000" 
				redirectPort="8443" />
			如上配置會影響整個服務器不推薦.
				我們使用如下代碼解決:
						//獲得參數
						String name = request.getParameter("name");
						//因爲服務器使用了錯誤的碼錶,那麼我們按照錯誤的碼錶原路返回
						byte[] nameByte = name.getBytes("ISO-8859-1");
						//用正確的碼錶重新解碼
						String newName = new String(nameByte,"UTF-8");
						
						System.out.println("解決之後的:"+newName);
			
		
	2.POST
		因爲Post解碼是在第一次調用getParameter之前,那麼解決亂碼只需要在調用該方法之前設置編碼:
			request.setCharacterEncoding("UTF-8");
		
			String name = request.getParameter("name");
			
			System.out.println(name);
			
涉及到獲得表單參數的方法還有哪些呢?
		String getParameter 根據鍵獲得值
		Map getParameterMap()  獲得服務器保存表單參數的容器. 就是map<String,String[]>. 泛型: habit=chi&habit=shui&habit=la
		Enumeration getParameterNames()  獲得提交的所有鍵
		String[] getParameterValues(String name)  根據鍵獲得值. 獲得一鍵對應多個值的情況的.
		

//---------------------------------------------------------------------------------------------------------------------
2.request的請求轉發和包含功能.
	轉發:
		一個Servlet處理完畢交給下面的servlet(JSP)繼續處理.
	作用: 
		在現實開發中,沒有servlet轉發給servlet的情況.都是由servlet轉發給JSP.
		這樣可以達到分工的作用:
			servlet: 比較適合處理業務.
			JSP: 比較適合顯示功能
	注意問題:
			//servlet中不要做 輸出正文的動作,沒有結果的
			//如果放到前面會出現亂碼.
			//但是響應頭是可以設置的.
	
	包含:
		兩個servlet(jsp)共同向瀏覽器輸出內容.
	作用:
		在現實開發中,多個頁面含有相同的內容,我們把相同的內容抽取到一個jsp中,在需要顯示這個段內容的jsp中,包含抽取的jsp.可以達到
		統一管理相同的內容.
		
3.request域的應用.
	原理:
		在request對象中含有一個map.這個map就是request域.
	作用:
		在將來開發中. 使用請求轉發時,servlet處理完數據, 處理結果要交給jsp顯示. 可以使用request域將處理結果有servlet帶給jsp顯示.
		
	操作:
		1.setAttribute  存入一個鍵值對
		2.getAttribute  通過鍵取出值
		3.getAttributeNames 獲得域中所有鍵
		4.removeAttribute 跟據鍵移除一個鍵值對		
		
	request的範圍:
		一個request對象對應一個request域(map).
		系統當前有多少個request就有多少request域.

//=================================================================================================================
路徑總結:
	路徑分爲兩種情況:
		1.客戶端路徑 ==> 給瀏覽器用的路徑
			<form action="/Day08-request/AServlet" >
			<a href="/Day08-request/AServlet" >
			<img src="/Day08-request/AServlet" >
			response.sendRedirect("/Day08-request/AServlet")
			Refresh:3;url=/Day08-request/AServlet
		路徑寫法:
			帶"/" :  "/" ==> 相對於 主機.
				例如: 表單所在頁面路徑爲==> http://localhost:8080/Day08-request/login.jsp ==> "/" 代表http://localhost:8080/
			
			不帶"/":(開發中一定不要出現不帶"/"的情況).代表從當前目錄找.
				例如: 表單所在頁面路徑爲==> http://localhost:8080/Day08-request/info/login.jsp ==> 代表 http://localhost:8080/Day08-request/info/
		
			
		2.服務器端路徑
			<url-pattern> /AServlet  ==> http://localhost:8080/Day08-request/AServlet
			request.getRequestDispatcher("/AServlet") ==> http://localhost:8080/Day08-request/AServlet
		路徑寫法:
			"/": 相對於項目.  "/"==>http://localhost:8080/Day08-request/
 		
		
		
		
		
		
		
		
		
作業:
		完成學生註冊.
	要求:
		寫一個註冊頁面
		在頁面點擊註冊按鈕.將註冊信息發送到servlet中.
		在servlet中將提交的學生信息交給StudentDao保存到xml中.
		提示用戶註冊成功.
	(成功之後,要在xml中看到新註冊的學生信息算完成)
	

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章