請求響應流程圖
1. response概述
response是Servlet.service方法的一個參數,類型為javax.servlet.http.HttpServletResponse。在客戶端發出每個請求時,服務器都會創建一個response對象,並傳入給Servlet.service()方法。response對象是用來對客戶端進行響應的,這說明在service()方法中使用response對象可以完成對客戶端的響應工作。
response對象的功能分為以下四種:
設置響應頭信息;
發送狀態碼;
設置響應正文;
重定向;
2. response響應正文
response是響應對象,向客戶端輸出響應正文(響應體)可以使用response的響應流,repsonse一共提供了兩個響應流對象:
PrintWriter out = response.getWriter():獲取字符流;
ServletOutputStream out = response.getOutputStream():獲取字節流;
當然,如果響應正文內容為字符,那么使用response.getWriter(),如果響應內容是字節,例如下載時,那么可以使用response.getOutputStream()。
注意,在一個請求中,不能同時使用這兩個流!也就是說,要么你使用repsonse.getWriter(),要么使用response.getOutputStream(),但不能同時使用這兩個流。不然會拋出IllegalStateException異常。
2.1 字符響應流
字符編碼
在使用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()方法來手動刷新緩沖區;
3. 設置響應頭信息
可以使用response對象的setHeader()方法來設置響應頭!使用該方法設置的響應頭最終會發送給客戶端瀏覽器!
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秒后自動跳轉到百度主頁。
4. 設置狀態碼及其他方法
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會跳轉到固定的錯誤頁面去,但可以顯示錯誤信息。
5. 重定向
5.1 什么是重定向
當你訪問http://www.sun.com時,你會發現瀏覽器地址欄中的URL會變成http://www.oracle.com/us/sun/index.htm,這就是重定向了。
重定向是服務器通知瀏覽器去訪問另一個地址,即再發出另一個請求。
5.2 完成重定向
響應碼為200表示響應成功,而響應碼為302表示重定向。所以完成重定向的第一步就是設置響應碼為302。
因為重定向是通知瀏覽器再第二個請求,所以瀏覽器需要知道第二個請求的URL,所以完成重定向的第二步是設置Location頭,指定第二個請求的URL地址。
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setStatus(302);[設置響應碼為302,表示重定向]
response.setHeader("Location", "http://www.baidu.com");//設置新請求的URL
}
}
上面代碼的作用是:當訪問AServlet后,會通知瀏覽器重定向到傳智主頁。客戶端瀏覽器解析到響應碼為302后,就知道服務器讓它重定向,所以它會馬上獲取響應頭Location,然發出第二個請求。
5.3 便捷的重定向方式
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.sendRedirect("http://www.baidu.com");
}
}
response.sendRedirect()方法會設置響應頭為302,以設置Location響應頭。
如果要重定向的URL是在同一個服務器內,那么可以使用相對路徑,例如:
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.sendRedirect("/hello/BServlet");
}
}
重定向的URL地址為:http://localhost:8080/hello/BServlet。
5.4 重定向小結
重定向是兩次請求;
重定向的URL可以是其他應用,不局限於當前應用;
重定向的響應頭為302,並且必須要有Location響應頭;
重定向就不要再使用response.getWriter()或response.getOutputStream()輸出數據,不然可能會出現異常;
原文鏈接:https://blog.csdn.net/qq_33442160/article/details/81711386