视图解析
Spring MVC 定义了 ViewResolver 和 View 接口,让您可以在浏览器中渲染模型,而无需绑定到特定的视图技术。ViewResolver 提供了视图名称与实际视图之间的映射。View 在将数据移交给特定视图技术之前处理数据的准备工作。
下表提供了 ViewResolver 层次结构的更多详细信息
| ViewResolver | 描述 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
处理
您可以通过声明多个解析器 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()。因此,此 L 前缀不适用于 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 是兼容匹配。