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

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

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

void setHeader(String var1, String var2);html

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

response.setHeader(「content-type」, 「text/html;charset=utf-8」);web

設置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;less

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

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

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

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

在使用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頭來解讀響應數據。
 
 

緩衝區 htm

response.getWriter()是PrintWriter類型,因此它有緩衝區,緩衝區的默認大小爲8KB。 對象

也就是說,在響應數據沒有輸出8KB以前,數據都是存放在緩衝區中,而不會馬上發送到客戶端。 blog

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

若是但願響應數據立刻發送給客戶端:

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

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

 

重定向
 
當你訪問A網址時,你會發現瀏覽器地址欄URL變成了B ,這就是重定向
所謂重定向,就是服務器從新定位你的方向,告訴你去別的地方
是再次的發出了請求,全程總共有兩個請求
 
 
第一步就是設置響應碼爲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()輸出數據,否則可能會出現異常;
相關文章
相關標籤/搜索