Servlet中的request對象、重新導向和轉寄的區別(6),servletrequest
1.這裡所說的request對象指的是HttpServletRequest對象,它代表用戶端的請求,當用戶端通過HTTP協議訪問伺服器時,HTTP要求標頭中的所有資訊都封裝在這個對象中,我們通過request對象調用裡面的方法,可以獲得客戶發送給web伺服器的各種資訊。
2.request的常用方法
(1)獲得客戶機資訊
getRequestURL方法返回用戶端發出請求時的完整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方法返回客戶機所使用的網路連接埠號碼。
getLocalAddr方法返回WEB伺服器的IP地址。(127.0.0.1)
getLocalName方法返回WEB伺服器的主機名稱。(虛擬機器主機名:www.wenhao.com)
(2)獲得客戶機要求標頭
getHeader(string name)方法:String
getHeaders(String name)方法:Enumeration
getHeaderNames()方法
(3)獲得客戶機請求參數(用戶端提交的資料)
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資源收到用戶端請求後,通知伺服器去調用另外一個 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應用
重新導向/表示web伺服器的根目錄,即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()是在伺服器端運行;
HttpServletResponse.sendRedirect()是通過向客戶瀏覽器發送命令來完成.
所以RequestDispatcher.forward()對於瀏覽器來說是“透明的”;
而HttpServletResponse.sendRedirect()則不是。
(3).ServletContext.getRequestDispatcher(String url)中的url只能使用絕對路徑;
而ServletRequest.getRequestDispatcher(String url)中的url可以使用相對路徑。
因為ServletRequest具有相對路徑的概念;而ServletContext對象無次概念。
7.RequestDispatcher對象從用戶端擷取請求request,並把它們傳遞給伺服器上的servlet,html或jsp。 它有兩個方法:
(1)void forward(ServletRequest request, ServletResponse response)
用來傳遞request的,可以一個Servlet接收request請求,另一個Servlet用這個request請 求來產生response。request傳遞的請求,response是用戶端返回的資訊。forward要在response到達用戶端之前調用,也 就是 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中的轉寄與重新導向有什不同 誰可以通俗點解釋
forward是在伺服器端的跳轉,就是用戶端一個請求發給伺服器,伺服器直接將請求相關的參數的資訊原封不動的傳遞到該伺服器的其他jsp或servlet去處理,而sendredirect是在用戶端的跳轉,伺服器會返回給用戶端一個響應前序和新的URL地址,原來的參數什麼的資訊如果伺服器端沒有特別處理就不存在了,瀏覽器會訪問新的URL所指向的servlet或jsp,這可能不是原先伺服器上的webservce也有可能是。
servlet中的轉寄與重新導向
前後兩個頁面 有資料傳遞 用請求轉寄,沒有則用重新導向。
比如servlet查詢了資料需要在頁面顯示,就用請求轉寄。
比如servlet做了update操作跳轉到其他頁面,就用重新導向。