SpringMvc(4-1)Spring MVC 中的 forward 和 redirect


        Spring MVC 中,我們在返回邏輯視圖時,框架會通過 viewResolver 來解析得到具體的 View,然后向瀏覽器渲染。通過配置,我們配置某個 ViewResolver 如下: 

  
Xml代碼   收藏代碼
  1. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  2.     <description>  
  3.         假如邏輯試圖名為 "hello",因此 viewResolver 將解析成 /WEB-INF/jsp/hello.jsp  
  4.     </description>  
  5.     <property name="order" value="10" />  
  6.     <property name="prefix" value="/WEB-INF/jsp/" />  
  7.     <property name="suffix" value=".jsp" />  
  8. </bean>  
    
  • 如果邏輯視圖名為 hello,框架通過 forward 的方式轉發到了 /WEB-INF/jsp/hello.jsp。
  • 如果邏輯視圖名是 /hello,框架還是轉發到了 /WEB-INF/jsp/hello.jsp,即 /WEB-INF/jsp//hello.jsp 等同於 /WEB-INF/jsp/hello.jsp。 

        現在有個問題, 如果 /hello 就是某個 controller 的映射,我想轉發到這個 controller,怎么辦
        我們可以通過forward 前綴來達到轉發到其它資源的目的: 

Java代碼   收藏代碼
  1. public String handle() {  
  2.     // return "forward:/hello" => 轉發到能夠匹配 /hello 的 controller 上  
  3.     // return "hello" => 實際上還是轉發,只不過是框架會找到該邏輯視圖名對應的 View 並渲染  
  4.     // return "/hello" => 同 return "hello"  
  5.     return "forward:/hello";  
  6. }  

        同理,如果我們想重定向到某個資源,我們可以通過  redirect 前綴來達到重定向到其它資源的目的: 
Java代碼   收藏代碼
  1. public String handle() {  
  2.     // 重定向到 /hello 資源  
  3.     return "redirect:/hello";  
  4. }  

下面是關於redirect和forward方式的區別:

  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,所以刷新頁面時會依次執行前后兩個控制器. 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM