- response是在請(qǐng)求網(wǎng)址時(shí)候和request一起創(chuàng)建好的只不過(guò)是空的月腋,在doget方法中寫入返回的數(shù)據(jù)(寫給的是response,之后toncat將響應(yīng)行響應(yīng)頭一起和數(shù)據(jù)封裝成返回給客戶端的響應(yīng))
- 302是為了代碼重定向使用的?重定向請(qǐng)求一次以上服務(wù)器
5秒之后跳轉(zhuǎn)到百度:不常用因?yàn)槭欠?wù)器端寫死頁(yè)面不會(huì)有動(dòng)態(tài)效果
response.setHeader("refresh", "5,url=http://www.baidu.com");
html等輔助輸入提示
繼續(xù)打開(kāi)web→html Files→Editor→Content Assist
修改Prompt when these characters are inserted:<=.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW
js 類似值 :.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW寫圖片先有字節(jié)輸入流需要去讀圖片(絕對(duì)地址用相對(duì)地址去獲得)缰趋,寫時(shí)候用快速方法byte【1024】总放,while((len=in.read(byte))>0){out.write(byte,0,len)}
1.響應(yīng)的response的運(yùn)行流程
- 因?yàn)閞esponse代表響應(yīng),所以我們可以通過(guò)該對(duì)象分別設(shè)置Http響應(yīng)的響應(yīng)行谷浅,響 應(yīng)頭和響應(yīng)體
- 通過(guò)response設(shè)置響應(yīng)行
設(shè)置響應(yīng)行的狀態(tài)碼
setStatus(int sc) - 通過(guò)response設(shè)置響應(yīng)頭(add增加扒俯,set覆蓋)
addHeader(String name, String value)
addIntHeader(String name, int value)
addDateHeader(String name, long date)
setHeader(String name, String value) ***
setDateHeader(String name, long date)
setIntHeader(String name, int value)
- 通過(guò)response設(shè)置響應(yīng)體
(1)響應(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í)際開(kāi)發(fā)中只要編寫 response.setContentType("text/html;charset=UTF-8");就可以解決頁(yè)面輸出中文亂碼問(wèn)題站削。
(2)響應(yīng)頭設(shè)置字節(jié)
ServletOutputStream getOutputStream()
獲得字節(jié)流坊萝,通過(guò)該字節(jié)流的write(byte[] bytes)可以向response緩沖區(qū)中寫入字 節(jié),在由Tomcat服務(wù)器將字節(jié)內(nèi)容組成Http響應(yīng)返回給瀏覽器许起。
2.文件下載
-----------重定向路徑----
設(shè)置兩個(gè)頭
// 設(shè)置狀態(tài)碼302
// response.setStatus(302);
// 重定向路徑
// response.setHeader("Location", "/web14/servlet2");
// 效果一樣
// response.sendRedirect( "/web14/servlet2");
//5秒后跳轉(zhuǎn)
response.setHeader("refresh", "5,url=http://www.baidu.com");
-------亂碼問(wèn)題產(chǎn)生-------
有兩方面:tomcat讀取時(shí)候和讀取完客戶端展示時(shí)候
// 告訴tomcat存時(shí)候要utf-8
response.setCharacterEncoding("UTF-8");
// 告訴瀏覽器取時(shí)候要utf-8十偶,僅這一句就可以讓tomcat存時(shí)候也用u8
//response.setHeader("content-Type", "text/html;charset=utf-8");
//等同于
//response.setContentType( "text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write("你好");
----------相當(dāng)于上傳圖片瀏覽器展示---------------
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 使用response獲得字節(jié)輸出流
ServletOutputStream out = response.getOutputStream();
// 獲得文件字節(jié)流
String path = getServletContext().getRealPath("a.jpg");
FileInputStream in = new FileInputStream(path);
int len = 0;
byte[] butter = new byte[1024];
while ((len = in.read(butter)) > 0) {
out.write(butter, 0, len);
}
in.close();
out.close();
}
-------------下載文件---------
----展示的下載頁(yè)面-------
<a href="/web14/fileDownload?filename=a.flv">a.flv</a><br>
參數(shù)filename讓response獲取到文件名字
fileDownload是xml中url
----xml------
<servlet-mapping>
<servlet-name>FileDownload</servlet-name>
<url-pattern>/fileDownload</url-pattern>
</servlet-mapping>
--------servlet-------
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
主要修改兩個(gè)頭ContentType和Content-Disposition
// 從html的參數(shù)或取名字
String name = request.getParameter("filename");
// 告訴瀏覽器下載文件的類型參數(shù)是從全局web.xml中的mime類型轉(zhuǎn)化
// response.setContentType(this.getServletContext().getMimeType(name));
// 告訴瀏覽器要附件下載而不是解開(kāi)
response.setHeader("Content-Disposition", "attachment;filename=" + name);
FileInputStream in = new FileInputStream(this.getServletContext().getRealPath("download/" + name));
ServletOutputStream out = response.getOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
out.close();// out是response獲取會(huì)自動(dòng)被關(guān)閉
}
- 1)告知瀏覽器文件的類型:response.setContentType(文件的MIME類型);(不寫也可以?)
- 2)告示瀏覽器文件的打開(kāi)方式是下載:
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è)屬性可以辨別其中agent就是請(qǐng)求頭User-Agent的值
- 也就是在tomcat識(shí)別時(shí)候轉(zhuǎn)成u8(new String(filename.getBytes("ISO8859-1"), "UTF-8")),在客戶端識(shí)別之前根據(jù)不同客戶端以不同形式轉(zhuǎn)碼(if (agent.contains("MSIE")) {)
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// *******文件名稱是中文的下載*******
// 獲得要下載的文件的名稱
String filename = request.getParameter("filename");// ????.jpg
// 解決獲得中文參數(shù)的亂碼----
filename = new String(filename.getBytes("ISO8859-1"), "UTF-8");// 美女.jpg
// 獲得請(qǐng)求頭中的User-Agent
String agent = request.getHeader("User-Agent");
// 根據(jù)不同瀏覽器進(jìn)行不同的編碼
String filenameEncoder = "";
if (agent.contains("MSIE")) {
// IE瀏覽器
filenameEncoder = URLEncoder.encode(filename, "utf-8");
filenameEncoder = filenameEncoder.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐瀏覽器
BASE64Encoder base64Encoder = new BASE64Encoder();
filenameEncoder = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它瀏覽器
filenameEncoder = URLEncoder.encode(filename, "utf-8");
}
// 要下載的這個(gè)文件的類型-----客戶端通過(guò)文件的MIME類型去區(qū)分類型 response.setContentType(this.getServletContext().getMimeType(filename));
// 告訴客戶端該文件不是直接解析 而是以附件形式打開(kāi)(下載)----filename="+filename 客戶端默認(rèn)對(duì)名字進(jìn)行解碼
response.setHeader("Content-Disposition", "attachment;filename=" + filenameEncoder);
// 獲取文件的絕對(duì)路徑原來(lái)中文名字否則找不到
String path = this.getServletContext().getRealPath("download/" + filename);
// 獲得該文件的輸入流
InputStream in = new FileInputStream(path);
// 獲得輸出流---通過(guò)response獲得的輸出流 用于向客戶端寫內(nèi)容
ServletOutputStream out = response.getOutputStream();
// 文件拷貝的模板代碼
int len = 0;
byte[] buffer = new byte[1024];
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
// out.close();
}
- //response.getOutputStream();
//response.getWriter();全局可以認(rèn)為兩種是一個(gè)不可以同時(shí)寫(就算有多個(gè)servlet) - 默認(rèn)重定向就是編碼結(jié)束時(shí)候