Java 中的 HttpServletRequest 和 HttpServletResponse 對象


HttpServletRequest對象詳解

  javax.servlet.http.HttpServletRequestSUN制定的Servlet規范,是一個接口。表示請求HTTP請求協議”的完整內容都被封裝到request對象中,HttpServletRequest接口的父接口是javax.servlet.ServletRequest

  Apache軟件基金會開發的“Tomcat容器”對javax.servlet.http.HttpServletRequest接口的實現類完整類名是org.apache.catalina.connector.RequestFacade,但是我們javaweb程序員不需要關心具體的請求對象類型,不需要關心是哪個容器,我們只需要面向HttpServletRequest接口調用方法即可。

  一次請求對應一個請求對象,請求開始,請求對象被創建,請求結束,請求對象被回收,下一次請求的時候是一個新的請求對象。如何理解一次請求:瀏覽器向服務器發送請求到服務器響應結束為一次請求。

  HttpServletRequest接口中常用的方法

  通過用戶提交的參數name獲取參數value最常用的方法)

  String value = request.getParameter(String name);

  HttpServletRequest對象中存儲數據(綁定)

  request.setAttribute(String name,Object obj);

  從HttpServletRequest對象中獲取數據(讀取數據)

  Object obj = request.getAttribute(String name);

  移除HttpServletRequest對象中的數據

  request.removeAttribute(String name);

  使用request對象完成轉發(轉發是一次請求,一次請求跨越多個Servlet 

  request.getRequestDispatcher(“資源路徑”).forward(request,response);

  獲取客戶端的IP地址

  String clientIP = request.getRemoteAddr();

  獲取URI

  String uri = request.getRequestURI();

  獲取URL

  StringBuffer url = request.getRequestURL();

  獲取Servlet Path

  String servletPath = request.getServletPath();

  獲取應用程序的根路徑,獲取應用上下文路徑

  String contextPath = request.getContextPath();

  解決請求體中的亂碼問題(在從request對象中獲取任何數據之前設置有效)

  request.setCharacterEncoding(“UTF-8”);

  在服務器端獲取用戶發送的請求中的所有Cookie

  Cookie[] cookies = request.getCookies();

  獲取會話對象session

  HttpSession sessoin = request.getSessoin();  獲取session對象,如果獲取不到則開啟新session

  HttpSession sessoin = request.getSession(true);   獲取session對象,如果獲取不到則開啟新session

  HttpSession sessoin = request.getSession(false);  獲取session對象,如果獲取不到則返回null

  HttpServletRequest對象是一個請求級別的對象,一次請求一個對象,所以request對象只能完整在同一次請求中進行數據的傳遞,可以跨越多個Servlet進行數據的傳遞,但是必須使用轉發機制。如果request對象和ServletContext對象都可以完成此功能,我們優先選擇request范圍。request不能完成跨用戶傳遞數據。只能完成在一次請求中傳遞數據。

HttpServletResponse對象詳解

  javax.servlet.ServletResponse是接口,是SUN制定的響應對象,專門完成向瀏覽器的響應動作。

  javax.servlet.http.HttpServletResponse父接口是ServletResponse

  獲取響應流:PrintWriter out = response.getWriter();

  關於PrintWriter中的方法:

    1、println方法:輸出到瀏覽器的HTML源碼換行

    2、print方法:輸出到瀏覽器的HTML源碼不換行,如果想在網頁中做到換行效果,需要使用HTML識別的 <br>標簽。

    3、向特定的瀏覽器客戶端發送Cookie:response.addCookie(cookie);

  重定向:response.sendRedirect(/webcontextPath/servletPath);

關於轉發和重定向

轉發與重定向的區別(資源跳轉),如下圖所示

 

代碼上的實現:

轉發

request.getRequestDispatcher("/servletPath").forward(request,response); 

重定向

response.sendRedirect("/webcontextPath/servletPath");

注意資源路徑:在轉發中不需要編寫web應用的根路徑名稱。但是在重定向的時候需要編寫web應用的根路徑名稱,假設web應用的根路徑名稱是StudyServlet,該web應用的根下有a資源,如果是轉發則路徑寫 /a,如果是重定向則 /StudyServlet/a

  RequestDispatcher.forward方法只能將請求轉發給同一個WEB應用中的資源(這個資源可能是Servlet、JSP、HTML等),而HttpServletResponse.sendRedirect 方法不僅可以重定向到當前應用程序中的其他資源,還可以重定向到另一個WEB應用中的資源

  調用HttpServletResponse.sendRedirect方法重定向的訪問過程結束后,瀏覽器地址欄中顯示的URL會發生改變,由初始的URL地址變成重定向的目標URL;而調用RequestDispatcher.forward 方法的請求轉發過程結束后,瀏覽器地址欄保持初始的URL地址不變。

  HttpServletResponse.sendRedirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個URL的訪問請求,這個過程好比有個綽號叫“瀏覽器”的人寫信找張三借錢,張三回信說沒有錢,讓“瀏覽器”去找李四借,並將李四現在的通信地址告訴給了“瀏覽器”。於是,“瀏覽器”又按張三提供通信地址給李四寫信借錢,李四收到信后就把錢匯給了“瀏覽器”。可見,“瀏覽器”一共發出了兩封信和收到了兩次回復, “瀏覽器”也知道他借到的錢出自李四之手。RequestDispatcher.forward方法在服務器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求並得到了響應結果,並不知道在服務器程序內部發生了轉發行為。這個過程好比綽號叫“瀏覽器”的人寫信找張三借錢,張三沒有錢,於是張三找李四借了一些錢,甚至還可以加上自己的一些錢,然后再將這些錢匯給了“瀏覽器”。可見,“瀏覽器”只發 出了一封信和收到了一次回復,他只知道從張三那里借到了錢,並不知道有一部分錢出自李四之手。       

  RequestDispatcher.forward方法的調用者與被調用者之間共享相同的request對象和response對象,它們屬於同一個訪問請求和響應過程;而HttpServletResponse.sendRedirect方法調用者與被調用者使用各自的request對象和response對象,它們屬於兩個獨立的訪問請求和響應過程。對於同一個WEB應用程序的內部資源之間的跳轉,特別是跳轉之前要對請求進行一些前期預處理,並要使用HttpServletRequest.setAttribute方法傳遞預處理結果,那就應該使用RequestDispatcher.forward方法。不同WEB應用程序之間的重定向,特別是要重定向到另外一個WEB站點上的資源的情況,都應該使用HttpServletResponse.sendRedirect方法。      

  無論是轉發還是重定向,轉發和重定向后面不能再有轉發和重定向相關的代碼。(轉發和重定向在同一個Servlet中只能有一次。

怎么選擇是重定向還是轉發呢?

通常情況下轉發更快,而且能保持request內的對象,所以它是第一選擇。但是由於在轉發之后,瀏覽器中URL仍然指向開始頁面,此時如果重載當前頁面,開始頁面將會被重新調用。如果你不想看到這樣的情況,則選擇重定向(頁面刷新問題)。     

重定向:以前的request中存放的變量全部失效,並進入一個新的request作用域。  

轉發:以前的request中存放的變量不會失效,就像把兩個頁面拼到了一起。

1、 如果是web應用之間資源的跳轉,必須使用重定向。

2、 為了解決頁面的刷新問題,必須使用重定向。

3、 如果在Servlet中向request對象中存儲了一個數據,希望在下一個Servlet/JSP頁面中把request對象中的數據取出來,這個時候必須使用轉發,因為重定向是兩次請求,request不能跨請求傳遞數據。其它情況都可以使用重定向。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM