View Resolution
Spring MVC定义了`ViewResolver`和`View`接口,可让你在浏览器中呈现模型,而无需限制到特定的视图技术。`ViewResolver`提供视图名称和实际视图之间的映射。`View`解决在移交到特定视图技术之前对数据进行准备的问题。 下表提供了`ViewResolver`层次结构的更多详细信息:
ViewResolver | Description |
---|---|
|
|
|
|
|
|
|
|
|
`ViewResolver`接口的实现,它根据请求文件名或 `Accept`报头解析视图。参见 Content Negotiation。 |
|
|
Handling
你可以通过声明多个解析器 Bean 来链接视图解析器,如需,可以通过设置`order`属性来指定排序。请记住,排序属性的值越高,视图解析器在链中的位置就越靠后。
ViewResolver
的契约规定,它可以返回 null 以表明无法找到视图。但是,对于 JSP 和 InternalResourceViewResolver
,找出 JSP 是否存在的唯一方法是通过`RequestDispatcher`执行调度。因此,你必须始终将`InternalResourceViewResolver`配置为视图解析器的整体顺序中的最后一个。
配置视图解析与向您的 Spring 配置添加 ViewResolver
Bean 一样简单。MVC Config 为 View Resolvers 提供了一个专门的配置 API,并用于添加无逻辑 View Controllers,它们对于在没有控制器逻辑的情况下进行 HTML 模板渲染非常有用。
Redirecting
视图名称中的特殊`redirect:`前缀使你可以执行重定向。UrlBasedViewResolver
(及其子类)将这识别为需要重定向的说明。视图名称的其余部分是重定向 URL。
其最终效果与控制器已返回`RedirectView`相同,但现在控制器本身可以根据逻辑视图名称进行操作。逻辑视图名称(比如`redirect:/myapp/some/resource`)相对于当前 Servlet 上下文重定向,而`redirect:https://myhost.com/some/arbitrary/path`这样的名称则重定向到绝对 URL。
Forwarding
还可以对最终由`UrlBasedViewResolver`及其子类解析的视图名称使用特殊的`forward:`前缀。这会创建一个`InternalResourceView`,该视图会执行`RequestDispatcher.forward()。因此,此前缀对`InternalResourceViewResolver`和`InternalResourceView
(对于 JSP)无用,但如果你使用其他视图技术但仍想强制转发资源以供 Servlet/JSP 引擎处理,它可能会有所帮助。请注意,你也可以链接多个视图解析器。
Content Negotiation
ContentNegotiatingViewResolver
自身不会解析视图,而是将任务委托给其他视图解析器并选择与客户端请求的表示相似的视图。表示可以从 Accept
头部或查询参数(例如 "/path?format=pdf"
)中确定。
ContentNegotiatingViewResolver`通过将请求媒体类型与与其各个`ViewResolver`关联的`View`支持的媒体类型(也称为`Content-Type
)进行比较来选择适合处理请求的`View`。列表中第一个具有兼容`Content-Type`的`View`向客户端返回表示。如果`ViewResolver`链无法提供兼容的视图,则咨询通过`DefaultViews`属性指定的视图列表。后一种选择适用于独立`View`,这些`View`可以呈现当前资源的适当表示,无论逻辑视图名称如何。Accept`标头可以包含通配符(例如`text/*
),在这种情况下,`Content-Type`为`text/xml`的`View`是兼容匹配项。
有关配置详细信息,请参见 MVC Config 下的 View Resolvers。