Servlet 入門 2
阿新 • • 發佈:2022-02-12
HTTP協議2
響應訊息
- 請求訊息:
a) 請求行
b) 請求頭
c) 請求空行
d) 請求體 - 響應訊息
- a) 響應行
1.組成:協議/版本 響應狀態碼 狀態碼描述
2.響應狀態碼:伺服器告訴客戶端瀏覽器本次請求和響應的狀態- 狀態碼都是3位數字;
- 分類:5類
1xx: 伺服器接收客戶端訊息,但沒有接收完成;等待一段時間後傳送
2xx:成功。
3xx:重定向。代表:302重定向;304資源沒有更改,訪問本地快取
4xx:客戶端錯誤。
代表:404:請求路徑沒有對應資源
405:請求方式沒有對應的doXxx方法
5xx:伺服器錯誤 500:伺服器內部出現異常
- b) 響應頭
- 格式: 頭名稱:值
- 常見的響應頭:
- content-Type:伺服器告訴客戶端本次響應體資料格式以及編碼格式
- content-disposition:以什麼格式開啟響應體資料
值:in-line:預設值,在當前頁面內開啟
Attachment;filename=xxx:以附件形式開啟響應體,檔案下載
- c) 響應空行
- d) 響應體
傳送的資料,網頁等
Response物件
- 功能:設定響應訊息
- 設定響應行
格式:HTTP/1.1 200 OK
設定狀態碼:setStatus(int sc) - 設定響應頭 setHeader(string name,string value)
- 設定響應體
- 設定響應行
- 使用步驟:
- 獲取輸出流:
字元輸出流:PrintWriter getWriter()
位元組輸出流 ServletOutputStream getOutputStream()
- 使用輸出流,將資料輸出到客戶端瀏覽器
案例:
- 重定向
資源跳轉的方式 - 程式碼實現:
a) 告訴客戶端重定向,給狀態碼302
Response.serStatus (302)
b) 告訴客戶端跳轉資源的路徑,通過響應頭location來設定跳轉資源的路徑
Response.serHeader(“location”,”/day15/responseDemo2”)
c) 簡單的重定向方法
Response.sendRedirect(”/day15/responseDemo2”) - 重定向redirect的特點:
- 位址列發生變化
- 轉發可以訪問其他站點的資源
- 是兩次請求,不能使用request共享資料
- 轉發forward的特點:
- 轉發位址列路徑不變
- 只能訪問當前伺服器下的資源
- 轉發是一次請求,使用request物件共享資料
- 路徑寫法:
- 路徑分類:
- 相對路徑:通過相對路徑不可以確定唯一資源
- 不以/開頭,以.開頭 如./h.html 指當前目錄下 (./可以省略)
- 規則:找到當前資源和目標資源的相對位置關係
- ./ 當前目錄
- ../ 後退一級目錄
- 絕對路徑:
通過絕對路徑可以確定唯一資源/day15/demo2
- 相對路徑:通過相對路徑不可以確定唯一資源
- 書寫規則:判斷定義的路徑給誰用?判斷請求將來從哪兒發出?
- 給客戶端用:需要加虛擬目錄(專案的訪問路徑)
- 給伺服器用:不需加虛擬目錄
- 動態獲取虛擬目錄:
String contextPath = request.getContextPath();
取代day15,考慮程式碼更改節省工作量
- 路徑分類:
- 伺服器輸出字元資料到瀏覽器
一般文字輸出用,步驟:- 獲取流物件之前,設定流的預設編碼:(有了第2步,可以省略)
Response.setCharacterEncoding(“GBK”)
- (亂碼問題)告訴瀏覽器,伺服器傳送訊息體資料的編碼,建議瀏覽器使用該編碼解碼
Response.setHeader(“content-type”,”text/html;charset=utf-8”)編碼要與上面設定一致
簡單設定編碼方法:
Response.setContentType(“text/html;charset=utf-8”) - 獲取字元輸出流
PrintWriter pw = response.getWriter() - 輸出資料
Pw.write(“string”)
- 獲取流物件之前,設定流的預設編碼:(有了第2步,可以省略)
- 伺服器輸出位元組資料到瀏覽器
一般寫圖片等格式用,步驟:
1.(亂碼問題)告訴瀏覽器,伺服器傳送訊息體資料的編碼,建議瀏覽器使用該編碼解碼
Response.setHeader(“content-type”,”text/html;charset=utf-8”)
2.獲取位元組輸出流
ServletOutputStream sos = response.getOutputStream()
3.輸出資料
Sos.write(“hello”.getBytes(“utf-8”)) - 驗證碼
- 本質:圖片
- 目的:防止惡意表單註冊
- 步驟:
- 建立物件,在記憶體中圖片(驗證碼圖片物件)
Int width,height = 100,50
BufferedIamge image = new BufferedImage(width,height,BufferedImage.Type_INT_RGB)
- 美化圖片
2.1 填充背景色
Graphics g=image.getGraphis() //畫筆物件
g.setColor(Color,PINK);設定畫筆顏色
g.fillRect(0,0,width,height)
2.2 畫邊框
g. setColor(Color,BLUE);設定畫筆顏色
g.drawRect(0,0,width-1,height-1)
2.3 寫驗證碼
String str=”ABCDEFG。。abc。789”
Random ran = new Random();
For(int i=1;i<=4;i++){
Int index = ran.nextint(str.length())//設定最大值str.length()
Char c = str.charAt(index);//隨機字元
g.drawstring(c + “”,width/5*i,height/2)
}
2.4 畫干擾線
g. setColor(Color,GREEN);設定畫筆顏色
//隨機生成座標點
For(int i=0;i<=10;i++){
Int x1 = ran.nextint(width)
Int x2 = ran.nextint(width)
Int y1 = ran.nextint(width)
Int y2 = ran.nextint(width)
g.drawline(x1,y1,x2,y2)
} - 將圖片輸出到頁面展示
ImageIO.write(image,”jpg”,response.getOutputStream());
- 建立物件,在記憶體中圖片(驗證碼圖片物件)
ServletContext物件
- 概念:代表整個web應用,可以和程式的容器(伺服器)通訊
- 獲取:
a) 通過request物件獲取request.getServletContext()
b) 通過HTTPServlet來獲取this.getServletContext() - 功能:
a) 獲取MIME型別
- MIME型別:在網際網路通訊過程中定義的一種檔案資料型別
- 格式:大型別/小型別 text/html image/jpeg
- 獲取:string getMimeType(string file)
b) 域物件:共享資料
1. setAttribute(string name,object value)
2. getAttribute(string name)
3. removeAttribute(string name)
ServletContext物件範圍:所有使用者所有請求的資料
c) 獲取檔案的真實(伺服器)路徑
1.方法 getRealPath(“string path”) - 檔案下載案例:
- 案例目標:
- 頁面顯示超連結
- 點選超連結後彈出下載提示框
- 完成圖片檔案下載
- 分析:
- 超連結指向的資源如果能夠被瀏覽器解析,則在瀏覽器中展示;如果不能解析,則彈出下載提示框;不滿足上述要求;
- 任何資源都彈出下載提示框
- 使用響應頭設定資源的開啟方式
Content-disposition:attachment;filename=xxx
- 步驟
- 定義頁面,編輯超連結href屬性,指向servlet,傳遞資源引數filename
- 定義servlet
1.獲取檔名稱
2.使用位元組輸入流載入檔案進記憶體 - 指定response響應頭Content-disposition:attachment;filename=xxx
- 將資料寫出到response輸出流
- 案例目標: