Servlet中的request對象、重定向和轉發的差異(6)

1.這裏所說的request對象指的是HttpServletRequest對象,它表明client的請求,當client經過HTTP協議訪問server時。HTTP請求頭中的所有信息都封裝在這個對象中。咱們經過request對象調用裏面的方法,可以得到客戶發送給webserver的各類信息。html

2.request的常常用法web

(1)得到客戶機信息設計模式

    getRequestURL方法返回client發出請求時的完整URL。(瀏覽器

                               好比:url:http://localhost:8080/Summer_Exercise6/Demo1)
    getRequestURI方法返回請求行中的資源名部分。
網絡

app

                              好比:uri:/Summer_Exercise6/Demo1)
    getQueryString 方法返回請求行中的參數部分。地址欄中?後面的參數(
框架

                               好比:query:name=wwh&age=12)
    getPathInfo方法返回請求URL中的額外路徑信息。額外路徑信息是請求URL中的位於      Servlet的路徑以後和查詢參數以前的內容,它以「/」開頭。
webapp

    getRemoteAddr方法返回發出請求的客戶機的IP地址。
    getRemoteHost方法返回發出請求的客戶機的完整主機名。
jsp


     getRemotePort方法返回客戶機所使用的網絡port號。
     getLocalAddr方法返回WEBserver的IP地址。
post

(127.0.0.1)
     getLocalName方法返回WEBserver的主機名。(虛擬主機名:www.wenhao.com)

(2)得到客戶機請求頭
     getHeader(string name)方法:String 
     getHeaders(String name)方法:Enumeration 
     getHeaderNames()方法 
(3)得到客戶機請求參數(client提交的數據) 
     getParameter(String)方法
     getParameterValues(String name)方法
     getParameterNames方法+BeanUtils框架

3.request的常見應用

(1)防盜鏈(下載文件,必須從指定站點進入,不然不一樣意下載文件。判段某個頁面來自於何方,即referer請求頭)
(2)各類表單輸入項數據的獲取
text、password、radio、checkbox、
file、select、textarea、 hidden、
(3)POST方式請求參數的中文亂碼問題 
         GET方式請求參數的中文亂碼問題(JSP)

(4)request對象實現請求轉發:請求轉發指一個web資源收到client請求後,通知server去調用另一個         web資源進行處理。
(5)請求轉發的應用場景:MVC設計模式
(6)request對象提供了一個getRequestDispatcher方法,該方法返回一個RequestDispatcher對象。調用這個對象的forward方法可以實現請求轉發。
(7)request對象同一時候也是一個域對象。開發者經過request對象在實現轉發時。把數據經過request對象帶給其餘web資源處理。
             setAttribute方法 
             getAttribute方法  
            removeAttribute方法
            getAttributeNames方法

4.request要注意的地方:
   (1).轉發是經過RequestDispatcher對象的forward(request,response)方法完畢的
   (2).forward()方法以前的輸出,假設是輸出到緩衝區,再轉發到其它Servlet。那麼原緩衝區的數據忽略不計
   (3).forward()方法以前的輸出。假設真正輸出到瀏覽器,再轉發到其它Servlet。再轉發到其它Servlet代碼忽略不計
   (4).forward()方法以前的輸出,假設是對響應頭的設置。會保留到轉發的其它Servlet中

5.重定向和轉發差異
   (1).轉發僅僅能相對於當前web應用而言。不能轉發到其餘web應用
     重定向可以在當前web應用以外的其餘web應用重寫向資源
  (2).轉發/表示當前web應用
     重定向/表示webserver的根文件夾。即webapps文件夾
   (3).轉發時。瀏覽器地址欄不變
     重定向時,瀏覽器地址欄改變
  (4).轉發是服務端的內部行爲,瀏覽器不知
     重定向是瀏覽器和服務端的共同行爲。瀏覽器必知
   (5).轉發時二個Servlet共享request域對象
     重定向時二個Servlet獨享request域對象
  (6).request具備二義性:
a>請求對象
b>域對象

6.getRequestDispatcher()和sendRedirect()的差異

(1).request.getRequestDispatcher()是請求轉發,先後頁面共享一個request ;
   response.sendRedirect()是又一次定向 先後頁面不是一個request .
(2).RequestDispatcher.forward()是在server端執行;
   HttpServletResponse.sendRedirect()是經過向客戶瀏覽器發送命令來完畢.
   因此RequestDispatcher.forward()對於瀏覽器來講是「透明的」。
   而HttpServletResponse.sendRedirect()則不是。
(3).ServletContext.getRequestDispatcher(String url)中的url僅僅能使用絕對路徑;
   而ServletRequest.getRequestDispatcher(String url)中的url可以使用相對路徑。
   因爲ServletRequest具備相對路徑的概念。而ServletContext對象無次概念。

7.RequestDispatcher對象從client獲取請求request。並把它們傳遞給server上的servlet,html或jsp。

它有兩個方法:

(1)void  forward(ServletRequest   request, ServletResponse   response)

用來傳遞request的,可以一個Servlet接收request請求。還有一個Servlet用這個request請 求來產生response。

request傳遞的請求。response是client返回的信息。forward要在response到達client以前調用,也 就是 before response body output has been flushed。假設不是的話,它會報出異常。

(2).void include(ServletRequest request, ServletResponse response)

用來記錄保留request和response,之後不能再改動response裏表示狀態的信息。

8.假設需要把請求轉移到另一個Web App中的某個地址。可以按如下的作法:

(1). 得到另一個Web App的ServletConext對象(currentServletContext.getContext(uripath)).

(2). 調用ServletContext.getRequestDispatcher(String url)方法。

eg:ServletContext.getRequestDispatcher("smserror.jsp").forward(request,respons);

相關文章
相關標籤/搜索