视图解析

Spring MVC定义了ViewResolverView接口,让您能够在浏览器中呈现模型,而不会将您限制在特定的视图技术上。ViewResolver提供了视图名称和实际视图之间的映射。View处理在将数据交给特定视图技术之前的准备工作。

以下表格提供了关于ViewResolver层次结构的更多细节:

表1. ViewResolver实现
ViewResolver 描述

AbstractCachingViewResolver

AbstractCachingViewResolver的子类缓存它们解析的视图实例。缓存可以提高某些视图技术的性能。您可以通过将cache属性设置为false来关闭缓存。此外,如果必须在运行时刷新某个特定视图(例如,当修改FreeMarker模板时),可以使用removeFromCache(String viewName, Locale loc)方法。

UrlBasedViewResolver

UrlBasedViewResolverViewResolver接口的简单实现,可以直接将逻辑视图名称解析为URL,无需显式映射定义。如果您的逻辑名称与视图资源的名称直接匹配,而无需任意映射,则这是合适的。

InternalResourceViewResolver

InternalResourceViewResolverUrlBasedViewResolver的便捷子类,支持InternalResourceView(实际上是Servlets和JSPs)以及JstlView等子类。您可以通过使用setViewClass(..)为此解析器生成的所有视图指定视图类。有关详细信息,请参阅UrlBasedViewResolver的javadoc。

FreeMarkerViewResolver

FreeMarkerViewResolverUrlBasedViewResolver的便捷子类,支持FreeMarkerView和它们的自定义子类。

ContentNegotiatingViewResolver

ContentNegotiatingViewResolverViewResolver接口的实现,根据请求文件名或Accept头解析视图。请参阅内容协商

BeanNameViewResolver

BeanNameViewResolverViewResolver接口的实现,将视图名称解释为当前应用程序上下文中的bean名称。这是一种非常灵活的变体,允许根据不同的视图名称混合和匹配不同的视图类型。每个这样的View可以被定义为一个bean,例如在XML中或配置类中。

处理

您可以通过声明多个解析器bean并在必要时设置order属性来链接视图解析器。请记住,order属性值越高,视图解析器在链中的位置就越靠后。

ViewResolver的契约规定它可以返回null以指示找不到视图。但是,在JSP和InternalResourceViewResolver的情况下,确定JSP是否存在的唯一方法是通过RequestDispatcher执行分派。因此,您必须始终将InternalResourceViewResolver配置为在所有视图解析器的整体顺序中处于最后位置。

配置视图解析非常简单,只需将ViewResolver bean添加到您的Spring配置中。 MVC配置提供了专用的配置API用于视图解析器和用于添加无逻辑的视图控制器的逻辑,这对于在没有控制器逻辑的情况下进行HTML模板渲染非常有用。

重定向

在视图名称中使用特殊的redirect:前缀可以执行重定向。UrlBasedViewResolver(及其子类)将此识别为需要重定向的指令。视图名称的其余部分是重定向URL。

其效果与控制器返回RedirectView相同,但现在控制器本身可以根据逻辑视图名称操作。逻辑视图名称(例如redirect:/myapp/some/resource)相对于当前Servlet上下文进行重定向,而名称(例如redirect:https://myhost.com/some/arbitrary/path)将重定向到绝对URL。

转发

您还可以使用特殊的forward:前缀来指定由UrlBasedViewResolver及其子类最终解析的视图名称。这将创建一个InternalResourceView,它执行RequestDispatcher.forward()。因此,此前缀对于InternalResourceViewResolverInternalResourceView(用于JSP)没有用处,但如果您使用另一种视图技术但仍希望强制将资源的转发处理交给Servlet/JSP引擎,则此前缀可能会有所帮助。请注意,您也可以链式使用多个视图解析器。

内容协商

ContentNegotiatingViewResolver本身不解析视图,而是委托给其他视图解析器,并选择与客户端请求的表示形式相似的视图。表示形式可以从Accept头部或查询参数(例如,"/path?format=pdf")中确定。

ContentNegotiatingViewResolver通过将请求的媒体类型与每个ViewResolvers关联的View支持的媒体类型(也称为Content-Type)进行比较,选择适当的View来处理请求。列表中具有兼容Content-Type的第一个View将向客户端返回表示形式。如果ViewResolver链无法提供兼容的视图,则将查阅通过DefaultViews属性指定的视图列表。后一种选项适用于可以呈现当前资源的适当表示形式的单例Views,而不考虑逻辑视图名称。Accept头部可以包含通配符(例如text/*),在这种情况下,其Content-Typetext/xmlView是兼容的匹配项。

有关配置详细信息,请参阅视图解析器下的MVC配置