Servlet中Response的用法和API
阿新 • • 發佈:2020-07-23
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; }