layout: post
title: HttpServletResponse
subtitle: 用法
date: 2018-04-16
author: ZL
header-img: img/20180416.jpg
catalog: true
tags:
- Response
- web文件下載
HttpServletResponse
所有的doget和dopost方法都會(huì)有request和response參數(shù)。
response和request

瀏覽器的請(qǐng)求進(jìn)過(guò)tomcat內(nèi)部處理,被封裝成一個(gè)request參數(shù),放到了doget和dopost里面。
而response需要用戶在doget或者dopost的代碼里面為response添加內(nèi)容,然后tomcat內(nèi)部將這些內(nèi)容封裝好返回給瀏覽器。
原理性內(nèi)容不看也罷

因?yàn)閞esponse代表響應(yīng),所以我們可以通過(guò)該對(duì)象分別設(shè)置Http響應(yīng)的響應(yīng)行,響 應(yīng)頭和響應(yīng)體
response的一些API
設(shè)置響應(yīng)行的狀態(tài)碼
setStatus(int sc)-
通過(guò)response設(shè)置響應(yīng)頭
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)
add表示添加,而set表示設(shè)置這個(gè)頭的條目除了它自帶的比如Content-Length,自己也可以隨便加比如addHeader(“name”, “zhangsan”),addHeader(“age”, “12”)等等
add表示添加,比如addHeader(“name”, “zhangsan”),addHeader(“name”, “l(fā)isi”),這樣得到的response里面的name既有zhangsan也有l(wèi)isi。而set表示修改,會(huì)把之前的內(nèi)容覆蓋而不是共存。 -
設(shè)置響應(yīng)體
getWriter、getOutputStream()這兩個(gè)方法不能同時(shí)調(diào)用,否則會(huì)報(bào)錯(cuò)
設(shè)置本地response編碼
response.setCharacterEncoding("UTF-8");告訴瀏覽器使用何種編碼解析
//通過(guò)一個(gè)頭 Content-Type 告知客戶端使用何種碼表
response.setHeader("Content-Type", "text/html;charset=UTF-8");上面兩句代碼的結(jié)合(既設(shè)置response的編碼格式,又可以告知瀏覽器解析格式,所以通常不用上面兩句代碼,而是用這一句)
response.setContentType("text/html;charset=UTF-8");-
重定向
-
方式一:
//告知客戶端去重定向到servlet2 //1、設(shè)置狀態(tài)碼302 response.setStatus(302); //2、設(shè)置響應(yīng)頭Location response.setHeader("Location", "/WEB14/servlet2"); -
方式二:
//封裝成一個(gè)重定向的方法sendRedirect(url) response.sendRedirect("/WEB14/servlet2");
-
定時(shí)刷新(延時(shí)重定向)
//設(shè)置定時(shí)刷新的頭(5秒后跳轉(zhuǎn)百度)
response.setHeader("refresh", "5;url=http://www.baidu.com");
下載文件的例子
-
下載名稱沒(méi)有中文的文件
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲得要下載的文件的名稱 String filename = request.getParameter("filename");//a.flv //要下載的這個(gè)文件的類型-----客戶端通過(guò)文件的MIME類型去區(qū)分類型 response.setContentType(this.getServletContext().getMimeType(filename)); //告訴客戶端該文件不是直接解析 而是以附件形式打開(kāi)(下載) response.setHeader("Content-Disposition", "attachment;filename="+filename); //獲取文件的絕對(duì)路徑 String path = this.getServletContext().getRealPath("download/"+filename); //獲得該文件的輸入流 InputStream in = new FileInputStream(path); //獲得輸出流---通過(guò)response獲得的輸出流 用于向客戶端寫(xiě)內(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(); } -
下載包含中文名稱的文件
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ì)路徑 String path = this.getServletContext().getRealPath("download/"+filename); //獲得該文件的輸入流 InputStream in = new FileInputStream(path); //獲得輸出流---通過(guò)response獲得的輸出流 用于向客戶端寫(xiě)內(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(); }