资讯专栏INFORMATION COLUMN

SpringMVC之源码分析--ViewResolver(三)

fox_soyoung / 1690人阅读

摘要:概述本节学习下的功能,简单来说,该类的作用就是把多个视图解析器进行组装,内部使用存储配置使用的视图解析器。总结本章介绍了类,根据测试,了解到属性不影响中配置使用的视图解析器顺序。

概述

本节学习下ViewResolverComposite的功能,简单来说,该类的作用就是把多个ViewResolver视图解析器进行组装,内部使用list存储配置使用的视图解析器。

本系列文章是基于Spring5.0.5RELEASE。

源码

ViewResolverComposite实现ViewResolver接口,源码如下;

public class ViewResolverComposite implements ViewResolver, Ordered, InitializingBean,
    ApplicationContextAware, ServletContextAware {
    // 用于存储使用的ViewResolver容器
    private final List viewResolvers = new ArrayList<>();
    // 支持排序
    // 此排序并不影响上面list中的顺序
    private int order = Ordered.LOWEST_PRECEDENCE;

    ... ...

    /**
     *根据逻辑视图名称进行解析
     */
    @Override
    @Nullable
    public View resolveViewName(String viewName, Locale locale) throws Exception {
        // 迭代配置使用的ViewResolver集合
        for (ViewResolver viewResolver : this.viewResolvers) {
            // 逐一调用不同的解析器进行解析
            View view = viewResolver.resolveViewName(viewName, locale);
            // 找到View即返回
            if (view != null) {
                return view;
            }
        }
        // 未找到返回null
        return null;
    }

    ... ...
}

以上是ViewResolverComposite核心代码。

实战

练习ViewResolverComposite的使用。

项目结构

pom文件

通过maven构建,引入依赖的jar坐标,代码如下:



    org.springframework
    spring-webmvc
    5.0.5.RELEASE



    javax.servlet
    javax.servlet-api
    3.1.0
    provided



    javax.servlet
    jstl
    1.2

Spring配置文件

通过此文件配置Spring MVC的组件,代码如下:






    
        
            
            
        
    
    




    
    
    
    




    



    

部署描述文件

配置Spring MVC核心控制器DispatcherSerlvet,代码如下:


    
    dispatcher
    
    org.springframework.web.servlet.DispatcherServlet
    
    
        contextConfigLocation
        classpath:spring-servlet.xml
    
    
    1
    true



    
    dispatcher
    
    /

处理器

编写处理器,本例使用注解,代码如下:

@Controller
public class DemoController {
    @GetMapping("/viewResolverComposite")
    public String viewResolverComposite(){
        return "test";
    }
}

测试

测试一:视图解析器属性order并不影响ViewResolverComposite组装使用的视图解析器顺序

根据以上配置,如果order影响的话,视图解析应有BeanNameViewResolver进行解析,但通过测试结果并不是由其进行的处理,故order不影响内部组装顺序,如下图:

测试二:ViewResolverComposite组装的视图解析器顺序由其存入顺序影响,即如上配置属性viewResolvers的list从上往下一次处理。

把viewResolvers的list数据顺序调整一下,调整后如下:


    
        
        
    

重启再次断点查看,如下图:

此时处理视图解析的变更为BeanNameViewResolver。

测试三:测试order功能

我们设置Spring中的ViewResolver的order属性,如下:



    
        
            
            

        
    
    



    
    
    
    



    

验证Spring加载的视图解析器是否与我们的顺序一致,启动时如果如下图:

用户请求时,结果如下图:

由结果可知,Spring是按我们配置的order属性进行排序的。

总结

本章介绍了ViewResolverComposite类,根据测试,了解到order属性不影响ViewResolverComposite中配置使用的视图解析器顺序。order控制Spring加载使用视图解析器的顺序。

最后创建了qq群方便大家交流,可扫描加入,同时也可加我qq:276420284,共同学习、共同进步,谢谢!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69652.html

相关文章

  • SpringMVC源码分析--ViewResolver(六)

    摘要:与一样,该类继承抽象类,并且通过外部的属性文件定义逻辑视图名称与真正的视图对象的关系,属性文件默认是下的,可以通过或属性来指定,该属性指的是文件的基名称,也就是说以属性值开头的属性文件。 概述 本章再学习另外两个ViewResolver,分别是XmlViewResolver和ResourceBundleViewResolver,从功能上说,这两个视图解析器都是从外部资源文件中查找视图V...

    alighters 评论0 收藏0
  • SpringMVC源码分析--ViewResolver(二)

    摘要:概述上篇学习了视图解析器作用及处理流程,为我们提供了丰富的视图解析器见下图本系列文章是基于。该视图解析器是根据处理器返回的逻辑视图名称,在应用上下文中查找该名称的视图对象视图对象就是的对象。 概述 上篇学习了Spring MVC ViewResolver视图解析器作用及处理流程,Spring为我们提供了丰富的视图解析器(见下图):showImg(https://segmentfault...

    jas0n 评论0 收藏0
  • SpringMVC源码分析--ViewResolver(一)

    摘要:概述本章开始进入另一重要的组件,即视图组件,处理视图组件使用两个主要的接口是和。接口的作用是用于处理视图进行渲染。延用之前的介绍流程,本章分两部分进行阐述启动初始化和请求处理。 概述 本章开始进入另一重要的组件,即视图组件,Spring MVC处理视图组件使用两个主要的接口是ViewResolver和View。根据名称可知,ViewResolver即视图解析器,其作用是把逻辑视图名称解...

    pf_miles 评论0 收藏0
  • SpringMVC源码分析--ViewResolver(四)

    摘要:概述本章继续学习另一个实现类解析器,该类的主要作用是根据同一请求的某些策略,选择对应的进行渲染。可以把理解为适配器,对不同类型进行适配。值得注意的是处理的为同一个。本系列文章是基于。实战需求目标实现后缀名或参数控制,显示不同的视图。 概述 本章继续学习ViewResolver另一个实现类ContentNegotiatingViewResolver解析器,该类的主要作用是根据同一请求的某...

    jcc 评论0 收藏0
  • SpringMVC源码分析--ViewResolver(五)

    摘要:此解析器与差不多,更改下配置文件中的类全路径即可。总结本章介绍了以及三个视图解析器。这部分内容有点儿多,我会尽快结束。 概述 通过上几篇的学习,我们分析了并试验了ViewResolverComposite、BeanNameViewResolver和ContentNegotiatingViewResolver,这三个类都直接实现ViewResolver接口。Spring MVC提供了很多...

    klinson 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<