轉:Spring MVC 中的 forward 和 redirect 的簡單理解

forward 轉發,如return "forward:/hello"; 瀏覽器的地址欄不會變,但是有視圖返回來

redirect 重定向,如return "redirect:/hello"; 瀏覽器的地址欄會變

網絡解釋:

spring控制器最後返回一個ModelAndView(urlName),其中urNamel可以是一個視圖名稱,由視圖解析器負責解析後將響應流寫回客戶端;也可以通過redirect/forward:url方式轉到另一個控制器進行處理.

  1. redirect方式相當於”response.sendRedirect()”.這種方式外部特徵就是瀏覽器地址欄最後顯示的路徑是轉發後的新的路徑.工作方式是這樣的, 服務器端會首先發一個response給瀏覽器, 然後瀏覽器收到這個response後再發一個requeset給服務器, 然後服務器發新的response給瀏覽器. 這時頁面收到的request是一個新從瀏覽器發來的.這種方式的結果是:

  • A.在轉發前後有兩個不同的request對象,轉發前後的兩個控制器在request上的參數(request.getParameter())和request屬性(request.getAttribute())不能共享;

  • B.如果轉發前後的兩個控制器都配置在spring 攔截器範圍內,這樣攔截器會攔截前後兩個request,即會攔截兩次;

  • C.最後返回到瀏覽器後,因爲地址欄顯示的是轉發後的url,所以刷新頁面時只會執行後面的url映射的控制器.

 

  1. forward方式相當於request.getRequestDispatcher().forward(request,response),這種方式的外部特徵是瀏覽器地址顯示的路徑是轉發前的路徑.工作方式是這樣,forward 發生在服務器內部,在前一個控制器處理完畢後,直接進入下一個控制器處理, 並將最後的response發給瀏覽器. 這種方式的結果是:

  • A.轉發前後是同一個request,後一個控制器可共享前一個控制器的參數與屬性;

  • B.因爲是同一個request,攔截器只會攔截前一個url,如果前一個url在映射時未配置到攔截器攔截,則攔截後一個url,即只攔截一次;

  • C.最後返回到瀏覽器後,因爲地址欄顯示的是轉發前的url,所以刷新頁面時會依次執行前後兩個控制器.

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