所有的MVC框架都为web应用提供定位views。Spring提供view解析器,不限定具体的view技术,将models渲染到浏览器。
有两个重要的接口ViewResolver和View。ViewResolver提供view名称与实际views之间的映射。
使用ViewResolver接口解析views
在Spring Web MVC控制器中,所有处理方法都对应view逻辑名。或显式或隐式。Spring中的Views由逻辑view名定位,由view解析器解析。Spring自带了多个view解析器。
| AbstractCachingViewResolver | |
| XmlViewResolver | |
| ResourceBundleViewResolver | |
| UrlBasedViewResolver | 接单实现ViewResolver接口直接将view逻辑名解析为URL,无显式的映射定义。适用于逻辑名与view源文件名匹配。 |
| InternalResourceViewResolver | |
| VelocityViewResolver/FreeMarkerViewResolver | |
| ContentNegotiatingViewResolver |
使用JSP作为视图解析技术,可以使用UrlBasedViewResolver。该解析器将视图名解析为URL。
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver>
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
当返回逻辑视图名test时,将请求解析为/WEB-INF/jsp/test.jsp。
当在web应用中使用不同的view激素时,可以使用ResourceBundleViewResolver:
<bean>
<property name="basename" value="views"/>
<property name="defaultParentView" value="parentView"/>
</bean>
ResourceBundleViewResolver检索有basename定义的ResourceBundle。对每个假定的view,使用属性[viewname].(class)作为view class、属性[viewname].url作为view url。
解析器链
Spring支持多个视图解析器。通过在application上下文中添加多个解析器,必要时设置order属性确定顺序。order属性越高,使用顺序越靠后。
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean id="excelViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
<property name="order" value="1"/>
<property name="location" value="/WEB-INF/views.xml"/>
</bean>
<!-- in views.xml -->
<beans>
<bean name="report" class="org.springframework.example.ReportExcelView"/>
</beans>
如果一个具体的视图解析器不能解析出某个视图,Spring在上下文中查找其他的视图解析器。如果视图解析器存在,Spring继续直到视图被解析。如果不存在,Spring将抛出ServletException。
来源:oschina
链接:https://my.oschina.net/u/866681/blog/212641