资讯专栏INFORMATION COLUMN

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

jas0n / 1814人阅读

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

概述

上篇学习了Spring MVC ViewResolver视图解析器作用及处理流程,Spring为我们提供了丰富的视图解析器(见下图):

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

BeanNameViewResolver

该视图解析器是根据处理器(handler)返回的逻辑视图名称,在应用上下文中查找该名称的视图bean对象(视图bean对象就是View的bean对象)。具有如下特点:

视图bean对象需注册在Spring应用上下中,即由托管给Spring进行管理;

处理器返回的逻辑视图名称为视图bean对象名称(或id);

源码

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

public class BeanNameViewResolver extends WebApplicationObjectSupport implements ViewResolver, Ordered {
    // 实现Ordered接口,支持对个ViewResolver排序,值越小优先级越高
    private int order = Ordered.LOWEST_PRECEDENCE; 

    public void setOrder(int order) {
        this.order = order;
    }

    @Override
    public int getOrder() {
        return this.order;
    }

    /**
     *实现ViewResolver接口方法
     *参数viewName就是处理器返回的逻辑视图名称
     */
    @Override
    @Nullable
    public View resolveViewName(String viewName, Locale locale) throws BeansException {
        // 获取上下文
        ApplicationContext context = obtainApplicationContext();
        // 查找上下文中是否有“viewName”的bean定义
        if (!context.containsBean(viewName)) {
            if (logger.isDebugEnabled()) {
                logger.debug("No matching bean found for view name "" + viewName + """);
            }
            // Allow for ViewResolver chaining...
            return null;
        }
        // 判断“viewName”的bean对象是否是View类型
        if (!context.isTypeMatch(viewName, View.class)) {
            if (logger.isDebugEnabled()) {
                logger.debug("Found matching bean for view name "" + viewName +
                        "" - to be ignored since it does not implement View");
            }
            // Since we"re looking into the general ApplicationContext here,
            // let"s accept this as a non-match and allow for chaining as well...
            return null;
        }
        // 返回上下文中指定名称(或id)的View类型的bean
        return context.getBean(viewName, View.class);
    }

}
实战

练习BeanNameViewResolver的使用。

项目结构

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 Demo1Controller {
    @RequestMapping(value = "/beanNameViewResolver")
    public String beanNameViewResolver(){
        return "test";
    }
}

以上例子,在Spring MVC容器中定义了BeanNameViewResolver视图解析器和id为test的InternalResourceView视图bean(可以替换),以上配置后,在handler处理器返回的逻辑视图名称为test的时候,就会使用id为test的视图bean对象(InternalResourceView)进行视图渲染。

总结

本章介绍了BeanNameViewResolver的源码及测试小例子,希望对大家有帮助。

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

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

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

相关文章

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

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

    fox_soyoung 评论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
  • SpringMVC源码分析--ViewResolver(六)

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

    alighters 评论0 收藏0

发表评论

0条评论

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