轉發和重定向即:getRequstDispatcher()和sendRedirect()兩者的區別

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跳轉 才能在新頁取出來 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章