HttpServletResponse 和 ServletResponse 都是接口
具體的類型對象是由Servlet容器傳遞過來
ServletResponse對象的功能分為以下四種:
設置響應頭信息;
發送狀態碼;
設置響應正文;
重定向;
設置響應頭信息
HttpServletResponse 中 (ServletResponse 中沒有的)
void setHeader(String var1, String var2);
使用該方法設置的響應頭最終會發送給客戶端瀏覽器
示例:
response.setHeader(“content-type”, “text/html;charset=utf-8”);
設置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;
response.setStatus(200);//設置狀態碼;
response.sendError(404, “您要查找的資源不存在”);//當發送錯誤狀態碼時,Tomcat會跳轉到固定的錯誤頁面去,但可以顯示錯誤信息。
比如:
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頭來解讀響應數據。
緩沖區
response.getWriter()是PrintWriter類型,所以它有緩沖區,緩沖區的默認大小為8KB。
也就是說,在響應數據沒有輸出8KB之前,數據都是存放在緩沖區中,而不會立刻發送到客戶端。
當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()輸出數據,不然可能會出現異常;