Spring MVC 視圖鏈

2018-07-26 14:11 更新

Spring支持同時(shí)使用多個(gè)視圖解析器。因此,你可以配置一個(gè)解析器鏈,并做更多的事比如,在特定條件下覆寫(xiě)一個(gè)視圖等。你可以通過(guò)把多個(gè)視圖解析器設(shè)置到應(yīng)用上下文(application context)中的方式來(lái)串聯(lián)它們。如果需要指定它們的次序,那么設(shè)置order屬性即可。請(qǐng)記住,order屬性的值越大,該視圖解析器在鏈中的位置就越靠后。

在下面的代碼例子中,視圖解析器鏈中包含了兩個(gè)解析器:一個(gè)是InternalResourceViewResolver,它總是自動(dòng)被放置在解析器鏈的最后;另一個(gè)是XmlViewResolver,它用來(lái)指定Excel視圖。InternalResourceViewResolver不支持Excel視圖。

<bean id="jspViewResolver" 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>

<bean id="excelViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
    <property name="order" value="1"/>
    <property name="location" value="/WEB-INF/views.xml"/>
</bean>

<!-- in views.xml -->

<beans>
    <bean name="report" class="org.springframework.example.ReportExcelView"/>
</beans>

如果一個(gè)視圖解析器不能返回一個(gè)視圖,那么Spring會(huì)繼續(xù)檢查上下文中其他的視圖解析器。此時(shí)如果存在其他的解析器,Spring會(huì)繼續(xù)調(diào)用它們,直到產(chǎn)生一個(gè)視圖返回為止。如果最后所有視圖解析器都不能返回一個(gè)視圖,Spring就拋出一個(gè)ServletException。

視圖解析器的接口清楚聲明了,一個(gè)視圖解析器是可以返回null值的,這表示不能找到任何合適的視圖。并非所有的視圖解析器都這么做,但是也存在不得不如此的場(chǎng)景,即解析器確實(shí)無(wú)法檢測(cè)對(duì)應(yīng)的視圖是否存在。比如,InternalResourceViewResolver在內(nèi)部使用了RequestDispatcher,并且進(jìn)入分派過(guò)程是檢測(cè)一個(gè)JSP視圖是否存在的唯一方法,但這個(gè)過(guò)程僅可能發(fā)生唯一一次。同樣的VelocityViewResolver和部分其他的視圖解析器也存在這樣的情況。具體的請(qǐng)查閱某個(gè)特定的視圖解析器的Java文檔,看它是否會(huì)report不存在的視圖。因此,如果不把InternalResourceViewResolver放置在解析器鏈的最后,將可能導(dǎo)致解析器鏈無(wú)法完全執(zhí)行,因?yàn)?code>InternalResourceViewResolver永遠(yuǎn)都會(huì) 返回一個(gè)視圖。


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)