標籤: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對象