跳到主要内容
版本:6.2.3

视图分辨率

ChatGPT-4o-mini 中英对照 View Resolution

Spring MVC 定义了 ViewResolver 和 View 接口,这使您能够在浏览器中渲染模型,而不必绑定到特定的视图技术。ViewResolver 提供了视图名称与实际视图之间的映射。View 处理在交给特定视图技术之前的数据准备。

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

表 1. ViewResolver 实现

ViewResolver描述
AbstractCachingViewResolverAbstractCachingViewResolver 的子类缓存它们解析的视图实例。缓存提高了某些视图技术的性能。您可以通过将 cache 属性设置为 false 来关闭缓存。此外,如果您必须在运行时刷新某个视图(例如,当 FreeMarker 模板被修改时),可以使用 removeFromCache(String viewName, Locale loc) 方法。
UrlBasedViewResolverViewResolver 接口的简单实现,直接将逻辑视图名称解析为 URL,而无需显式的映射定义。如果您的逻辑名称与视图资源的名称直接匹配,而无需任意映射,这种方法是合适的。
InternalResourceViewResolverUrlBasedViewResolver 的便捷子类,支持 InternalResourceView(实际上是 Servlets 和 JSPs)及其子类,如 JstlView。您可以通过使用 setViewClass(..) 来指定此解析器生成的所有视图的视图类。有关详细信息,请参见 UrlBasedViewResolver javadoc。
FreeMarkerViewResolverUrlBasedViewResolver 的便捷子类,支持 FreeMarkerView 及其自定义子类。
ContentNegotiatingViewResolverViewResolver 接口的实现,根据请求文件名或 Accept 头解析视图。请参见 内容协商。
BeanNameViewResolverViewResolver 接口的实现,将视图名称解释为当前应用程序上下文中的 bean 名称。这是一种非常灵活的变体,允许根据不同的视图名称混合和匹配不同的视图类型。每个这样的 View 可以在 XML 或配置类中定义为一个 bean。

处理​

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

ViewResolver 的合同规定,它可以返回 null 以指示视图未找到。然而,在 JSP 和 InternalResourceViewResolver 的情况下,确定 JSP 是否存在的唯一方法是通过 RequestDispatcher 执行调度。因此,您必须始终将 InternalResourceViewResolver 配置为在视图解析器的整体顺序中最后一个。

配置视图解析器就像在你的 Spring 配置中添加 ViewResolver bean 一样简单。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()。因此,这个前缀在使用 InternalResourceViewResolver 和 InternalResourceView(对于 JSP)时并没有用处,但如果您使用其他视图技术并仍然希望强制将资源的转发交由 Servlet/JSP 引擎处理,这可能会很有帮助。请注意,您也可以选择链式使用多个视图解析器。

内容协商​

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

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

请参阅 MVC Config 下的 View Resolvers 以获取配置详细信息。