1. 程式人生 > >SpringMVC中的檢視和檢視解析器

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:/後新增控制器方法的對映路徑,重定向到該目標方法。