Spring MVC 中的 forward 和 redirect 的簡單理解
forward 轉發,如return "forward:/hello"; 瀏覽器的地址欄不會變,但是有視圖返回來
redirect 重定向,如return "redirect:/hello"; 瀏覽器的地址欄會變。
網絡解釋:
spring控制器最后返回一個ModelAndView(urlName),其中urNamel可以是一個視圖名稱,由視圖解析器負責解析后將響應流寫回客戶端;也可以通過redirect/forward:url方式轉到另一個控制器進行處理.
-
redirect方式相當于”response.sendRedirect()”.這種方式外部特征就是瀏覽器地址欄最后顯示的路徑是轉發后的新的路徑.工作方式是這樣的, 服務器端會首先發一個response給瀏覽器, 然后瀏覽器收到這個response后再發一個requeset給服務器, 然后服務器發新的response給瀏覽器. 這時頁面收到的request是一個新從瀏覽器發來的.這種方式的結果是:
-
A.在轉發前后有兩個不同的request對象,轉發前后的兩個控制器在request上的參數(request.getParameter())和request屬性(request.getAttribute())不能共享;
-
B.如果轉發前后的兩個控制器都配置在spring 攔截器范圍內,這樣攔截器會攔截前后兩個request,即會攔截兩次;
-
C.最后返回到瀏覽器后,因為地址欄顯示的是轉發后的url,所以刷新頁面時只會執行后面的url映射的控制器.
-
forward方式相當于request.getRequestDispatcher().forward(request,response),這種方式的外部特征是瀏覽器地址顯示的路徑是轉發前的路徑.工作方式是這樣,forward 發生在服務器內部,在前一個控制器處理完畢后,直接進入下一個控制器處理, 并將最后的response發給瀏覽器. 這種方式的結果是:
-
A.轉發前后是同一個request,后一個控制器可共享前一個控制器的參數與屬性;
-
B.因為是同一個request,攔截器只會攔截前一個url,如果前一個url在映射時未配置到攔截器攔截,則攔截后一個url,即只攔截一次;
-
C.最后返回到瀏覽器后,因為地址欄顯示的是轉發前的url,所以刷新頁面時會依次執行前后兩個控制器.
這是以前在別的文章系統記錄的筆記,現在轉存到CSDN.
此文章屬轉載他人文章,但是轉載地址以前沒記錄,請筆者原諒,如果有侵犯到您的任何權益請聯系本人,本人會第一時間刪除。

浙公網安備 33010602011771號