视图解析
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。
转发
您还可以使用特殊的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
是兼容的匹配项。