1. 程式人生 > >response.sendRedirect() 和 dispatcher.forward(request,response)之間的區別

response.sendRedirect() 和 dispatcher.forward(request,response)之間的區別

Java Web開發中,採用MVC模式的時候,在控制器完成模型的呼叫之後會選擇介面對使用者響應,用常有兩種方式:

1、通過response物件的sendRedirect方法。

2、通過RequestDispatcher物件的forward方法。

例如要跳轉登入介面login.jsp,可以使用下面的兩種方式:

1、使用response

response.sendRedirect(request.getContextPath()+"/main.jsp");     // 使用request.getContextPath()獲取網站根目錄

2、使用RequestDispatcher

RequestDispatcher rd = request.getRequestDispatcher("login.jsp");

rd.forward(request,response);

這兩種方式有什麼區別?什麼情況下應該使用哪一種方式呢?

首先介紹兩者的區別。

第一點區別,過程不同:第一種方式相當於瀏覽器接收到了響應之後又向伺服器傳送了一次請求,所以相當於兩次請求。第二種方式相當於方法呼叫,在執行當前檔案的過程中轉向執行目標檔案,兩個檔案(當前檔案和目標檔案)屬於同一次請求,最本質的特點就是兩次請求共享了reques物件和response物件。

第二點區別,位址列不同:第一種方式下使用者在瀏覽器位址列中看到的是目標檔案的地址,第二種方式下使用者在瀏覽器位址列中看到的是當前檔案的地址。這一點也非常重要,後面介紹。

在使用的時候具體應如何選擇呢?

如果兩個檔案的關係非常密切,則應該使用RequestDispatcher,如果兩個檔案沒有直接的關聯關係,則應該使用response的sendRedirect方法。什麼樣的關係算是關係密切,什麼樣的關係算是沒有直接的關聯關係呢?例如查詢的控制器和查詢的結果介面之間就應該算是關係密切,因為查詢控制器處理完之後肯定要轉向查詢結果介面。再例如新增資訊的控制器和查詢控制器之間的關係就是沒有直接關係,通常在新增資訊之後會跳轉到列表介面的控制器然後再跳轉到列表介面,修改資訊或者刪除資訊之後也可能會跳轉到列表介面的控制器然後再跳轉到列表介面。

下面是兩個比較特殊的應用:

1、如果希望通過request把當前在控制器中獲取的資訊傳遞給目標檔案(通過request.setAttribute和request.getAttribute),這時候應該選擇RequestDispatcher。因為需要當前檔案和目標檔案共享request物件。通常用於查詢。

2、對資料進行修改(包括刪除和新增操作)的功能的控制器與之後的介面或者控制器應該採用response.sendRedirect方式。如果採用了RequestDiapatcher的forward方式,會產生嚴重錯誤。因為位址列是修改資訊的控制器,如果使用者在重新整理的時候,會重新發送一次對資料進行修改的請求,這不是使用者想看到的結果。所以有同學在做新增功能的時候,每重新整理一次就新增一條。

如何採用第二種方式,如何傳遞資料呢?有兩種方式:

1、可以選擇session,但是在第二個檔案中一定要刪除。

2、可以在請求字串中編寫,例如login.jsp?info="使用者不存在!

為什麼response.sendRedirect()不跳轉,在其後加上return;就能夠跳轉了呢

response.sendRedirect是通過瀏覽器來做轉向的,所以只有在整個頁面處理完成後,才會有實際的動作。