1. 程式人生 > 實用技巧 >Servlet中Response的用法和API

Servlet中Response的用法和API

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;
}