天天看點

getRequestDispatcher()與sendRedirect()的差別

1.request.getRequestDispatcher()是請求轉發,前後頁面共享一個request ; 

response.sendRedirect()是重新定向,前後頁面不是一個request。

request.getRequestDispather();傳回的是一個RequestDispatcher對象。

2.RequestDispatcher.forward()是在伺服器端運作; 

HttpServletResponse.sendRedirect()是通過向客戶浏覽器發送指令來完成. 

是以RequestDispatcher.forward()對于浏覽器來說是“透明的”; 

而HttpServletResponse.sendRedirect()則不是。

3.ServletContext.getRequestDispatcher(String url)中的url隻能使用絕對路徑; 而

ServletRequest.getRequestDispatcher(String url)中的url可以使用相對路徑。因為

ServletRequest具有相對路徑的概念;而ServletContext對象無次概念。

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裡表示狀态的資訊。

如果需要把請求轉移到另外一個Web App中的某個位址,可以按下面的做法: 

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

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

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

<a target="_blank" href="http://lanew.blog.ccidnet.com/blog-htm-do-showone-type-blog-itemid-3690834-uid-327434.html">http://lanew.blog.ccidnet.com/blog-htm-do-showone-type-blog-itemid-3690834-uid-327434.html</a>

二者差別: 

response.sendRedirect(url)跳轉到指定的URL位址,産生一個新的request,是以要傳遞參數隻有在url後加參 

數,如: 

url?id=1. 

request.getRequestDispatcher(url).forward(request,response)是直接将請求轉發到指定URL,是以該請求 

能夠直接獲得上一個請求的資料,也就是說采用請求轉發,request對象始終存在,不會重新建立。而 

sendRedirect()會建立request對象,是以上一個request中的資料會丢失。 

更具體來說就是這樣的: 

redirect 會首先發一個response給浏覽器, 然後浏覽器收到這個response後再發一個requeset給伺服器, 然後 

伺服器發新的response給浏覽器. 這時頁面收到的request是一個新從浏覽器發來的. 

forward 發生在伺服器内部, 在浏覽器完全不知情的情況下發給了浏覽器另外一個頁面的response. 這時頁面 

收到的request不是從浏覽器直接發來了,可能己經用request.setAttribute在request裡放了資料.在轉到的頁 

面可直接用request.getAttribute獲得資料。 

最基本的用法就如上了,其他的一些應注意的地方如下: 

跳轉方式 

運用forward方法隻能重定向到同一個Web應用程式中的一個資源。而sendRedirect方法可以讓你重定向到任何 

URL。 

(運用RequestDispatcher接口的Forward)方法 

forward()無法重定向至有frame的jsp檔案,可以重定向至有frame的html檔案, 

同時forward()無法在後面帶參數傳遞,比如servlet?name=frank,這樣不行,可以程式内通過 

response.setAttribute("name",name)來傳至下一個頁面. 

重定向後浏覽器位址欄URL不變. 

隻有在用戶端沒有輸出時才可以調用forward方法。如果目前頁面的緩沖區(buffer)不是空的,那麼你在調用 

forward方法前必須先清空緩沖區。 

"/"代表相對與web應用路徑 

RequestDispatcher rd = request.getRequestDispatcher("/ooo"); 

RequestDispatcher rd = getServletContext().getRequestDispatcher("/ooo"); 

RequestDispatcher rd =getServletContext().getNamedDispatcher("TestServlet");(TestServlet為一個 

&lt;servlet-name&gt;) 

rd.forward(request, response);送出至名為TestServlet的servlet 

如果在&lt;jsp:forward&gt;之前有很多輸出,前面的輸出已使緩沖區滿,将自動輸出到用戶端,那麼該語句将不起作用, 

這一點應該特别注意。 

另外要注意:它不能改變浏覽器位址,重新整理的話會導緻重複送出 

&lt;jsp:forward page="OtherPage.jsp"/&gt;在JSP頁面被解析後轉換成pageContext.forward("OtherPage.jsp"); 

(運用HttpServletResponse接口的sendRedirect)方法302 

是在使用者的浏覽器端工作,sendRedirect()可以帶參數傳遞,比如servlet?name=frank傳至下個頁面, 

同時它可以重定向至不同的主機上,sendRedirect()可以重定向有frame.的jsp檔案. 

假設轉發代碼包含于注冊的servlet-url為/ggg/tt;jsp為/ggg/tt.jsp: 

sendRedirect等同于此方式 

response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); 

String newLocn = "/newpath/jsa.jsp"; 

response.setHeader("Location",newLocn); 

(Meta Refresh)方法200 

這種方法是由HTML提供的,Meta本身就是HTML标簽。使用方法是:&lt;meta http-equiv="refresh" content="5; 

url=http://www.dreamdu.com/" /&gt; 

相應的java代碼 

String content=stayTime+";URL="+URL; 

response.setHeader("REFRESH",content); 

------------------------------------------------------------------------------------------------ 

-------------------------- 

使用response.sendRedirect()位址欄将改變 

使用request.getRequestDispatcher().forward(request,response)位址欄中的資訊保持不變. 

request.setAttribute存的東西 

隻用通過方法2跳轉 才能在新頁取出來