Java web基礎總結五之—— HttpServletRequest與HttpServletResponse

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對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章