1. 程式人生 > >**伺服器的迴應_ Response [web基礎day15] *

**伺服器的迴應_ Response [web基礎day15] *

今日內容

1.HTTP協議:響應訊息
2.Response物件
3.ServletContext物件

HTTP協議:

1.請求訊息:客戶端傳送給伺服器端的資料
	* 資料格式:
		1.請求行
		2.請求頭
		3.請求空行
		4.請求體
2.響應訊息:伺服器端傳送給客戶端的資料
	* 資料格式:
		1.響應行
			* 組成:協議/版本 響應狀態碼 狀態碼描述
			* 響應狀態碼:伺服器告訴客戶端瀏覽器本次請求和響應的一個狀態
				1.狀態都是3位數字
				2.分類:
					* 1XX:伺服器接收客戶端訊息,但沒有接收完成,等待一段時間後,傳送1XX多狀態碼。
					* 2XX:成功。
					* 3XX:重定向。代表:302(重定向),304(訪問快取)。當伺服器再次接收到了重複的請求,並且伺服器中的資料沒有改變,這個時候伺服器不會返回圖片資料,告知瀏覽器直接讀自己的快取就行了。
					* 4XX:客戶端錯誤。代表:404(請求路徑沒有對應的資源),405(請求方式沒有對應的doGET或者doPost方法)
					* 5XX:服務端錯誤。(伺服器內部出現異常)
						* 當異常物件拋給伺服器了,則伺服器只能停止本次請求,將異常資訊展示在瀏覽器上。
	* 注意:jar包的資料夾一定要命名lib,不然很容易報錯。
		2.響應頭:
			1.格式:頭名稱:值
			2.常見的響應頭:
				* Content-Type:伺服器告訴客戶端本次響應訊息體資料格式以及編碼格式:解決中文亂碼的重要途徑;
				* Content-disposition:伺服器告訴客戶端以什麼格式開啟響應體資料。
					* 值:
						1.in-line:預設值,在當前頁面開啟。
						2.attachment;filenamexxx:以附件形式開啟響應體。(點此超連結會開啟一個檔案下載介面。用於檔案下載。)
		3.響應空行
		4.響應體:傳輸的資料
	* 響應的字串格式:(響應頭就是設定響應內容的格式)

Response物件

* 功能:設定響應訊息
	1.設定響應行
		* 格式:HTTP/1.1 200 ok
		* 設定狀態碼:setStatus(int sc)
	2.設定響應行
		* 格式:setHeader(String name,String value)
	3.設定響應體
		* 使用步驟:
			1.獲取輸出流
				* 字元輸出流:PrintWriter getWriter()
				* 位元組輸出流:ServletOutputStream getOutputStream()
			2.使用輸出流,將資料輸出到客戶端瀏覽器
* 案例:
	1.完成重定向
		* 重定向:資源跳轉的方式
			1.告訴瀏覽器重定向:狀態碼302
			2.告訴瀏覽器該資源的路徑:響應頭location:該資源的路徑
			3.程式碼實現:
				* 方法一:response.setStatus(302);response.setHeader("location","/day15/responseDemo2");
				* 方法二:response.sendRedirect("/day15/responseDemo2");
		* 重定向的特點:
			1.位址列發生變化。
			2.重定向可以訪問其他站點的資源。
			3.重定向是兩次請求。不能用request來共享資料。
		* 轉發的特點:
			1.轉發位址列路徑不變。
			2.轉發只能訪問當前伺服器下的資源。
			3.轉發是一次請求,可以使用request物件來共享資料。
		* forward和redirect的區別:轉發和重定向的區別
		* Override和OverLoad的的區別:重寫和過載的區別
			* 面試時一般是以前面的英文,而不是後面的中文,所以遇到時首先要想到。
		* 路徑寫法:
			1.路徑分類:
				1.相對路徑:通過相對路徑不可以確定唯一資源
					* 如:./index.html
					* 不以/開頭,以.開頭路徑
					* 規則:找到當前資源和目標資源之間的相對位置關係
							* ./:當前木庫
							* ../:後退一級目錄
					* 在web的相對路徑的實際應用中,它是指相對於當前頁面的相對路徑,它是一個以當前頁面建立關係的相對路徑。
				2.絕對路徑:
					* 如:http://localhost/day15/responseDemo2		/day15/responseDemo2
					* 以/開頭的路徑
					
					* 規則:判斷定義的路徑是給誰用的?判斷的請求將從哪兒發出。
						* 給客戶端瀏覽用:需要加虛擬目錄(專案的訪問路徑)
							* 建議虛擬目錄動態獲取:request.getContextPath()
							* <a>,<form>重定向...
						* 給伺服器使用:不需要加虛擬目錄
							* 轉發路徑
