所有的 Web 应用的 MVC 框架都提供了一种处理视图的方式。Spring 提供的视图解析器,允许你在浏览器中呈现模型的同时,不依赖任何一种特殊的视图技术。比如现成的,Spring 允许你使用 JSP、FreeMarker 模板和 XSLT 视图。关于如何集成并使用几种不同的视图,见视图技术。
这里有两个对于 Spring 处理视图的方式很重要的接口—— ViewResolver 和 View 。接口 ViewResolver 提供在视图名和实际视图之间的映射。接口 View 对请求进行预处理(addresses the preparation of the request),并把请求递给其中一种视图技术。
使用接口 ViewResolver 解析视图
就像“实现控制器”一节中讨论的那样,Spring Web MVC 控制器中的所有处理方法必须解析为一个逻辑视图名,显式地(比如返回一个字符串或者 View)或者隐式地(比如基于约定)。Spring 中的视图通过一个逻辑视图名来定位,被一个视图解析器解析。Spring中配置可以有好几个视图。下表列出了它们中的大部分,紧接着还有几个例子:
表 1、视图解析器
视图解析器 | 描述 |
---|---|
AbstractCachingViewResolver | 缓存视图的抽象视图解析器。通常,视图在使用前需要先准备好;扩展这个视图解析器要提供缓存。 |
XmlViewResolver | ViewResolver 的实现,接受一个用 XML 写成的配置文件,使用的 DTD 和 Spring 的 XML Bean 工厂一致。缺省配置文件是/WEB-INF/views.xml 。 |
ResourceBundleViewResolver | ViewResolver 的实现,使用 ResourceBundle 中的 Bean 定义,由包(bundle)基础名称指定。典型地,你在一个属性文件中定义包,放在类路径中。缺省文件名是views.properties 。 |
UrlBasedViewResolver | 接口 ViewResolver 的简单实现,它直接影响逻辑视图名称到 URL 的转换,不使用显式地映射定义。This is appropriate if your logical names match the names of your view resources in a straightforward manner, without the need for arbitrary mappings. |
InternalResourceViewResolver | UrlBasedViewResolver 的一个方便的子类,支持 InternalResourceView(事实上是 Servlet 和 JSP)和它的子类,如 JstlView,TilesView。你可以通过使用setViewClass(..) 为所有由这个解析生成的视图指定视图类。详情见 UrlBasedViewResolver 的 JavaDoc。 |
FreeMarkerViewResolver | UrlBasedViewResolver 的一个方便的子类,支持 FreeMarkerView 和它们的自定义子类。 |
ContentNegotiatingViewResolver | 接口 ViewResolver 的实现,解析一个基于请求文件名或者 Accept 头的视图。见“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,然后 RequestDispatcher 发送请求到/WEB-INF/jsp/test.jsp
。
当你需要在一个 Web 应用程序中合并不同的视图技术时,你可以使用 ResourceBundleViewResolver:
<bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
<property name="basename" value="views"/>
<property name="defaultParentView" value="parentView"/>
</bean>
ResourceBundleViewResolver 检查按基本面区分的 ResourceBundle,对每一个它要解析的视图,它都是用属性 [viewname].(class) 的值作为视图类,使用属性 [viewname].url 的值作为视图。这个例子可以在视图技术一章中找到,视图技术一章会详细描述视图技术。就像你能看到的那样,你可以指定一个父视图,所有属性文件中的视图都要从它“拓展”。用这种方法你可以指定一个缺省的视图类。
AbstractCachingViewResolver 的子类可以缓存它们解析的视图实例。缓存为特定的视图技术提高性能。也可以通过设置 cache 属性为 false 来关闭缓存。还有,如果你必须在运行时刷新一个特定的视图(比如一个 FreeMarker 模板被改变了),你可以使用removeFromCache(String viewName, Locale loc)
方法。