第七章:视图解析器——深入浅出学Spring Web MVC

来源:互联网 发布:macbook卸载软件 编辑:程序博客网 时间:2024/06/08 13:48
在Spring Web MVC中,当Controller将请求处理结果放入到ModelAndView中以后,DispatcherServlet会根据ModelAndView选择合适的视图进行渲染。那么在Spring Web MVC中是如何选择合适的View呢?View对象是是如何创建的呢?答案就在ViewResolver中,ViewResolver接口定义了resolverViewName方法,根据viewName创建合适类型的View实现
视图解析器ViewResolver:是把一个逻辑上的视图名称解析为一个真正的视图
视图View:是用于处理视图,然后返回给客户端
Spring 默认提供了多种视图解析器,比如,我们可以使用最常用解析器 InternalResourceViewResolver 来查找 JSP 视图(与之相对应的视图类为 InternalResourceView)。通常,一个视图解析器只能查找一个或多个特定类型的视图,在遇到 Spring 不支持的视图或者我们要自定义视图查找规则的情况下,我们就可以通过扩展 Spring 来自定义自己所需的视图解析器。
 
常用视图解析器如下:
1:XmlViewResolver:接口ViewResolver的实现,从XML配置文件中查找视图实现(默认 XML 配置文件为 /WEB-INF/views.xml)
2:ResourceBundleViewResolver:接口ViewResolver的实现,用于从 properties 文件中查找视图
3:UrlBasedViewResolver:接口ViewResolver的实现,用于根据请求的URL路径返回相应的视图,该视图需为抽象类AbstractUrlBasedView的实现,它还有些子类,如InternalResourceView和JstlView 等
4:InternalResourceViewResolver:UrlBasedViewResolver的子类,通常用于查找 JSP和JSTL等视图
5:VelocityViewResolver /FreeMarkerViewResolver:UrlBasedViewResolver的子类分别用于支持Velocity(类VelocityView)和FreeMark视图(类 FreeMarkerView)
6:ContentNegotiatingViewResolver:接口ViewResolver的实现,用于根据请求文件的后缀名或请求的header中的accept字段查找视图
7:BeanNameViewResolver:在spring容器内查找实现了View接口的Bean,设置Bean的名称为逻辑视图名称
 
InternalResourceViewResolver是实际开发中最常用的,但在使用它的时候,通常要把它配置到最后一个,因为该视图解析器即使没有找到正确的文件,也会返回一个视图,而不是返回 null,这样优先级比该视图解析器低的解析器,将不会被执行。
 
UrlBasedViewResolver
基本功能
 UrlBasedViewResolver是对ViewResolver的一种简单实现,而且继承了AbstractCachingViewResolver,主要提供一种拼接URL的方式来解析视图,它可以通过prefix属性指定一个前缀,通过suffix属性指定一个后缀,然后把返回的逻辑视图名称加上指定的前缀和后缀就是视图的URL了。
AbstractCachingViewResolver介绍
这是一个抽象类,它会对它解析过的视图实现缓存的功能,这样可以把解析视图的性能问题降到最低。
URL在客户端跳转的配置,也就是redirect
可以在返回的视图名称中使用redirect:前缀,这样就可以支持在客户端的跳转,如当返回的视图名称是”redirect:login”的时候,URLBasedViewResolver发现返回的视图名称包含”redirect:”前缀,于是把返回的视图名称前缀”redirect:”去掉,后面的按照上面讲的方式来进行处理
同理可以使用forward:前缀来指定是forward跳转
使用UrlBasedViewResolver的时候必须指定属性viewClass,表示解析成哪种视图,一般使用较多的就是InternalResourceView,利用它来展现jsp,但是当我们使用JSTL的时候我们必须使用JstlView。
 
InternalResourceViewResolver 
这个是最常用的,基本功能是:
它是URLBasedViewResolver的子类,所以URLBasedViewResolver支持的特性它都支持。它会把返回的视图名称都解析为InternalResourceView对象,InternalResourceView会把Controller处理器方法返回的模型属性都存放到对应的request属性中,然后通过RequestDispatcher在服务器端把请求forword重定向到目标URL。
示例:
<bean id= "defaultViewResolver"class= "org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name= "viewClass"value= "org.springframework.web.servlet.view.JstlView"/>
        <property name= "contentType" value= "text/html"/>
        <property name= "prefix" value= "/WEB-INF/jsp/"/>
        <property name= "suffix" value= ".jsp"/>
    </bean>
 
视图解析器链
概述
在Spring Web MVC中可以同时定义多个视图解析器,它们会组成一个视图解析器链。当Controller处理器方法返回一个逻辑视图名称后,视图解析器链将根据其中ViewResolver的优先级来进行处理。
通过order属性来指定顺序
由于所有的ViewResolver都实现了Ordered接口,因此可以通过order属性来指定顺序的,默认都是最大值。
order属性是Integer类型,order越小,优先级越高。
视图解析器链的执行
第一个进行解析的将是ViewResolver链中order值最小的那个 ,如果一个视图解析器在进行视图解析后返回的View对象是null的话就表示该视图解析器不能解析该视图,继续向下;如果返回不会null,就结束;当定义的所有视图解析器都不能解析该视图的时候,就会抛出一个异常。
 
说明
这里只是讲述了实际开发中最常用的知识
对于每种视图解析器的使用和配置,这里不再详解了,用到了再查吧
对于自定义视图解析器,实际使用也不多,这里也不讲了
对于多个视图解析器如何匹配指定,也就是视图的内容协商部分,将会在后面讲Ajax支持的时候再讲,这里就不啰嗦了。
0 0
原创粉丝点击