標籤:java web redirect httpservletrequest httpservletresponse forward
Java web基礎總結五之—— HttpServletRequest與HttpServletResponse
在前面總結過,每當用戶端給Web伺服器發送一個http請求,web伺服器就會針對每一次請求,分別建立一個用於代表請求的request對象、和代表響應的response對象。request和response對象就代表請求和響應,所以我們可以通過request對象獲得請求相關的資料和操作。通過response對象進行對響應相關的資料封裝和一些其他的操作。
一.HttpServletRequest與HttpServletResponse的實作類別
我們會發現,HttpServletRequest與HttpServletResponse都是介面,那麼它們在啟動並執行時候的實作類別是什嗎?是由誰負責執行個體化它們的實作類別呢?
通過對上一篇文章的HelloWorldServlet進行調試,可以得到答案。HelloWorldServlet的部分代碼的如下所示:
這張圖是調試時獲得的:
通過上面的圖我們可以看到,HttpServletRequest與HttpServletResponse的對象req,resp的實際的類型是RequestFacade和ResponseFacade。這兩個類都是org.apache.catalina.connector包下面的。也就是我使用的web伺服器tomcat的兩個類。所以還是由web容器來負責執行個體化HttpServletRequest與HttpServletResponse的對象。
二.HttpServletRequest簡介
HttpServletRequest對象代表用戶端的請求,當用戶端通過HTTP協議訪問伺服器時,HTTP要求標頭中的所有資訊都封裝在這個對象中。
request常用的方法和操作:
1.獲得用戶端的資訊
getRequestURL方法返回用戶端發出請求時的完整URL。
getRequestURI方法返回請求行中的資源名部分,去掉主機名稱的部分。
getRemoteAddr方法返回傳出請求的客戶機的IP地址
getRemoteHost方法返回傳出請求的客戶機的完整主機名稱
getRemotePort方法返回客戶機所使用的連接埠號碼
getLocalAddr方法返回WEB伺服器的IP地址。
getLocalName方法返回WEB伺服器的主機名稱
getMethod得到客戶機請求方式,如GET,POST
2.獲得要求標頭的一些方法
getHead(name)方法
getHeaders(String name)方法
getHeaderNames方法
3.獲得請求參數,也就是用戶端提交的資料的一些方法。
getParameter(name)方法
getParameterValues(String name)方法
getParameterNames方法
getParameterMap方法
4.HttpServletRequest實現轉寄
請求轉寄指一個web資源收到用戶端請求後,通知伺服器去調用另外一個web資源進行處理。request對象提供了一個getRequestDispatcher方法,該方法返回一個RequestDispatcher對象,調用這個對象的forward方法可以實現請求轉寄。
5. request域
request對象同時也是一個域對象,我們通過request對象在實現轉寄時,可以把資料通過request對象帶給其它web資源處理。下面是常用的一些對域中的屬性的操作的方法:
setAttribute方法
getAttribute方法
removeAttribute方法
getAttributeNames方法
6. Request的getParameter和getAttribute方法的區別。
由於request也是一個域對象,所以既可以從它獲得參數,即Parameter。也可以獲得域中的屬性。但是他們的意義是完全不一樣的。
getParameter(String name)獲得用戶端傳送給伺服器的參數值,該參數是由name指定的,通常是表單中的參數。而且參數只能是字串形式的鍵值對。
getAttribute(String name):返回有name 指定的屬性值,如果指定的屬性值不存在,則會返回一個null值。這裡存放的也是一個鍵值對,不同的是,這裡的值可以是任意的類型。
三.HttpServletResponse簡介
HttpServletResponse則是對伺服器的響應對象。這個對象中封裝了向用戶端發送資料、發送回應標頭,發送響應狀態代碼的方法。
response常用的方法和操作:
1.常用的方法
addCookie(Cookie cookie) 向用戶端寫入Cookie
addHeader(java.lang.String name, java.lang.String value) 寫入給定的回應標頭
encodeURL(java.lang.Stringurl) 預設cookie中包含Session ID,如果用戶端不支援 Cookie,就在參數 url 中加入 Session ID 資訊,可以解決使用者禁用cookie的問題。
setStatus(intsc) 設定響應的狀態代碼。
2. getOutputStream和getWriter方法的區別
getOutputStream和getWriter方法分別用於得到輸出位元據、輸出文本資料的ServletOuputStream、Printwriter對象。getOutputStream和getWriter這兩個方法互斥,調用了其中的任何一個方法後,就不能再調用另一方法。
這兩個方法寫入的資料會作為響應訊息的本文,與響應狀態行和各回應標頭組合後輸出到用戶端。Serlvet的service方法結束後,web容器將檢查getWriter或getOutputStream方法返回的輸出資料流對象是否已經調用過close方法,如果沒有,web容器將調用close方法關閉該輸出資料流對象。
3. HttpServletResponse實現重新導向
重新導向指的是一個web資源收到用戶端請求後,web伺服器通知用戶端去訪問另外一個web資源,這稱之為請求重新導向。實現方式是調用response.sendRedirect()方法。實現的原理就是給用戶端返回了302狀態代碼和location頭。
四.轉寄forward和重新導向Redirect的區別
轉寄是在伺服器端實現的。一個web資源收到用戶端請求後,通知伺服器去調用另外一個web資源進行處理,稱之為請求轉寄。調用RequestDispatcher.forward 方法的請求轉寄過程結束後,瀏覽器地址欄保持初始的URL地址不變。
而重新導向是在用戶端實現的。一個web資源收到用戶端請求後,通知用戶端的瀏覽器去訪問另外一個web資源,稱之為請求重新導向。所以調用HttpServletResponse.sendRedirect方法重新導向的訪問過程結束後,瀏覽器地址欄中顯示的URL會發生改變,由初始的URL地址變成重新導向的目標URL。
RequestDispatcher.forward方法只能將請求轉寄給同一個WEB應用中的其他資源; sendRedirect方法還可以重新導向到同一個網站上的其他應用程式中的資源,甚至是使用絕對URL重新導向到其他網站的資源。
HttpServletResponse.sendRedirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個URL的訪問請求;RequestDispatcher.forward方法在伺服器端將請求轉寄給另外一個資源,相當過程於對用戶端不可見。
RequestDispatcher.forward方法的調用者與被調用者之間共用相同的request對象和response對象,它們屬於同一個訪問請求和響應過程;而HttpServletResponse.sendRedirect方法調用者與被調用者使用各自的request對象和response對象,它們屬於兩個獨立的訪問請求和響應過程。也就是說,重新導向產生了新的request對象和response對象。
Java web基礎總結五之—— HttpServletRequest與HttpServletResponse