1.request.getRequestDispatcher()是請求轉發,前後頁面共享一個request,request.getRequestDispather();返回的是一個 RequestDispatcher對象。
2.response.sendRedirect()是重新定向,前後頁面不是一個request
RequestDispatcher.forward()是在服務器端運行,HttpServletResponse.sendRedirect()是通過向客戶瀏覽器發送命令來完成.
所以RequestDispatcher.forward()對於瀏覽器來說是“透明的”; 而HttpServletResponse.sendRedirect()則不是。
如果需要把請求到另外一個web app地址,可以按照下面的做法:
1.獲取另外的以個web app的ServletContext對象(currentServletContext.getContext(urlpath))。
2. 調用ServletContext.getRequestDispatcher(String url)方法。
request.getRequestDispatcher("show.jsp").forward(request.response).
或者:response.sendRedirect("show.jsp")
二者在做頁面跳轉時候的區別
response.sendRedirect(url)跳轉到指定的URL地址,產生一個新的request,所以要傳遞參數只有在url後加參
數,如:
url?id=2.
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獲得數據。
總的來說:
使用response.sendRedirect()地址欄將改變
使用request.getRequestDispatcher().forward(request,response)地址欄中的信息保持不變.
request.setAttribute存的東西
只用通過方法2跳轉 才能在新頁取出來