-- 如果是轉發,則不需要加虛擬目錄,如果是其他,都要加,動態獲取虛擬目錄:
		-- response.senRedirect(request.getContextPath()+"資源目錄");

	3.伺服器輸出位元組資料到瀏覽器
		* 步驟:
			1.獲取位元組輸出流
			2.輸出資料
	4.驗證碼:
		1.本質:圖片
		2.
		* 步驟:
			* 建立一物件,在記憶體中圖片(驗證碼物件)
			* 美化圖片
			* 將圖片輸出到頁面展示
	* 如果超連結的action地址為空的時候,它會預設重新整理本頁面。

ServletContext物件

1.概念:代表整個web應用,可以和程式的容器(伺服器)來通訊 (它是一個描述web應用的物件)
2.獲取:
	1.通過request物件獲取
		request.getServletContext;
	2.通過HTTPServlet獲取
		this.getServletContext();
3.功能:
	1.獲取MIME型別:
		* MIME型別:在網際網路通訊過程中定義的一種檔案資料型別
			* 格式:大型別/小型別   如:   text/html   image/jpeg(這是jpg的檔案型別)  
		* 獲取的方法:String getMimeType(String file)
	2.域物件:共享資料
		* setAttribute(String name,Object value)
		* getAttribute(String name)
		* removeAttribute(String name)
		
		* ServletContext:物件返回:所有使用者所有請求的資料:它的範圍很廣泛,多使用者多請求都能獲取到同一個域裡的資料。可以做訪問人數統計。
	3.獲取檔案的真實(伺服器)路徑:(這個是Tomcat的路徑而不是工作空間路徑)
		1.方法:String getRealPath("")
		* ClassLoader只能獲取src下的真實路徑,此方法可以獲取web專案下的所有真實目錄和地址。
			 String b = context.getRealPath("/b.txt");//web目錄下資源訪問
	         System.out.println(b);
	
	        String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目錄下的資源訪問
	        System.out.println(c);
	
	        String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目錄下的資源訪問
	        System.out.println(a);

案例:

* 檔案下載需求:
	1.頁面顯示超連結
	2.點選超連結後彈出下載提示框
	3.完成圖片檔案下載
* 分析:
	1.超連結指向的資源如果能夠被瀏覽器解析,則在瀏覽器中展示,如果不能被解析,則彈出下載提示框。不滿足需求。
	2.任何資源都必須彈出下載提示框
	3.使用響應頭設定資源的開啟方式:
* 步驟:
	1.定義頁面,編輯超連結href屬性,指向Servlet,傳遞資源名稱filename
	2.定義Servlet
		1.獲取檔名稱
		2.使用位元組輸入流載入檔案進記憶體
		3.指定response的響應頭:content-disposition:attachment;filename=xxx
		4.將資料寫出到response輸出流。
* 問題:
	* 中文檔案問題   中文檔名中中文不顯示
		* 解決思路:
			1.獲取客戶端使用的瀏覽器版本資訊
			2.根據不同的版本資訊,設定filename的編碼方式不同。

給定檔名稱,獲取在HTTP協議中需要指定的型別的程式碼演示

獲取檔案的真實路徑的程式碼演示

載入工具類後解決中文檔名問題的程式碼演示

使用字元,位元組編碼的程式碼演示

手動拼接

響應體格式的程式碼演示

檔案下載的程式碼演示

驗證碼程式碼的中間部分的程式碼演示

驗證碼的程式碼演示

驗證碼迴圈獲取表內容的程式碼演示

重定向的程式碼演示

重定向中動態獲取虛擬目錄