视图分辨率
Spring MVC 定义了 ViewResolver
和 View
接口,这使您能够在浏览器中渲染模型,而不必绑定到特定的视图技术。ViewResolver
提供了视图名称与实际视图之间的映射。View
处理在交给特定视图技术之前的数据准备。
下表提供了有关 ViewResolver
层次结构的更多细节:
表 1. ViewResolver 实现
ViewResolver | 描述 |
---|---|
AbstractCachingViewResolver | AbstractCachingViewResolver 的子类缓存它们解析的视图实例。缓存提高了某些视图技术的性能。您可以通过将 cache 属性设置为 false 来关闭缓存。此外,如果您必须在运行时刷新某个视图(例如,当 FreeMarker 模板被修改时),可以使用 removeFromCache(String viewName, Locale loc) 方法。 |
UrlBasedViewResolver | ViewResolver 接口的简单实现,直接将逻辑视图名称解析为 URL,而无需显式的映射定义。如果您的逻辑名称与视图资源的名称直接匹配,而无需任意映射,这种方法是合适的。 |
InternalResourceViewResolver | UrlBasedViewResolver 的便捷子类,支持 InternalResourceView (实际上是 Servlets 和 JSPs)及其子类,如 JstlView 。您可以通过使用 setViewClass(..) 来指定此解析器生成的所有视图的视图类。有关详细信息,请参见 UrlBasedViewResolver javadoc。 |
FreeMarkerViewResolver | UrlBasedViewResolver 的便捷子类,支持 FreeMarkerView 及其自定义子类。 |
ContentNegotiatingViewResolver | ViewResolver 接口的实现,根据请求文件名或 Accept 头解析视图。请参见 内容协商。 |
BeanNameViewResolver | ViewResolver 接口的实现,将视图名称解释为当前应用程序上下文中的 bean 名称。这是一种非常灵活的变体,允许根据不同的视图名称混合和匹配不同的视图类型。每个这样的 View 可以在 XML 或配置类中定义为一个 bean。 |
处理
您可以通过声明多个解析器 bean 来链接视图解析器,并在必要时通过设置 order
属性来指定顺序。请记住,order
属性越高,视图解析器在链中的位置就越晚。
ViewResolver
的合同规定,它可以返回 null 以指示视图未找到。然而,在 JSP 和 InternalResourceViewResolver
的情况下,确定 JSP 是否存在的唯一方法是通过 RequestDispatcher
执行调度。因此,您必须始终将 InternalResourceViewResolver
配置为在视图解析器的整体顺序中最后一个。
重定向
特殊的 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 以获取配置详细信息。