视图解析

Spring MVC 定义了 ViewResolverView 接口,允许你在浏览器中渲染模型,而无需绑定到特定的视图技术。ViewResolver 提供了视图名称和实际视图之间的映射。View 负责在移交给特定视图技术之前准备数据。 下表提供了 ViewResolver 层次结构的更多详细信息:

Table 1. ViewResolver 实现
ViewResolver 描述

AbstractCachingViewResolver

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

UrlBasedViewResolver

ViewResolver 接口的简单实现,它在没有显式映射定义的情况下, 将逻辑视图名称直接解析为 URL。 如果你的逻辑名称以直接的方式与视图资源的名称匹配,而不需要任意映射, 则此方法是合适的。

InternalResourceViewResolver

UrlBasedViewResolver 的便捷子类,支持 InternalResourceView(实际上是 Servlet 和 JSP)及其子类,例如 JstlView。你可以使用 setViewClass(..) 为此解析器 生成的所有视图指定视图类。 有关详细信息,请参阅 UrlBasedViewResolver javadoc。

FreeMarkerViewResolver

UrlBasedViewResolver 的便捷子类,支持 FreeMarkerView 及其自定义子类。

ContentNegotiatingViewResolver

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

BeanNameViewResolver

ViewResolver 接口的实现,它将视图名称解释为当前应用程序上下文中的 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。

转发

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

内容协商

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

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

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