视图解析

Spring MVC 定义了ViewResolverView接口,允许您在浏览器中渲染模型,而无需绑定到特定的视图技术。ViewResolver提供视图名称和实际视图之间的映射。View负责在移交给特定视图技术之前准备数据。

下表提供了有关ViewResolver层次结构的更多详细信息

表 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,以及用于添加无逻辑视图控制器的 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 配置下的视图解析器