对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

视图解析

Spring MVC 定义了 ViewResolverView 接口,使你能够在浏览器中渲染模型,而无需绑定到特定的视图技术。ViewResolver 提供了视图名称与实际视图之间的映射关系。View 负责在将数据交给特定视图技术之前进行数据准备。spring-doc.cadn.net.cn

下表提供了有关ViewResolver层次结构的更多详细信息:spring-doc.cadn.net.cn

表1. ViewResolver 实现类
视图解析器 <description> </description>

AbstractCachingViewResolverspring-doc.cadn.net.cn

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

UrlBasedViewResolverspring-doc.cadn.net.cn

ViewResolver 接口的一个简单实现,它直接将逻辑视图名称解析为 URL,而无需显式定义映射关系。 如果你的逻辑名称与视图资源的名称以一种直接的方式相匹配,且不需要任意的映射关系,那么这种实现是合适的。spring-doc.cadn.net.cn

InternalResourceViewResolverspring-doc.cadn.net.cn

UrlBasedViewResolver 的便捷子类,支持 InternalResourceView(实际上是 Servlet 和 JSP)以及诸如 JstlView 之类的子类。您可以通过使用 setViewClass(..) 来指定由此解析器生成的所有视图的视图类。 有关详细信息,请参阅 UrlBasedViewResolver 的 Javadoc。spring-doc.cadn.net.cn

FreeMarkerViewResolverspring-doc.cadn.net.cn

UrlBasedViewResolver 的一个便捷子类,支持 FreeMarkerView 及其自定义子类。spring-doc.cadn.net.cn

ContentNegotiatingViewResolverspring-doc.cadn.net.cn

实现 ViewResolver 接口的类,它根据请求的文件名或 Accept 请求头来解析视图。参见内容协商spring-doc.cadn.net.cn

BeanNameViewResolverspring-doc.cadn.net.cn

实现 ViewResolver 接口的一种方式,它将视图名称解释为当前应用上下文中的 Bean 名称。这是一种非常灵活的变体,允许根据不同的视图名称混合搭配多种视图类型。 每个这样的 View 都可以定义为一个 Bean,例如在 XML 文件中或配置类中。spring-doc.cadn.net.cn

处理

你可以通过声明多个解析器 bean 来链接视图解析器,并在必要时设置 order 属性以指定顺序。请记住,1 属性值越大,该视图解析器在链中的位置就越靠后。spring-doc.cadn.net.cn

ViewResolver 的契约规定,当视图未找到时,它可以返回 null。然而,对于 JSP 和 InternalResourceViewResolver 而言,判断一个 JSP 是否存在的唯一方法是通过 RequestDispatcher 执行一次分发(dispatch)。因此,您必须始终将 InternalResourceViewResolver 配置为所有视图解析器中的最后一个。spring-doc.cadn.net.cn

配置视图解析器就像向您的 Spring 配置中添加 ViewResolver Bean 一样简单。MVC 配置 提供了专门的配置 API,用于配置视图解析器以及添加无逻辑的视图控制器,后者在无需控制器逻辑的情况下渲染 HTML 模板时非常有用。spring-doc.cadn.net.cn

正在重定向

视图名称中的特殊 redirect: 前缀可让你执行重定向。UrlBasedViewResolver(及其子类)会将此识别为需要进行重定向的指令。视图名称的其余部分即为重定向 URL。spring-doc.cadn.net.cn

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

转发

你还可以在视图名称中使用特殊的 forward: 前缀,该前缀最终由 UrlBasedViewResolver 及其子类进行解析。这会创建一个 InternalResourceView,它会执行 RequestDispatcher.forward()。 因此,当你使用 InternalResourceViewResolverInternalResourceView(用于 JSP)时,该前缀并无实际用处;但如果你使用了其他视图技术,却仍希望强制将资源转发给 Servlet/JSP 引擎处理,那么这个前缀就很有帮助。请注意,你也可以选择将多个视图解析器串联使用。spring-doc.cadn.net.cn

内容协商

ContentNegotiatingViewResolver 本身不解析视图,而是将请求委托给其他视图解析器,并选择与客户端所请求的表示形式最匹配的视图。该表示形式可以从 Accept 头部或查询参数(例如 "/path?format=pdf")中确定。spring-doc.cadn.net.cn

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

有关配置详情,请参见MVC 配置下的视图解析器spring-doc.cadn.net.cn