轉發(Forward)與重定向(Redirect)的區別
轉自:https://blog.csdn.net/uk8692/article/details/12865571
在進行web開發時,跳轉是最常見的,今天在這裡來學習下2種跳轉:
第一種是request.getRequestDispatcher().forward(request,response):
1、屬於轉發,也是伺服器跳轉,相當於方法呼叫,在執行當前檔案的過程中轉向執行目標檔案,兩個檔案(當前檔案和目標檔案)屬於同一次請求,前後頁共用一個request,可以通過此來傳遞一些資料或者session資訊,request.setAttribute()和request.getAttribute()。
2、在前後兩次執行後,位址列不變,仍是當前檔案的地址。
3、不能轉向到本web應用之外的頁面和網站,所以轉向的速度要快。
4、URL中所包含的“/”表示應用程式(專案)的路徑。
第二種是response.sendRedirect():
1、屬於重定向,也是客戶端跳轉,相當於客戶端向服務端傳送請求之後,伺服器返回一個響應,客戶端接收到響應之後又向服務端傳送一次請求,一共是2次請求,前後頁不共用一個request,不能讀取轉向前通過request.setAttribute()設定的屬性值。
2、在前後兩次執行後,位址列發生改變,是目標檔案的地址。
3、可以轉向到本web應用之外的頁面和網站,所以轉向的速度相對要慢。
4、URL種所包含的"/"表示根目錄的路徑。
特殊的應用:對資料進行修改、刪除、新增操作的時候,應該用response.sendRedirect()。如果是採用了request.getRequestDispatcher().forward(request,response),那麼操作前後的位址列都不會發生改變,仍然是修改的控制器,如果此時再對當前頁面重新整理的話,就會重新發送一次請求對資料進行修改,這也就是有的人在重新整理一次頁面就增加一條資料的原因。
如何採用第二種方式傳遞資料:
1、可以選擇session,但要在第二個檔案中刪除;
2、可以在請求的url中帶上引數,如"add.htm?id=122"