1. HttpServletResponse概述
在創(chuàng)建Servlet時(shí)會(huì)覆蓋service()方法,或doGet()/doPost(),這些方法都有兩個(gè)參數(shù)斜筐,一個(gè)為代表請(qǐng)求的request和代表響應(yīng)response轨功。
service方法中的response的類型是ServletResponse丰辣,而doGet/doPost方法的response的類型是HttpServletResponse乍恐,HttpServletResponse是ServletResponse的子接口默蚌,功能和方法更加強(qiáng)大,今天我們學(xué)習(xí)HttpServletResponse漱办。
2. response的運(yùn)行流程
3. 通過(guò)抓包工具抓取Http響應(yīng)
象分別設(shè)置Http響應(yīng)的響應(yīng)行,響 應(yīng)頭和響應(yīng)體
4. 通過(guò)response設(shè)置響應(yīng)行
設(shè)置響應(yīng)行的狀態(tài)碼
setStatus(int sc)
5. 通過(guò)response設(shè)置響應(yīng)頭
addHeader(Stringname, String value)
addIntHeader(String name, int value)
addDateHeader(String name, long date)
setHeader(Stringname, String value)
setDateHeader(String name, long date)
setIntHeader(String name, int value)
其中娩井,add表示添加暇屋,而set表示設(shè)置
6. 通過(guò)response設(shè)置響應(yīng)體
- 響應(yīng)體設(shè)置文本
PrintWriter getWriter()
獲得字符流,通過(guò)字符流的write(String s)方法可以將字符串設(shè)置到response 緩沖區(qū)中洞辣,隨后Tomcat會(huì)將response緩沖區(qū)中的內(nèi)容組裝成Http響應(yīng)返回給瀏覽器端咐刨。
- 關(guān)于設(shè)置中文的亂碼問(wèn)題
原因:response緩沖區(qū)的默認(rèn)編碼是iso8859-1,此碼表中沒(méi)有中文扬霜,可以通過(guò) response的:
setCharacterEncoding(String charset)
設(shè)置response的編碼
但我們發(fā)現(xiàn)客戶端還是不能正常顯示文字
原因:我們將response緩沖區(qū)的編碼設(shè)置成UTF-8定鸟,但瀏覽器的默認(rèn)編碼是本地系統(tǒng)的編碼,因?yàn)槲覀兌际侵形南到y(tǒng)著瓶,所以客戶端瀏覽器的默認(rèn)編碼是GBK联予,我們可以手動(dòng)修改瀏覽器的編碼是UTF-8。
我們還可以在代碼中指定瀏覽器解析頁(yè)面的編碼方式材原,
通過(guò)response的
setContentType(String type)
方法指定頁(yè)面解析時(shí)的編碼是UTF-8
response.setContentType("text/html;charset=UTF-8");
上面的代碼不僅可以指定瀏覽器解析頁(yè)面時(shí)的編碼躯泰,同時(shí)也內(nèi)含 setCharacterEncoding的功能,所以在實(shí)際開發(fā)中只要編寫
response.setContentType("text/html;charset=UTF-8");
就可以解決頁(yè)面輸出中文亂碼問(wèn)題华糖。
- 響應(yīng)頭設(shè)置字節(jié)
ServletOutputStream getOutputStream()
獲得字節(jié)流麦向,通過(guò)該字節(jié)流的write(byte[] bytes)可以向response緩沖區(qū)中寫入字 節(jié),在由Tomcat服務(wù)器將字節(jié)內(nèi)容組成Http響應(yīng)返回給瀏覽器客叉。
7. 案例-完成文件下載
文件下載的實(shí)質(zhì)就是文件拷貝诵竭,將文件從服務(wù)器端拷貝到瀏覽器端。所以文件下載需要IO技術(shù)將服務(wù)器端的文件使用InputStream讀取到兼搏,在使用 ServletOutputStream寫到response緩沖區(qū)中
代碼如下:
上述代碼可以將圖片從服務(wù)器端傳輸?shù)綖g覽器卵慰,但瀏覽器直接解析圖片顯示在頁(yè)面上, 而不是提供下載佛呻,我們需要設(shè)置兩個(gè)響應(yīng)頭裳朋,告知瀏覽器文件的類型和文件的打開方 式。
- 1.告知瀏覽器文件的類型:response.setContentType(文件的MIME類型);
- 2.告示瀏覽器文件的打開方式是下載:
response.setHeader("Content-Disposition","attachment;filename=文件名稱");
代碼如下:
但是吓著,如果下載中文文件鲤嫡,頁(yè)面在下載時(shí)會(huì)出現(xiàn)中文亂碼或不能顯示文件名的情況, 原因是不同的瀏覽器默認(rèn)對(duì)下載文件的編碼方式不同绑莺,ie是UTF-8編碼方式暖眼,而火狐 瀏覽器是Base64編碼方式。所里這里需要解決瀏覽器兼容性問(wèn)題纺裁,解決瀏覽器兼容 性問(wèn)題的首要任務(wù)是要辨別訪問(wèn)者是ie還是火狐(其他)诫肠,通過(guò)Http請(qǐng)求體中的一 個(gè)屬性可以辨別
解決亂碼方法如下:
if (agent.contains("MSIE")) {
// IE瀏覽器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐瀏覽器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?"+ base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它瀏覽器
filename = URLEncoder.encode(filename, "utf-8");
}
其中agent就是請(qǐng)求頭User-Agent的值