1. 程式人生 > >Servlet中的request對象、重定向和轉發的差別(6)

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

current https 命令 相對 eba 進入 file before redirect

1.這裏所說的request對象指的是HttpServletRequest對象,它代表client的請求,當client通過HTTP協議訪問server時。HTTP請求頭中的全部信息都封裝在這個對象中。我們通過request對象調用裏面的方法,能夠獲得客戶發送給webserver的各種信息。

2.request的經常用法

(1)獲得客戶機信息

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

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

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

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

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


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

(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);



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