Spring MVC 使用ViewResolver接口解析視圖

2018-07-26 15:39 更新

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

表21.3 視圖解析器

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

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

<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>

若返回一個(gè)test邏輯視圖名,那么該視圖解析器會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到RequestDispatcher,后者會(huì)將請(qǐng)求交給/WEB-INF/jsp/test.jsp視圖去渲染。

如果需要在應(yīng)用中使用多種不同的視圖技術(shù),你可以使用ResourceBundleViewResolver

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

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

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)