HttpServletRequest和HttpServletResponse對象

來源:互聯網
上載者:User

標籤:height   物件類型   伺服器程式   session   重新整理問題   規範   顯示   而且   name   

HttpServletRequest對象詳解

  javax.servlet.http.HttpServletRequest是SUN制定的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不能跨請求傳遞資料。其它情況都可以使用重新導向。

 

HttpServletRequest和HttpServletResponse對象

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.