Spring 支持多个视图解析器。因此,你可以串连解析器,并且在特定的情况下重写指定视图。你可以通过在应用程序上下文中添加多个视图解析器来把它们串连起来,并且如果有必要的话,也可以设置 order 属性来指定顺序。注意,order 属性值越大,视图解析器在链中的位置越靠后。
在下面的例子中,视图解析器链由两个解析器组成:InternalResourceViewResolver 永远都被自动放到解析器链的末端;XmlViewResolver 用于指定 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>
如果一个视图解析器没有找到视图,Spring 就会检查上下文中的其他视图解析器。如果有其他视图解析器存在,继续用它们寻找视图,直到找到一个视图位置。如果最终也找不到视图,Spring 会抛出一个 ServletException。
视图解析器约定指出,一个视图可以返回 null 来指定找不到的视图。不是所有的视图解析器都这么做,因为在一些情况下,视图不能简单地检测视图是否存在。例如,InternalResourceViewResolver 在内部使用 RequestDispatcher,调度(dispatching)是计算 JSP 是否存在的唯一方法,但是这个动作只能执行一次。这中情况在 FreeMarkerViewResolver 和其他视图中也存在。可以在特定视图解析器的 JavaDoc 中查看它是否报告不存在的视图。所以,把 InternalResourceViewResolver 放在链中的某个地方而不是最后,因为 InternalResourceViewResolver 总会返回一个视图!