JSP內置對象request和response_第1頁
JSP內置對象request和response_第2頁
JSP內置對象request和response_第3頁
JSP內置對象request和response_第4頁
JSP內置對象request和response_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、請求響應流程圖response1 response概述response是Servlet.service方法的一個參數,類型為javax.servlet.http.HttpServletResponse。在客戶端發(fā)出每個請求時,服務器都會創(chuàng)建一個response對象,并傳入給Servlet.service()方法。response對象是用來對客戶端進行響應的,這說明在service()方法中使用response對象可以完成對客戶端的響應工作。response對象的功能分為以下四種:l 設置響應頭信息;l 發(fā)送狀態(tài)碼;l 設置響應正文;l 重定向;2response響應正文response是響應對

2、象,向客戶端輸出響應正文(響應體)可以使用response的響應流,repsonse一共提供了兩個響應流對象:l PrintWriter out = response.getWriter():獲取字符流;l ServletOutputStream out = response.getOutputStream():獲取字節(jié)流;當然,如果響應正文內容為字符,那么使用response.getWriter(),如果響應內容是字節(jié),例如下載時,那么可以使用response.getOutputStream()。注意,在一個請求中,不能同時使用這兩個流!也就是說,要么你使用repsonse.getWrite

3、r(),要么使用response.getOutputStream(),但不能同時使用這兩個流。不然會拋出IllegalStateException異常。2.1字符響應流l 字符編碼在使用response.getWriter()時需要注意默認字符編碼為ISO-8859-1,如果希望設置字符流的字符編碼為utf-8,可以使用response.setCharaceterEncoding(“utf-8”)來設置。這樣可以保證輸出給客戶端的字符都是使用UTF-8編碼的!但客戶端瀏覽器并不知道響應數據是什么編碼的!如果希望通知客戶端使用UTF-8來解讀響應數據,那么還是使用response.setCont

4、entType("text/html;charset=utf-8")方法比較好,因為這個方法不只會調用response.setCharaceterEncoding(“utf-8”),還會設置content-type響應頭,客戶端瀏覽器會使用content-type頭來解讀響應數據。l 緩沖區(qū)response.getWriter()是PrintWriter類型,所以它有緩沖區(qū),緩沖區(qū)的默認大小為8KB。也就是說,在響應數據沒有輸出8KB之前,數據都是存放在緩沖區(qū)中,而不會立刻發(fā)送到客戶端。當Servlet執(zhí)行結束后,服務器才會去刷新流,使緩沖區(qū)中的數據發(fā)送到客戶端。如果希望響

5、應數據馬上發(fā)送給客戶端:Ø 向流中寫入大于8KB的數據;Ø 調用response.flushBuffer()方法來手動刷新緩沖區(qū);3設置響應頭信息可以使用response對象的setHeader()方法來設置響應頭!使用該方法設置的響應頭最終會發(fā)送給客戶端瀏覽器!l response.setHeader(“content-type”, “text/html;charset=utf-8”):設置content-type響應頭,該頭的作用是告訴瀏覽器響應內容為html類型,編碼為utf-8。而且同時會設置response的字符流編碼為utf-8,即response.setCha

6、raceterEncoding(“utf-8”);l response.setHeader("Refresh","5; URL="):5秒后自動跳轉到傳智主頁。4設置狀態(tài)碼及其他方法l response.setContentType("text/html;charset=utf-8"):等同與調用response.setHeader(“content-type”, “text/html;charset=utf-8”);l response.setCharacterEncoding(“utf-8”):設置字符響應流的字符編碼為utf-8

7、; l response.setStatus(200):設置狀態(tài)碼;l response.sendError(404, “您要查找的資源不存在”):當發(fā)送錯誤狀態(tài)碼時,Tomcat會跳轉到固定的錯誤頁面去,但可以顯示錯誤信息。5重定向5.1什么是重定向當你訪問時,你會發(fā)現瀏覽器地址欄中的URL會變成,這就是重定向了。重定向是服務器通知瀏覽器去訪問另一個地址,即再發(fā)出另一個請求。5.2完成重定向響應碼為200表示響應成功,而響應碼為302表示重定向。所以完成重定向的第一步就是設置響應碼為302。因為重定向是通知瀏覽器再第二個請求,所以瀏覽器需要知道第二個請求的URL,所以完成重定向的第二步是設置

8、Location頭,指定第二個請求的URL地址。public class AServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException response.setStatus(302);設置響應碼為302,表示重定向response.setHeader("Location", "");設置新請求的URL上面代碼的作用是:當訪問AServle

9、t后,會通知瀏覽器重定向到傳智主頁。客戶端瀏覽器解析到響應碼為302后,就知道服務器讓它重定向,所以它會馬上獲取響應頭Location,然發(fā)出第二個請求。5.3便捷的重定向方式public class AServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException response.sendRedirect("");response.sendRedirect(

10、)方法會設置響應頭為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/

