视图解析
Spring MVC 定义了 `ViewResolver` 和 `View` 接口,允许您在浏览器中渲染模型,而无需绑定到特定的视图技术。`ViewResolver` 提供了视图名称和实际视图之间的映射。`View` 负责在将数据交给特定视图技术之前准备数据。
下表提供了关于 `ViewResolver` 层次结构的更多详细信息
ViewResolver | 描述 |
---|---|
|
`AbstractCachingViewResolver` 的子类会缓存它们解析的视图实例。缓存提高了某些视图技术的性能。您可以通过将 `cache` 属性设置为 `false` 来关闭缓存。此外,如果您必须在运行时刷新某个视图(例如,当 FreeMarker 模板被修改时),您可以使用 `removeFromCache(String viewName, Locale loc)` 方法。 |
|
`ViewResolver` 接口的简单实现,它直接将逻辑视图名称解析为 URL,无需显式映射定义。如果您的逻辑名称以直接的方式与视图资源的名称匹配,并且无需任意映射,则这种实现是合适的。 |
|
`UrlBasedViewResolver` 的便捷子类,支持 `InternalResourceView`(实际上是 Servlets 和 JSP)以及 `JstlView` 等子类。您可以通过使用 `setViewClass(..)` 为此解析器生成的所有视图指定视图类。有关详细信息,请参阅 `UrlBasedViewResolver` 的 Javadoc。 |
|
`UrlBasedViewResolver` 的便捷子类,支持 `FreeMarkerView` 及其自定义子类。 |
|
`ViewResolver` 接口的实现,根据请求文件名或 `Accept` 头解析视图。请参阅 内容协商。 |
|
`ViewResolver` 接口的实现,它将视图名称解释为当前应用上下文中的 bean 名称。这是一种非常灵活的变体,允许根据不同的视图名称混合和匹配不同的视图类型。每个此类 `View` 都可以定义为一个 bean,例如,在 XML 或配置类中。 |
处理
您可以通过声明多个解析器 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。
转发
您还可以为最终由 UrlBasedViewResolver
及其子类解析的视图名称使用特殊的 forward:
前缀。这会创建一个 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
是一个兼容的匹配项。