跳到主要内容

视图分辨率

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

Spring MVC 定义了 ViewResolverView 接口,这使您能够在浏览器中渲染模型,而不必绑定到特定的视图技术。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()。因此,这个前缀在使用 InternalResourceViewResolverInternalResourceView(对于 JSP)时并没有用处,但如果您使用其他视图技术并仍然希望强制将资源的转发交由 Servlet/JSP 引擎处理,这可能会很有帮助。请注意,您也可以选择链式使用多个视图解析器。

内容协商

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

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

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