视图解析
Web 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)相对于当前上下文进行重定向,
而名称如 redirect:https://myhost.com/some/arbitrary/path 则重定向到绝对 URL。
内容协商
ContentNegotiatingViewResolver
本身不解析视图,而是委托给其他视图解析器,并选择类似于客户端请求的表示形式的视图。
表示形式可以根据 Accept 头或查询参数(例如 "/path?format=pdf")确定。
ContentNegotiatingViewResolver 通过将请求媒体类型与每个 ViewResolvers 关联的 View
支持的媒体类型(也称为 Content-Type)进行比较,来选择适当的 View 来处理请求。
列表中具有兼容 Content-Type 的第一个 View 将表示形式返回给客户端。
如果 ViewResolver 链无法提供兼容的视图,则会查阅通过 DefaultViews 属性指定的视图列表。
后一种选项适用于单例 Views,无论逻辑视图名称如何,它们都可以渲染当前资源的适当表示形式。
Accept 头可以包含通配符(例如 text/*),在这种情况下,Content-Type 为 text/xml 的 View 是兼容的匹配项。