|
对于最新稳定版本,请使用 Spring Framework 7.0.6! |
视图解析
Spring MVC 定义了 ViewResolver 和 View 接口,使你能够在浏览器中渲染模型,而无需绑定到特定的视图技术。ViewResolver 提供了视图名称与实际视图之间的映射关系。View 负责在将数据交给特定视图技术之前进行数据准备。
下表提供了有关ViewResolver层次结构的更多详细信息:
| 视图解析器 | <description> </description> |
|---|---|
|
|
|
|
|
|
|
|
|
实现 |
|
实现 |
处理
你可以通过声明多个解析器 bean 来链接视图解析器,并在必要时设置 order 属性以指定顺序。请记住,1 属性值越大,该视图解析器在链中的位置就越靠后。
ViewResolver 的契约规定,当视图未找到时,它可以返回 null。然而,对于 JSP 和 InternalResourceViewResolver 而言,判断一个 JSP 是否存在的唯一方法是通过 RequestDispatcher 执行一次分发(dispatch)。因此,您必须始终将 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 即为兼容匹配。