response是Servlet.service方法的一個(gè)參數(shù),類型為javax.servlet.http.HttpServletResponse。在客戶端發(fā)出每個(gè)請求時(shí),服務(wù)器都會(huì)創(chuàng)建一個(gè)response對象,并傳入給Servlet.service()方法。response對象是用來對客戶端進(jìn)行響應(yīng)的,這說明在service()方法中使用response對象可以完成對客戶端的響應(yīng)工作。
response對象的功能分為以下四種:
l 設(shè)置響應(yīng)頭信息;
l 發(fā)送狀態(tài)碼;
l 設(shè)置響應(yīng)正文;
l 重定向;
response是響應(yīng)對象,向客戶端輸出響應(yīng)正文(響應(yīng)體)可以使用response的響應(yīng)流,repsonse一共提供了兩個(gè)響應(yīng)流對象:
l PrintWriter out = response.getWriter():獲取字符流;
l ServletOutputStream out = response.getOutputStream():獲取字節(jié)流;
當(dāng)然,如果響應(yīng)正文內(nèi)容為字符,那么使用response.getWriter(),如果響應(yīng)內(nèi)容是字節(jié),例如下載時(shí),那么可以使用response.getOutputStream()。
注意,在一個(gè)請求中,不能同時(shí)使用這兩個(gè)流!也就是說,要么你使用repsonse.getWriter(),要么使用response.getOutputStream(),但不能同時(shí)使用這兩個(gè)流。不然會(huì)拋出IllegalStateException異常。
2.1 字符響應(yīng)流
l 字符編碼
在使用response.getWriter()時(shí)需要注意默認(rèn)字符編碼為ISO-8859-1,如果希望設(shè)置字符流的字符編碼為utf-8,可以使用response.setCharaceterEncoding(“utf-8”)來設(shè)置。這樣可以保證輸出給客戶端的字符都是使用UTF-8編碼的!
但客戶端瀏覽器并不知道響應(yīng)數(shù)據(jù)是什么編碼的!如果希望通知客戶端使用UTF-8來解讀響應(yīng)數(shù)據(jù),那么還是使用response.setContentType("text/html;charset=utf-8")方法比較好,因?yàn)檫@個(gè)方法不只會(huì)調(diào)用response.setCharaceterEncoding(“utf-8”),還會(huì)設(shè)置content-type響應(yīng)頭,客戶端瀏覽器會(huì)使用content-type頭來解讀響應(yīng)數(shù)據(jù)。
l 緩沖區(qū)
response.getWriter()是PrintWriter類型,所以它有緩沖區(qū),緩沖區(qū)的默認(rèn)大小為8KB。也就是說,在響應(yīng)數(shù)據(jù)沒有輸出8KB之前,數(shù)據(jù)都是存放在緩沖區(qū)中,而不會(huì)立刻發(fā)送到客戶端。當(dāng)Servlet執(zhí)行結(jié)束后,服務(wù)器才會(huì)去刷新流,使緩沖區(qū)中的數(shù)據(jù)發(fā)送到客戶端。
如果希望響應(yīng)數(shù)據(jù)馬上發(fā)送給客戶端:
? 向流中寫入大于8KB的數(shù)據(jù);
? 調(diào)用response.flushBuffer()方法來手動(dòng)刷新緩沖區(qū);
可以使用response對象的setHeader()方法來設(shè)置響應(yīng)頭!使用該方法設(shè)置的響應(yīng)頭最終會(huì)發(fā)送給客戶端瀏覽器!
l response.setHeader(“content-type”, “text/html;charset=utf-8”):設(shè)置content-type響應(yīng)頭,該頭的作用是告訴瀏覽器響應(yīng)內(nèi)容為html類型,編碼為utf-8。而且同時(shí)會(huì)設(shè)置response的字符流編碼為utf-8,即response.setCharaceterEncoding(“utf-8”);
l response.setHeader("Refresh","5; URL=http://www.itcast.cn"):5秒后自動(dòng)跳轉(zhuǎn)到傳智主頁。
l response.setContentType("text/html;charset=utf-8"):等同與調(diào)用response.setHeader(“content-type”, “text/html;charset=utf-8”);
l response.setCharacterEncoding(“utf-8”):設(shè)置字符響應(yīng)流的字符編碼為utf-8;
l response.setStatus(200):設(shè)置狀態(tài)碼;
l response.sendError(404, “您要查找的資源不存在”):當(dāng)發(fā)送錯(cuò)誤狀態(tài)碼時(shí),Tomcat會(huì)跳轉(zhuǎn)到固定的錯(cuò)誤頁面去,但可以顯示錯(cuò)誤信息。
5.1 什么是重定向
當(dāng)你訪問http://www.sun.com時(shí),你會(huì)發(fā)現(xiàn)瀏覽器地址欄中的URL會(huì)變成http://www.oracle.com/us/sun/index.htm,這就是重定向了。
重定向是服務(wù)器通知瀏覽器去訪問另一個(gè)地址,即再發(fā)出另一個(gè)請求。
5.2 完成重定向
響應(yīng)碼為200表示響應(yīng)成功,而響應(yīng)碼為302表示重定向。所以完成重定向的第一步就是設(shè)置響應(yīng)碼為302。
因?yàn)橹囟ㄏ蚴峭ㄖ獮g覽器再第二個(gè)請求,所以瀏覽器需要知道第二個(gè)請求的URL,所以完成重定向的第二步是設(shè)置Location頭,指定第二個(gè)請求的URL地址。
public class AServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setStatus(302); response.setHeader("Location", "http://www.itcast.cn"); } } |
上面代碼的作用是:當(dāng)訪問AServlet后,會(huì)通知瀏覽器重定向到傳智主頁。客戶端瀏覽器解析到響應(yīng)碼為302后,就知道服務(wù)器讓它重定向,所以它會(huì)馬上獲取響應(yīng)頭Location,然發(fā)出第二個(gè)請求。
5.3 便捷的重定向方式
public class AServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.sendRedirect("http://www.itcast.cn"); } } |
response.sendRedirect()方法會(huì)設(shè)置響應(yīng)頭為302,以設(shè)置Location響應(yīng)頭。
如果要重定向的URL是在同一個(gè)服務(wù)器內(nèi),那么可以使用相對路徑,例如:
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 重定向小結(jié)
l 重定向是兩次請求;
l 重定向的URL可以是其他應(yīng)用,不局限于當(dāng)前應(yīng)用;
l 重定向的響應(yīng)頭為302,并且必須要有Location響應(yīng)頭;
l 重定向就不要再使用response.getWriter()或response.getOutputStream()輸出數(shù)據(jù),不然可能會(huì)出現(xiàn)異常;
聯(lián)系客服