zoukankan      html  css  js  c++  java
  • Spring MVC的视图解析器

    一、视图解析器简介
    在Spring MVC中,当Controller将请求处理结果放入到ModelAndView中以后,DispatcherServlet会根据ModelAndView选择合适的视图进行渲染。那么在Spring MVC中是如何选择合适的View呢?View对象是是如何创建的呢?答案就在ViewResolver中,ViewResolver接口定义resolverViewName方法,根据viewName创建合适类型的View实现来实现。
    视图解析器ViewResolver可以把一个逻辑上的视图名称解析为一个真正的视图。而视图View则是用于处理视图,然后返回给客户端。
    Spring 默认提供了多种视图解析器,比如,我们可以使用最常用解析器InternalResourceViewResolver 来查找 JSP 视图(与之相对应的视图类为 InternalResourceView)。通常,一个视图解析器只能查找一个或多个特定类型的视图,在遇到 Spring 不支持的视图或者我们要自定义视图查找规则的情况下,我们就可以通过扩展 Spring 来自定义自己所需的视图解析器。

    二、Spring MVC支持的视图解析器
    常用视图解析器如下:
    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
    1、基本功能
    UrlBasedViewResolver是对ViewResolver的一种简单实现,而且继承了AbstractCachingViewResolver,主要提供一种拼接URL的方式来解析视图,它可以通过prefix属性指定一个前缀,通过suffix属性指定一个后缀,然后把返回的逻辑视图名称加上指定的前缀和后缀就是视图的URL了。
    2、AbstractCachingViewResolver介绍
    这是一个抽象类,它会对它解析过的视图实现缓存的功能,这样可以把解析视图的性能问题降到最低。
    3、重定向和转发
    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>

    五、视图解析器链
    1、在Spring Web MVC中可以同时定义多个视图解析器,它们会组成一个视图解析器链。当Controller处理器方法返回一个逻辑视图名称后,视图解析器链将根据其中ViewResolver的优先级来进行处理。
    2、优先级可以通过order属性来指定顺序。由于所有的ViewResolver都实现了Ordered接口,因此可以通过order属性来指定顺序的,默认都是最大值。order属性是Integer类型,order越小,优先级越高。

    3、视图解析器链执行时,第一个进行解析的将是ViewResolver链中order值最小的那个 ,如果一个视图解析器在进行视图解析后返回的View对象是null的话就表示该视图解析器不能解析该视图,继续向下;如果返回不会null,就结束;当定义的所有视图解析器都不能解析该视图的时候,就会抛出一个异常。


  • 相关阅读:
    使用tcmalloc编译启动时宕机
    使用tcmalloc编译出现undefined reference to `sem_init'
    使用AddressSanitizer做内存分析(一)——入门篇
    VIM-美化你的标签栏
    Entity Framework Code First (六)存储过程
    Entity Framework Code First (五)Fluent API
    Entity Framework Code First (四)Fluent API
    Entity Framework Code First (三)Data Annotations
    Entity Framework Code First (二)Custom Conventions
    Entity Framework Code First (一)Conventions
  • 原文地址:https://www.cnblogs.com/kangsir/p/6653212.html
Copyright © 2011-2022 走看看