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響應頭,該頭的做用是:
- 告訴瀏覽器響應內容爲html類型,編碼爲utf-8。
- 並且同時會設置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繼承而獲得
注意:
- 固然,若是響應正文內容爲字符,那麼使用response.getWriter()
- 若是響應內容是字節,那麼可使用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
因此完成重定向的第二步是設置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()輸出數據,否則可能會出現異常;