天天看點

Spring Web MVC架構(四) 視圖和視圖解析

視圖解析器

在Spring中視圖相關的兩個接口是

ViewResolver

View

兩個接口,

ViewResolver

用于視圖名稱和實際視圖之間的映射,

View

接口用于準備和傳遞資料到實際的視圖。

下面是一些Spring支援的一些

ViewResolver

。對于其他視圖技術(例如Thymeleaf)可能自己實作視圖解析器以便和Spring內建。

功能
AbstractCachingViewResolver 一個抽象視圖,繼承該類可以讓視圖解析器具有緩存功能
XmlViewResolver 接受XML檔案的視圖解析器,預設配置檔案在

/WEB-INF/views.xml

ResourceBundleViewResolver 使用properties配置檔案的視圖解析器,預設配置檔案是類路徑下的

views.properties

UrlBasedViewResolver 一個簡單的視圖解析器,不做任何比對,需要視圖名和實際視圖檔案名相同
InternalResourceViewResolver UrlBasedViewResolver的一個子類,支援Servlet容器的内部類型(JSP、Servlet、以及JSTL等),可以使用setViewClass(..)指定具體的視圖類型
FreeMarkerViewResolver 也是UrlBasedViewResolver的子類,用于FreeMarker視圖技術
ContentNegotiatingViewResolver 用于解析基于請求檔案名或Accept header的視圖

下面是一個

InternalResourceViewResolver

,當我們傳遞一個

index

時,它會添加字首和字尾,最終解析出實際的視圖檔案

WEB-INF/jsp/index.jsp

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

另外Spring支援的幾種視圖還可以使用mvc命名空間簡化。

<mvc:view-resolvers>
    <mvc:freemarker/>
    <mvc:groovy/>
    <mvc:tiles/>
    <mvc:jsp suffix=".jsp"
             prefix="/WEB-INF/jsp/"
             view-class="org.springframework.web.servlet.view.JstlView"/>

</mvc:view-resolvers>
           

可以定義多個視圖解析器,這時候可以使用

order

屬性指定視圖解析的順序,

InternalResourceViewResolver

總是最後一個視圖解析器。

轉發和重定向

在控制器中還可以設定轉發和重定向,概念和Servlet中轉發和重定向類似。在視圖名前添加

redirect:

字首會重定向到該視圖,這樣頁面和URL都會改變。字首

forward:

表示轉發,内容會改變但是URL不會變。

視圖

JSP和JSTL

JSP和JSTL的視圖解析器配置已經在前面說了。這裡就不重複了。

Thymeleaf

是一個新的模闆引擎,和傳統的JSP相比有很多優點:一是基于HTML模闆,是以比JSP更加直接,易于閱讀;二是模闆引擎獨立于Servlet容器,是以可以在非Web環境下運作,也可以用來渲染電子郵件等。Thymeleaf和Spring的支援是由Thymeleaf團隊進行的。

要添加Thymeleaf的支援,首先需要添加Thymeleaf的依賴項。在Gradle中很簡單,由于

thymeleaf-spring4

依賴于

thymeleaf-core

,是以添加

thymeleaf-spring4

就會自動添加

thymeleaf-core

,非常友善。

dependencies {
    compile group: 'org.thymeleaf', name: 'thymeleaf-spring4', version: '3.0.0.RELEASE'
}
           

之後需要配置Thymeleaf的視圖解析器。對于Thymeleaf來說,還需要配置它的視圖引擎和視圖解析器。

<bean id="templateResolver"
      class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver">
    <property name="prefix" value="/WEB-INF/templates/"/>
    <property name="suffix" value=".html"/>
    <property name="templateMode" value="HTML5"/>
</bean>

<bean id="templateEngine"
      class="org.thymeleaf.spring4.SpringTemplateEngine">
    <property name="templateResolver" ref="templateResolver"/>
</bean>
<bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
    <property name="templateEngine" ref="templateEngine"/>
    <property name="order" value="1"/>
    <property name="characterEncoding" value="UTF-8"/>
</bean>
           

然後編寫一個Themeleaf視圖。由于Spring Web MVC的良好的分層,是以我們的代碼完全不用更改就可以使用Thymeleaf視圖。關于Thymeleaf的詳細使用方法參見

其文檔
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首頁</title>
</head>
<body>
<h1>呵呵<span th:text="${name}"></span></h1>
</body>
</html>
           

除了這兩種之外,還有很多常用的視圖技術,例如FreeMarkder、Groovy标記模闆等。它們的使用方法請檢視相應文檔。