Spring MVC 使用ViewResolver接口解析視圖

2018-07-26 15:39 更新

正如在Spring MVC 控制器的實現(xiàn)一節(jié)中所討論的,Spring MVC中所有控制器的處理器方法都必須返回一個邏輯視圖的名字,無論是顯式返回(比如返回一個String、View或者ModelAndView)還是隱式返回(比如基于約定的返回)。Spring中的視圖由一個視圖名標識,并由視圖解析器來渲染。Spring有非常多內(nèi)置的視圖解析器。下表列出了大部分,表后也給出了一些例子。

表21.3 視圖解析器

視圖解析器描述
AbstractCachingViewResolver一個抽象的視圖解析器類,提供了緩存視圖的功能。通常視圖在能夠被使用之前需要經(jīng)過準備。繼承這個基類的視圖解析器即可以獲得緩存視圖的能力。
XmlViewResolver視圖解析器接口ViewResolver的一個實現(xiàn),該類接受一個XML格式的配置文件。該XML文件必須與Spring XML的bean工廠有相同的DTD。默認的配置文件名是/WEB-INF/views.xml。
ResourceBundleViewResolver視圖解析器接口ViewResolver的一個實現(xiàn),采用bundle根路徑所指定的ResourceBundle中的bean定義作為配置。一般bundle都定義在classpath路徑下的一個配置文件中。默認的配置文件名為views.properties。
UrlBasedViewResolverViewResolver接口的一個簡單實現(xiàn)。它直接使用URL來解析到邏輯視圖名,除此之外不需要其他任何顯式的映射聲明。如果你的邏輯視圖名與你真正的視圖資源名是直接對應的,那么這種直接解析的方式就很方便,不需要你再指定額外的映射。
InternalResourceViewResolverUrlBasedViewResolver的一個好用的子類。它支持內(nèi)部資源視圖(具體來說,Servlet和JSP)、以及諸如JstlViewTilesView等類的子類。You can specify the view class for all views generated by this resolver by using setViewClass(..)。更多的細節(jié),請見UrlBasedViewResolver類的java文檔。
VelocityViewResolver / FreeMarkerViewResolverUrlBasedViewResolver下的實用子類,支持Velocity視圖VelocityView(Velocity模板)和FreeMarker視圖FreeMarkerView以及它們對應子類。
ContentNegotiatingViewResolver視圖解析器接口ViewResolver的一個實現(xiàn),它會根據(jù)所請求的文件名或請求的Accept頭來解析一個視圖。更多細節(jié)請見Spring MVC 內(nèi)容協(xié)商視圖解析器一小節(jié)。

我們可以舉個例子,假設這里使用的是JSP視圖技術,那么我們可以使用一個基于URL的視圖解析器UrlBasedViewResolver。這個視圖解析器會將URL解析成一個視圖名,并將請求轉交給請求分發(fā)器來進行視圖渲染。

<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邏輯視圖名,那么該視圖解析器會將請求轉發(fā)到RequestDispatcher,后者會將請求交給/WEB-INF/jsp/test.jsp視圖去渲染。

如果需要在應用中使用多種不同的視圖技術,你可以使用ResourceBundleViewResolver

<bean id="viewResolver"
        class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
    <property name="basename" value="views"/>
    <property name="defaultParentView" value="parentView"/>
</bean>

ResourceBundleViewResolver會檢索由bundle根路徑下所配置的ResourceBundle,對于每個視圖而言,其視圖類由[viewname].(class)屬性的值指定,其視圖url由[viewname].url屬性的值指定。下一節(jié)將詳細講解視圖技術,你可以在那里找到更多例子。你還可以看到,視圖還允許有基視圖,即properties文件中所有視圖都“繼承”的一個文件。通過繼承技術,你可以為眾多視圖指定一個默認的視圖基類。

AbstractCachingViewResolver的子類能夠緩存已經(jīng)解析過的視圖實例。關閉緩存特性也是可以的,只需要將cache屬性設置為false即可。另外,如果實在需要在運行時刷新某個視圖(比如修改了Velocity模板時),你可以使用removeFromCache(String viewName, Locale loc)方法。`


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號