SpringMVC中的視圖和視圖解析器


對於控制器的目標方法,無論其返回值是String、View、ModelMap或是ModelAndView,SpringMVC都會在內部將它們封裝為一個ModelAndView對象進行返回。 
   Spring MVC 借助視圖解析器(ViewResolver)得到最終的視圖對象(View),最終的視圖可以是JSP也可是Excell、 
JFreeChart等各種表現形式的視圖。

SpringMVC的視圖解析流程

  SpringMVC的視圖解析流程為: 
   
1、調用目標方法,SpringMVC將目標方法返回的String、View、ModelMap或是ModelAndView都轉換為一個ModelAndView對象;

2、然后通過視圖解析器(ViewResolver)對ModelAndView對象中的View對象進行解析,將該邏輯視圖View對象解析為一個物理視圖View對象;

3、最后調用物理視圖View對象的render()方法進行視圖渲染,得到響應結果。

視圖(View)

  視圖的作用是渲染模型數據,將模型里的數據以某種形式呈現給客戶。 
  為了實現視圖模型和具體實現技術的解耦,Spring在org.springframework.web.servlet包中定義了一個高度抽象的View接口。 
  視圖對象由視圖解析器負責實例化。由於視圖是無狀態的,所以他們不會有線程安全的問題。所謂視圖是無狀態的,是指對於每一個請求,都會創建一個View對象。 
  JSP是最常見的視圖技術。 
   
  常用的視圖實現類: 
  image_1b1ce221b11hn6kv3pv1jj4kcm9.png-351.2kB

視圖解析器(ViewResolver)

  視圖解析器的作用是將邏輯視圖轉為物理視圖,所有的視圖解析器都必須實現ViewResolver接口。 
   SpringMVC為邏輯視圖名的解析提供了不同的策略,可以在Spring WEB上下文中配置一種或多種解析策略,並指定他們之間的先后順序。每一種映射策略對應一個具體的視圖解析器實現類。程序員可以選擇一種視圖解析器或混用多種視圖解析器。可以通過order屬性指定解析器的優先順序,order越小優先級越高,SpringMVC會按視圖解析器順序的優先順序對邏輯視圖名進行解析,直到解析成功並返回視圖對象,否則拋出ServletException異常。 
   
   常用的視圖解析器實現類: 
   image_1b1ce6cmvcq619dl1fv19i3fg29.png-264.4kB
   
   以下是通過InternalResourceViewResolver作為視圖解析器解析,將邏輯視圖解析為JSP視圖的實例:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property> </bean>

  若項目中使用了JSTL,則SpringMVC會自動把視圖由InternalResourceView轉為JstlView。 
  

使用mvc:view-controller不經控制器直接跳轉到頁面

  若希望直接響應通過SpringMVC渲染的頁面,可以使用mvc:view-controller標簽實現:

  <!-- 配置直接轉發的頁面 --> <!-- 可以直接相應轉發的頁面, 而無需再經過 Handler 的方法. --> <mvc:view-controller path="/success" view-name="success"/> 

  那么現在可以直接在某一頁面中通過請求路徑”success”訪問到/WEB-INF/views/success.jsp頁面(因為我們上面配置了視圖解析器將邏輯視圖解析為前綴為/WEB-INF/views/,后綴為.jsp的物理視圖)。但是,這種情況下通過控制器就無法映射到請求了,需要再進行如下配置:

    <!-- 在實際開發中通常都需配置 mvc:annotation-driven 標簽, 之前的頁面才不會因為配置了直接轉發頁面而受到影響 --> <mvc:annotation-driven></mvc:annotation-driven> 

關於重定向

  一般情況下,控制器方法返回字符串類型的值會被當成邏輯視圖名處理,但如果返回的字符串中帶forward:或redirect:前綴時,SpringMVC會對它們進行特殊處理:將forward: 和redirect: 當成指示符,其后的字符串作為URL 來處理。示例如下: 
   
index.jsp:

<a href="${pageContext.request.contextPath }/springmvc/testRedirect">Test Redirect</a>

controller:

@Controller @RequestMapping("/springmvc") public class SpringMVCTest { @RequestMapping("/testRedirect") public String testRedirect() { System.out.println("testRedirect"); return "redirect:/index.jsp"; } }

即可重定向到index.jsp。也可在redirect:/后添加控制器方法的映射路徑,重定向到該目標方法。


免責聲明!

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



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