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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM