视图解析
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()
。因此,此前缀对于InternalResourceViewResolver
和InternalResourceView
(对于 JSP)没有用,但如果您使用其他视图技术但仍然希望强制转发要由 Servlet/JSP 引擎处理的资源,则它可能会有所帮助。请注意,您也可以链接多个视图解析器,而不是使用此前缀。
内容协商
ContentNegotiatingViewResolver
本身不解析视图,而是委托给其他视图解析器并选择与客户端请求的表示形式相似的视图。表示形式可以从Accept
标头或查询参数(例如"/path?format=pdf"
)中确定。
ContentNegotiatingViewResolver
通过将请求媒体类型与与其每个ViewResolver
关联的View
支持的媒体类型(也称为Content-Type
)进行比较来选择合适的View
来处理请求。列表中第一个具有兼容Content-Type
的View
将表示形式返回给客户端。如果ViewResolver
链无法提供兼容的视图,则会查阅通过DefaultViews
属性指定的视图列表。后一种选项适用于单例Views
,无论逻辑视图名称如何,这些视图都可以呈现当前资源的适当表示形式。Accept
标头可以包含通配符(例如text/*
),在这种情况下,Content-Type
为text/xml
的View
是兼容的匹配。