解析视图
简介
所有用于Web应用程序的MVC框架都提供了一种处理视图的方法。Spring 提供了视图解析器(View Resolver),使您可以在浏览器中渲染模型,而无需绑定到特定的视图技术。Spring 内置支持使用 JSP、Velocity 模板和 XSLT 视图等。例如,有关如何集成和使用多种不同的视图技术,请参阅第23章“视图技术”。
在 Spring 处理视图的方式中,两个重要的接口是 ViewResolver
和 View
。
- ViewResolver:提供视图名称与实际视图之间的映射。
- View:处理请求的准备工作,并将请求交给某种视图技术。
Resolving views with the ViewResolver interface
使用 ViewResolver 接口解析视图
正如在“实现控制器”一节中讨论的那样,Spring Web MVC 控制器中的所有处理方法都必须解析为逻辑视图名称,可以是显式的(例如,返回一个字符串、视图或 ModelAndView)或隐式的(基于约定)。在 Spring 中,视图通过逻辑视图名称来处理,并由视图解析器解析。Spring 提供了相当多的视图解析器。下表列出了大部分视图解析器,并附带了一些示例。
表 22.3 视图解析器
ViewResolver | 描述 |
---|---|
AbstractCachingViewResolver | 抽象视图解析器,缓存视图。通常在视图使用前需要准备,扩展此视图解析器可提供缓存功能。 |
XmlViewResolver | 接受一个用 XML 编写的配置文件的 ViewResolver 实现,配置文件的 DTD 与 Spring 的 XML bean 工厂相同。默认配置文件为 /WEB-INF/views.xml。 |
ResourceBundleViewResolver | 使用 ResourceBundle 中的 bean 定义的 ViewResolver 实现,通过基础名指定的 bundle 通常在类路径下定义。默认文件名为 views.properties。 |
UrlBasedViewResolver | 简单实现的 ViewResolver 接口,将逻辑视图名称直接解析为 URL,无需显式的映射定义。适用于逻辑名称与视图资源名称简单对应的情况。 |
InternalResourceViewResolver | UrlBasedViewResolver 的便捷子类,支持 InternalResourceView(实际上是 Servlets 和 JSP)及其子类如 JstlView 和 TilesView。 |
VelocityViewResolver / FreeMarkerViewResolver | UrlBasedViewResolver 的便捷子类,分别支持 VelocityView(实际上是 Velocity 模板)或 FreeMarkerView 及其自定义子类。 |
ContentNegotiatingViewResolver | 根据请求文件名或 Accept 头解析视图的 ViewResolver 实现。参见第22.5.4节“ContentNegotiatingViewResolver”。 |
示例
以 JSP 作为视图技术为例,可以使用 UrlBasedViewResolver
。此视图解析器将视图名称翻译为 URL,并将请求交给 RequestDispatcher
来渲染视图。
<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
作为逻辑视图名称时,此视图解析器会将请求转发到 RequestDispatcher
,它将请求发送到 /WEB-INF/jsp/test.jsp
。
组合不同的视图技术
在 Web 应用程序中组合不同的视图技术时,可以使用 ResourceBundleViewResolver
:
<bean id="viewResolver"
class="org.springframework.web.servlet.view.ResourceBundleViewResolver">