1.概述
--response對象表示web服務器給瀏覽器返回的響應信息
--作用:開發人員可以使用response對象的方法,設置要返回給瀏覽器的響應信息
2.Response體系結構
ServletResponse 接口 | HttpServletResponse 接口 | org.apache.catalina.connector.ResponseFacade 實現類(由tomcat提供的)
3.設置Http響應消息
--響應行
* 格式 協議/版本號 狀態碼 * 例如 HTTP/1.1 200 * API 1.設置狀態碼 void setStatus(int sc)
--響應頭
* 格式 響應頭名稱:響應頭的值 * 例如 Location:http://www.itcast.cn * API 1.設置指定名稱響應頭的值 void setHeader(String name,String value)
--響應體
* API(輸出流對象) 1.字符輸出流 PrintWriter getWriter() 2.字節輸出流 ServletOutputStream getOutputStream() 注意:在同一個Servlet,二種輸出流不能同時使用,產生互斥
--響應重定向
方式一 // 1.設置狀態碼 response.setStatus(302); // 2.設置響應頭 response.setHeader("Location","/項目地址/資源地址"); 方式二【推薦】 // response提供了專門負責重定向的方法 response.sendRedirect("/項目地址/資源地址");
特點
1. 地址會發生改變 2. 重定向是二次請求(不能使用request來共享數據) 3. 重定向是瀏覽器行為,可以跳轉到到服務器外部資源...
--解決中文亂碼
* 方式一(了解) // 指定服務器響應中文的編碼方式 response.setCharacterEncoding("GBK"); * 方式二(掌握) // 統一服務器和客戶端的編碼方式 response.setContentType("text/html;charset=utf-8");
4.文件下載
1. 被下載文件的字節輸入流 FileInputStream 2. response字節輸出流 ServletOutputStream 3. 告知客戶端下載文件的MIME類型 Content-Type:MIME類型 4. 告知瀏覽器以附件的方式保存 Content-Disposition:attachment;filename=文件名
// 1.接收請求參數 filename String filename = request.getParameter("filename"); // 2.獲取該文件真實路徑,封裝字節輸入流 ServletContext servletContext = getServletContext(); String realPath = servletContext.getRealPath("/download/" + filename); FileInputStream in = new FileInputStream(realPath); // 3.告訴瀏覽器下載文件的MIME類型 Content-Type String mimeType = servletContext.getMimeType(filename); response.setContentType(mimeType); // 4.告訴瀏覽器以附件形式保存 Content-Disposition response.setHeader("Content-Disposition", "attachment;filename=" + filename); // 5.獲取response的字節輸出流 ServletOutputStream out = response.getOutputStream(); // 6.IO流的拷貝 byte[] b = new byte[4096]; // 4KB int len = -1; while ((len = in.read(b)) != -1) { out.write(b, 0, len); } // 7.釋放資源 out.close(); in.close();
解決不同瀏覽器兼容,傳入user-Agent請求頭信息和文件參數名
public static String getName(String agent, String filename) throws UnsupportedEncodingException { 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"); } return filename; }