1. 程式人生 > >JSP中頁面跳轉response.sendRedirect()和request.getRequestDispatcher()的區別

JSP中頁面跳轉response.sendRedirect()和request.getRequestDispatcher()的區別

Java Web開發中,採用MVC模式的時候,在控制器完成模型的呼叫之後會選擇介面對使用者響應,用常有2種方式
1,通過response物件的sendRedirect方法重定向:

response.sendRedirect("login.jsp");

2,通過RequestDispatcher物件的forward方法:

<!--請求轉發-->
RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
rd.forward(request,response);

3,使用jsp動作指令的方法:與第2中方式相同

<jsp:forward page="login.jsp"></jsp:forward>

現在來說一下二者的區別:
1),過程不同:response.sendRedirect(“login.jsp”)方式相當於瀏覽器接收到了響應之後又向伺服器傳送了一次請求,所以相當於兩次請求。request.getRequestDispatcher(“login.jsp”)方式相當於方法呼叫,在執行當前檔案的過程中轉向執行目標檔案,兩個檔案(當前檔案和目標檔案)屬於同一次請求。

2)位址列不同:response.sendRedirect(“login.jsp”)方式下使用者在瀏覽器位址列中看到的是目標檔案的地址,即位址列會變

,request.getRequestDispatcher()方式下使用者在瀏覽器位址列中看到的是當前檔案的地址,即位址列不變

3)資料共享角度:request.getRequestDispatcher()是請求轉發,前後頁面共享一個request ;
response.sendRedirect()是重新定向,前後頁面不是一個request。
sendRedirect兩次提交,forword一次提交

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

1. 獲得另外一個Web App的ServletConext物件(currentServletContext.getContext
(uripath)). 2. 呼叫ServletContext.getRequestDispatcher(String url)方法。 eg: ServletContext.getRequestDispatcher("smserror.jsp").forward(request,response);

4),引數傳遞方面:
response.sendRedirect(url)跳轉到指定的URL地址,產生一個新的request,所以要傳遞引數只有在url後加引數,如: url?id=1.
request.getRequestDispatcher(url).forward(request,response)是直接將請求轉發到指定URL,所以該請求 能夠直接獲得上一個請求的資料,資料可以用request.setAttribute()方法封裝在request裡面。也就是說採用請求轉發,request物件始終存在,不會重新建立。而
sendRedirect()會新建request物件,所以上一個request中的資料會丟失。

5),功能上:response.sendRedirect()方法能夠定向到當前應用程式的其他資源,而且還能夠重定向到同一個站點上的其他應用程式的資源,甚至是使用絕對URL重定向到其他站點的資源:

response.sendRedirect(“http://www.baidu.com”)

request.getRequestDispatcher(“login.jsp”)方法只能在同一個web應用程式內的資源之間轉發請求

response.sendRedirect(“login.jsp”);和request.getRequestDispatcher(“login.jsp”);的請求過程如下:

redirect會首先發一個response給瀏覽器, 然後瀏覽器收到這個response後再發一個requeset給伺服器, 然後 伺服器發新的response給瀏覽器. 這時頁面收到的request是一個新從瀏覽器發來的.

forward 發生在伺服器內部, 在瀏覽器完全不知情的情況下發給了瀏覽器另外一個頁面的response. 這時頁面 收到的request不是從瀏覽器直接發來了,可能己經用request.setAttribute在request裡放了資料.在轉到的頁
面可直接用request.getAttribute獲得資料。