11、hello/BServlet。5.4重定向小結l 重定向是兩次請求;l 重定向的URL可以是其他應用,不局限于當前應用;l 重定向的響應頭為302,并且必須要有Location響應頭;l 重定向就不要再使用response.getWriter()或response.getOutputStream()輸出數據,不然可能會出現異常;request1request概述request是Servlet.service()方法的一個參數,類型為javax.servlet.http.HttpServletRequest。在客戶端發(fā)出每個請求時,服務器都會創(chuàng)建一個request對象,并把請求數據封裝到requ

12、est中,然后在調用Servlet.service()方法時傳遞給service()方法,這說明在service()方法中可以通過request對象來獲取請求數據。request的功能可以分為以下幾種:l 封裝了請求頭數據;l 封裝了請求正文數據,如果是GET請求,那么就沒有正文;l request是一個域對象,可以把它當成Map來添加獲取數據;l request提供了請求轉發(fā)和請求包含功能。2request域方法request是域對象!在JavaWeb中一共四個域對象,其中ServletContext就是域對象,它在整個應用中只創(chuàng)建一個ServletContext對象。request其中一個

13、,request可以在一個請求中共享數據。一個請求會創(chuàng)建一個request對象,如果在一個請求中經歷了多個Servlet,那么多個Servlet就可以使用request來共享數據?,F在我們還不知道如何在一個請求中經歷之個Servlet,后面在學習請求轉發(fā)和請求包含后就知道了。下面是request的域方法:l void setAttribute(String name, Object value):用來存儲一個對象,也可以稱之為存儲一個域屬性,例如:servletContext.setAttribute(“xxx”, “XXX”),在request中保存了一個域屬性,域屬性名稱為xxx,域屬性的

14、值為XXX。請注意,如果多次調用該方法,并且使用相同的name,那么會覆蓋上一次的值,這一特性與Map相同;l Object getAttribute(String name):用來獲取request中的數據,當前在獲取之前需要先去存儲才行,例如:String value = (String)request.getAttribute(“xxx”);,獲取名為xxx的域屬性;l void removeAttribute(String name):用來移除request中的域屬性,如果參數name指定的域屬性不存在,那么本方法什么都不做;l Enumeration getAttributeName

15、s():獲取所有域屬性的名稱;3request獲取請求頭數據request與請求頭相關的方法有:l String getHeader(String name):獲取指定名稱的請求頭;l Enumeration getHeaderNames():獲取所有請求頭名稱;l int getIntHeader(String name):獲取值為int類型的請求頭。4request獲取請求相關的其它方法request中還提供了與請求相關的其他方法,有些方法是為了我們更加便捷的方法請求頭數據而設計,有些是與請求URL相關的方法。l int getContentLength():獲取請求體的字節(jié)數,GET請求

16、沒有請求體,沒有請求體返回-1;l String getContentType():獲取請求類型,如果請求是GET,那么這個方法返回null;如果是POST請求,那么默認為application/x-www-form-urlencoded,表示請求體內容使用了URL編碼;l String getMethod():返回請求方法,例如:GETl Locale getLocale():返回當前客戶端瀏覽器的Locale。java.util.Locale表示國家和言語,這個東西在國際化中很有用;l String getCharacterEncoding():獲取請求編碼,如果沒有setCharacte

17、rEncoding(),那么返回null,表示使用ISO-8859-1編碼;l void setCharacterEncoding(String code):設置請求編碼,只對請求體有效!注意,對于GET而言,沒有請求體!所以此方法只能對POST請求中的參數有效!l String getContextPath():返回上下文路徑,例如:/hellol String getQueryString():返回請求URL中的參數,例如:name=zhangSanl String getRequestURI():返回請求URI路徑,例如:/hello/oneServletl StringBuffer g

18、etRequestURL():返回請求URL路徑,例如:http:/localhost/hello/oneServlet,即返回除了參數以外的路徑信息;l String getServletPath():返回Servlet路徑,例如:/oneServletl String getRemoteAddr():返回當前客戶端的IP地址;l String getRemoteHost():返回當前客戶端的主機名,但這個方法的實現還是獲取IP地址;l String getScheme():返回請求協議,例如:http;l String getServerName():返回主機名,例如:localhostl

