Spring 4.x官方參考文件中文版——第21章 Web MVC框架(15)
21.5 檢視的解析
所有web應用的MVC框架都提供了指定檢視地址的方法。Spring提供了檢視解析器,這可以讓你在瀏覽器裡渲染model(模型),而不必與其他檢視技術繫結。不止如此,Spring還允許你使用如:JSP,Velocity模板和XSLT檢視等技術,需要了解更多關於怎樣與不同的檢視技術互動,詳見”第22章 檢視技術”。
Spring裡,處理檢視時最重要的2個介面就是ViewResolver和View。ViewResolver提供了在檢視名和具體檢視之間的對映。View介面是用來預備好指定request請求的地址,並且把請求發到其中一種檢視技術上進行處理。
21.5.1 使用ViewResolver介面進行檢視解析
就像”21.3 實現控制器”一章說到過的,在Spring MVC的Controller裡的所有處理器方法必須解析成檢視名,可以是顯式的(如:指定返回一個String, View或者ModelAndView)或者隱式的(比如:基於慣例來處理),在Spring中的檢視根據檢視名和被檢視解析器解析了的結果來指定檢視的地址。Spring提供了多種試圖解析器,下面的列表列出了大部分,列表之後,有一些例子:
表21.3 檢視解析器
ViewResolver |
描述 |
AbstractCachingViewResolver |
快取檢視的抽象檢視解析器。一般來講,檢視能夠使用前世需要做出準備的;整合這個檢視解析器能夠提供檢視的快取。 |
XmlViewResolver |
使用在有DTD的XML配置檔案(就如Spring的XML bean工廠,預設檔案為/WEB-INF/views.xml)的ViewResolver實現。 |
ResourceBundleViewResolver |
使用在ResourceBundle中bean繫結的基本名稱來定義的ViewResolver的實現。一般來說,你在propertie檔案中來定義這個繫結,並把它放在classpath(類的路徑)中,預設的檔名為views.properties。 |
UrlBasedViewResolver |
ViewResolver介面比較簡單的實現,影響了邏輯檢視名到URL的直接解析,這個解析不需要定義顯式的對映。這比較適合在邏輯檢視名與你的檢視資源名相匹配的情況下使用,這樣就不用顯示地指定映射了。 |
InternalResourceViewResolver |
UrlBasedViewResolver的子類,這個類支援InternalResourceView(在Servlet和JSP下生效),還有InternalResourceView的下屬類,如JstlView和TilesView。你能定義這個檢視類,使用它的setViewClass(..)方法來整合所有檢視。詳見UrlBasedViewResolver的javadoc文件。 |
VelocityViewResolver/ FreeMarkerViewResolver |
UrlBasedViewResolver比較方便的子類,能夠支援VelocityView(對Velocity模板生效)或者FreeMarkerView,並能夠自定義它們的子類。 |
ContentNegotiatingViewResolver |
ViewResolver介面的實現,可以解析基於請求檔名或Accept報頭的檢視,詳見”21.5.4 ContentNegotiaingViewResolver” |
使用JSP作為檢視技術時,可以使用UrlBasedViewResolver。這個檢視解析器可以把檢視名轉換成URL,並把請求發到RequestDispacher來渲染這個檢視。下面是一個例子:
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
當把”test”作為邏輯檢視名返回時,這個試圖解析器把請求forward(轉送)到RequestDispatcher,這會把請求傳送到”/WEB-INF/jsp/test.jsp”上。
在web應用中如果需要結合多種不同的檢視技術時,你可以使用ResourceBundleViewResolver:
<bean id="viewResolver"
class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
<property name="basename" value="views"/>
<property name="defaultParentView" value="parentView"/>
</bean>
ResourceBundleViewResolver能夠根據basename來檢測並分辨不同的ResourceBundle,對於每個需要解析的檢視,它會使用[檢視名].(class)這個樣子的屬性值作為檢視類,[檢視名].url這個樣紙的屬性值作為檢視url。相關例子可以在下一章(介紹檢視技術的一章)中找到。如上所述,你能夠從”extend”這個屬性檔案中的所有視圖裡分辨出檢視的父級。這就可以使你定義一個預設的檢視類。
請注意:
AbstractCachingViewResolver的子類可以快取它所解析的檢視例項。快取能夠改善某些特定的檢視技術的表現。可以通過把cache屬性設定為false來停用快取。除此之外,如果你需要在執行時重新整理特定檢視(比如:當一個Velocity模板被修改了),可以使用removeFromCache(String viewName,Locale loc)方法來實現。