视图解析

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,并为添加无逻辑视图控制器提供了帮助,这些控制器对于无需控制器逻辑的 HTML 模板渲染非常有用。

重定向

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

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

转发

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

内容协商

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

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

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

© . This site is unofficial and not affiliated with VMware.