19、 int getServerPort():返回服務器端口號,例如:8080System.out.println("request.getContentLength(): " + request.getContentLength();System.out.println("request.getContentType(): " + request.getContentType();System.out.println("request.getContextPath(): " + request.getContextPath();Syst

20、em.out.println("request.getMethod(): " + request.getMethod();System.out.println("request.getLocale(): " + request.getLocale();System.out.println("request.getQueryString(): " + request.getQueryString();System.out.println("request.getRequestURI(): " + request.ge

21、tRequestURI();System.out.println("request.getRequestURL(): " + request.getRequestURL();System.out.println("request.getServletPath(): " + request.getServletPath();System.out.println("request.getRemoteAddr(): " + request.getRemoteAddr();System.out.println("request.ge

22、tRemoteHost(): " + request.getRemoteHost();System.out.println("request.getRemotePort(): " + request.getRemotePort();System.out.println("request.getScheme(): " + request.getScheme();System.out.println("request.getServerName(): " + request.getServerName();System.out.

23、println("request.getServerPort(): " + request.getServerPort();4.1案例:request.getRemoteAddr():封IP可以使用request.getRemoteAddr()方法獲取客戶端的IP地址,然后判斷IP是否為禁用IP。String ip = request.getRemoteAddr();System.out.println(ip);if(ip.equals("") response. getWriter().print("您的IP已被禁止!&qu

24、ot;); else response.getWriter().print("Hello!");5request獲取請求參數最為常見的客戶端傳遞參數方式有兩種:l 瀏覽器地址欄直接輸入:一定是GET請求;l 超鏈接:一定是GET請求;l 表單:可以是GET,也可以是POST,這取決與<form>的method屬性值;GET請求和POST請求的區(qū)別:l GET請求:Ø 請求參數會在瀏覽器的地址欄中顯示,所以不安全;Ø 請求參數長度限制長度在1K之內;Ø GET請求沒有請求體,無法通過request.setCharacterEncodi

25、ng()來設置參數的編碼;l POST請求:Ø 請求參數不會顯示瀏覽器的地址欄,相對安全;Ø 請求參數長度沒有限制; <a href="/hello/ParamServlet?p1=v1&p2=v2hello是應用名,ParamServlet是Servlet綁定URL路徑,在問號后面的是請求參數,第一個參數是p1,值為v1,第二個參數為p2,值為v2">超鏈接</a> <hr/> <form action="/hello/ParamServlet" method="post請

26、求方法是post"> 參數1:<input type="text" name="p1"/><br/> 參數2:<input type="text" name="p2"/><br/> <input type="submit" value="提交"/> </form>下面是使用request獲取請求參數的API:l String getParameter(String name):通過指定名稱

27、獲取參數值;public void doGet點擊超鏈接是GET請求,所以會執(zhí)行doGet()方法(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException String v1 = request.getParameter("p1");String v2 = request.getParameter("p2");System.out.println("p1=" + v1);System.out.printl

28、n("p2=" + v2);public void doPost提交表單是POST請求,所以會調用doPost()方法(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException String v1 = request.getParameter("p1");String v2 = request.getParameter("p2");System.out.println("p1=" + v

29、1);System.out.println("p2=" + v2);l String getParameterValues(String name):當多個參數名稱相同時,可以使用方法來獲??;<a href="/hello/ParamServlet?name=zhangSan&name=liSi多個名為name的參數">超鏈接</a>public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletExcepti

30、on, IOException String names = request.getParameterValues("name");獲取所有名為name的參數值System.out.println(Arrays.toString(names);打印數組,輸出結果為:zhangSan, liSil Enumeration getParameterNames():獲取所有參數的名字; <form action="/hello/ParamServlet" method="post"> 參數1:<input type=&qu

31、ot;text" name="p1"/><br/> 參數2:<input type="text" name="p2"/><br/> <input type="submit" value="提交"/> </form>public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOEx

32、ception Enumeration names = request.getParameterNames()獲取所有參數名稱,輸出結果為:p1和p2;while(names.hasMoreElements() System.out.println(names.nextElement();l Map getParameterMap():獲取所有參數封裝到Map中,其中key為參數名,value為參數值,因為一個參數名稱可能有多個值,所以參數值是String,而不是String。<a href="/day05_1/ParamServlet?p1=v1&p1=vv1&

33、;p2=v2&p2=vv2">超鏈接</a>Map<String,String> paramMap = request.getParameterMap();for(String name : paramMap.keySet() String values = paramMap.get(name);System.out.println(name + ": " + Arrays.toString(values);p2: v2, vv2p1: v1, vv16請求轉發(fā)和請求包含無論是請求轉發(fā)還是請求包含,都表示由多個Servlet共

34、同來處理一個請求。例如Servlet1來處理請求,然后Servlet1又轉發(fā)給Servlet2來繼續(xù)處理這個請求。6.1請求轉發(fā)在AServlet中,把請求轉發(fā)到BServlet:public class AServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException System.out.println("AServlet");RequestDispatcher rd = request.getRequestDispatcher("/BServlet");獲取“調度器”,其中參數為BServlet綁定的URL,即BServlet的<url-pattern>值。rd.forward(request, response)調用“調度器”的轉發(fā)方法,該方法等同與告訴服務器,去調用BServlet的service()方法一樣。;public class BServlet extends HttpServlet public void doGet(HttpServletRequest request, Htt

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論