來自:http://blog.csdn.net/JavaEETeacher/archive/2009/06/23/4291523.aspx
Java Web開發中,採用MVC模式的時候,在控制器完成模型的調用之後會選擇介面對使用者響應,用常有兩種方式:
1、通過response對象的sendRedirect方法。
2、通過RequestDispatcher對象的forward方法。
例如要跳轉登入介面login.jsp,可以使用下面的兩種方式:
1、使用response
response.sendRedirect("login.jsp");
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="使用者不存在!"