HttpServletResponse ServletResponse 返回響應 設置響應頭設置響應正文體 重定向 常用方法 如何重定向 響應編碼 響應亂碼


image_5b67aaa7_10ac
HttpServletResponse  和 ServletResponse  都是接口
具體的類型對象是由Servlet容器傳遞過來

 
ServletResponse對象的功能分為以下四種:
        設置響應頭信息;
        發送狀態碼;
        設置響應正文;
        重定向;
 
 
設置響應頭信息
HttpServletResponse 中 (ServletResponse 中沒有的)

void setHeader(String var1, String var2);

使用該方法設置的響應頭最終會發送給客戶端瀏覽器
示例:

response.setHeader(“content-type”, “text/html;charset=utf-8”);

設置content-type響應頭,該頭的作用是:
  1. 告訴瀏覽器響應內容為html類型,編碼為utf-8。
  2. 而且同時會設置response的字符流編碼為utf-8,即response.setCharaceterEncoding(“utf-8”);

自動跳轉

response.setHeader("Refresh","5; URL=http://www.baidu.com");

5秒后自動跳轉到百度。
 
 
 
發送狀態碼以及類型
 

response.setContentType("text/html;charset=utf-8");

//等同與調用response.setHeader(“content-type”, “text/html;charset=utf-8”);
 

response.setCharacterEncoding(“utf-8”);//設置字符響應流的字符編碼為utf-8;

response.setStatus(200);//設置狀態碼;

response.sendError(404, “您要查找的資源不存在”);//當發送錯誤狀態碼時,Tomcat會跳轉到固定的錯誤頁面去,但可以顯示錯誤信息。

比如:
response.sendError(404, "您要查找的資源不存在了哈");
image_5b67aaa7_3a5
 
 
 
設置響應正文

ServletResponse是響應對象,向客戶端輸出響應正文(響應體)可以使用ServletResponse的響應流
repsonse一共提供了兩個響應流對象:
        PrintWriter out = response.getWriter():獲取字符流;
        ServletOutputStream out = response.getOutputStream():獲取字節流;
兩個方法都是ServletResponse的 HttpServletResponse繼承而得到
 
注意:
  1. 當然,如果響應正文內容為字符,那么使用response.getWriter()
  2. 如果響應內容是字節,那么可以使用response.getOutputStream()  例如下載時
在一個請求中,不能同時使用這兩個流!
也就是說,要么你使用repsonse.getWriter(),要么使用response.getOutputStream(),但不能同時使用這兩個流。
不然會拋出IllegalStateException異常。
 
 
image_5b67aaa7_d90image_5b67aaa7_7bd
 
 
字符編碼

在使用response.getWriter()時需要注意默認字符編碼為ISO-8859-1,
如果希望設置字符流的字符編碼為utf-8
可以使用
response.setCharaceterEncoding(“utf-8”)來設置。
這樣可以保證輸出給客戶端的字符都是使用UTF-8編碼的!
 
但客戶端瀏覽器並不知道響應數據是什么編碼的!
如果希望通知客戶端使用UTF-8來解讀響應數據,那么還是使用
response.setContentType("text/html;charset=utf-8")方法比較好
因為這個方法不只會調用response.setCharaceterEncoding(“utf-8”),還會設置content-type響應頭
客戶端瀏覽器會使用content-type頭來解讀響應數據。
 
 

緩沖區

response.getWriter()PrintWriter類型,所以它有緩沖區,緩沖區的默認大小為8KB

也就是說,在響應數據沒有輸出8KB之前,數據都是存放在緩沖區中,而不會立刻發送到客戶端。

Servlet執行結束后,服務器才會去刷新流,使緩沖區中的數據發送到客戶端。

如果希望響應數據馬上發送給客戶端:

   向流中寫入大於8KB的數據;

   調用response.flushBuffer()方法來手動刷新緩沖區;

 

重定向
 
當你訪問A網址時,你會發現瀏覽器地址欄URL變成了B ,這就是重定向
所謂重定向,就是服務器重新定位你的方向,告訴你去別的地方
是再次的發出了請求,全程總共有兩個請求
image_5b67aaa7_5016
 
第一步就是設置響應碼為302。
響應碼為200表示響應成功,而響應碼為302表示重定向,你需要告訴瀏覽器需要重定向
第二步設置重定向的URL
因為重定向是通知瀏覽器再第二個請求,所以瀏覽器需要知道第二個請求的URL
所以完成重定向的第二步是設置Location頭,指定第二個請求的URL地址。
 
response.setStatus(302);
response.setHeader("Location", "https://www.cnblogs.com/noteless/");
你會發現地址欄立刻進行了跳轉
 
重定向的簡化方式:

response.sendRedirect("https://www.cnblogs.com/noteless/");
 
如果是在同一台服務器上也可以用相對路徑  
response.sendRedirect("/servlet/ServletB");
 
效果同上
 
重定向注意點:
 
        重定向是兩次請求;
        重定向的URL可以是其他應用,不局限於當前應用;
        重定向的響應頭為302,並且必須要有Location響應頭;
        重定向就不要再使用response.getWriter()或response.getOutputStream()輸出數據,不然可能會出現異常;
 
 

 
 
 
 
 


免責聲明!

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



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