**伺服器的迴應_ Response [web基礎day15] *
阿新 • • 發佈:2019-01-02
今日內容
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的編碼方式不同。