視圖解析器
在Spring中視圖相關的兩個接口是
ViewResolver
和
View
兩個接口,
ViewResolver
用于視圖名稱和實際視圖之間的映射,
View
接口用于準備和傳遞資料到實際的視圖。
下面是一些Spring支援的一些
ViewResolver
。對于其他視圖技術(例如Thymeleaf)可能自己實作視圖解析器以便和Spring內建。
功能 | |
---|---|
AbstractCachingViewResolver | 一個抽象視圖,繼承該類可以讓視圖解析器具有緩存功能 |
XmlViewResolver | 接受XML檔案的視圖解析器,預設配置檔案在 |
ResourceBundleViewResolver | 使用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标記模闆等。它們的使用方法請檢視相應文檔。