资讯专栏INFORMATION COLUMN

spring是如何加载可用的ViewResolver的?

yagami / 3184人阅读

摘要:视图解析框架同其它框架一样,是请求驱动的,围绕中心设计的。中心会分配请求到各个,以及提供其它功能。有个接口对于处理视图来说是很重要的,一个是,另一个是。如果属性被设置为的话,就会触发从中加载所有基类为的,然后存入列表。

Spring Web MVC 视图解析

Spring web MVC 框架同其它web MVC 框架一样,是请求驱动的(request driven),围绕中心Servlet设计的。中心Servlet会分配请求到各个Controllers,以及提供其它功能。Spring的DispatcherServlet就是这种中心Servlet,但做的更多。所有MVC框架都提供定位视图(address views)的机制,Spring提供view resolvers,让你能够在浏览器上渲染models,而不会把你束缚在某一特定的视图技术上。有2个接口(Interface)对于Spring处理视图来说是很重要的,一个是ViewResolver,另一个是View。 ViewResolver提供视图名称与实际视图的映射关系,View接口定位请求准备和请求处理到视图技术上。Spring规定,Controller中的所有handler方法,必须解析到一个逻辑视图,可以是显式的(通过返回String、View或ModelView)或者是隐式的(基于协商 based on conventions)。在Spring中,视图由逻辑视图名称定位,然后由一个view resolver解析。

Spring自带的视图解析器

Spring自身带有若干种view resolver,比如:AbstractCachingViewResolver、XmlViewResolver、ResourceBundleViewResolver、UrlBasedViewResolver、InternalResourceViewResolver、VelocityViewResolver、FreeMarkerViewResolver
、ContentNegotiatingViewResolver,你可以使用1种,或链式使用多种。使用方法就是在你的*-Servlet.xml配置文件种加入相关的bean。举例如下:


    
    
    


    
    
J2EE环境下视图解析器的加载

那么,问题是,Spring是如何从容器中感知到我们想要使用哪些ViewResoler的呢? 答案就在于DispatcherServlet类中的initViewResolvers方法。

DispatcherServlet.java中有一个私有方法,名为initViewResolvers,代码片段如下,就是用来初始化所有ViewResolvers的。

    /**
     * Initialize the ViewResolvers used by this class.
     * 

If no ViewResolver beans are defined in the BeanFactory for this * namespace, we default to InternalResourceViewResolver. */ private void initViewResolvers(ApplicationContext context) { this.viewResolvers = null; if (this.detectAllViewResolvers) { // Find all ViewResolvers in the ApplicationContext, including ancestor contexts. Map matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(context, ViewResolver.class, true, false); if (!matchingBeans.isEmpty()) { this.viewResolvers = new ArrayList(matchingBeans.values()); // We keep ViewResolvers in sorted order. OrderComparator.sort(this.viewResolvers); } } else { try { ViewResolver vr = context.getBean(VIEW_RESOLVER_BEAN_NAME, ViewResolver.class); this.viewResolvers = Collections.singletonList(vr); } catch (NoSuchBeanDefinitionException ex) { // Ignore, we"ll add a default ViewResolver later. } } // Ensure we have at least one ViewResolver, by registering // a default ViewResolver if no other resolvers are found. if (this.viewResolvers == null) { this.viewResolvers = getDefaultStrategies(context, ViewResolver.class); if (logger.isDebugEnabled()) { logger.debug("No ViewResolvers found in servlet "" + getServletName() + "": using default"); } } }

如果detectAllViewResolvers属性被设置为true的话,就会触发DispatcherServlet从ApplicationContext中加载所有基类为ViewResolver的Beans,然后存入viewResolvers列表。
(initViewResolvers会被确保在WebApplicationContext被初始化好了以后才会被调用的)

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

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

相关文章

  • SpringMVC之源码分析--ViewResolver(一)

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

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

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

    fox_soyoung 评论0 收藏0
  • Spring MVC概念

    摘要:在中,就是前端控制器的任务是将请求发送给控制器。处理器映射会根据请求所携带的信息来进行决策一旦选择了合适的控制器,会将请求发送给选中的控制器。这些信息被称为模型。因此无需在配置类中显式声明任何的控制器具体来讲是试图解析器。 Spring MVC基于模型-视图-控制器(Model-View-Controller,MVC)模式实现,能够构建像Spring框架那样灵活和松耦合的Web应用程序...

    lindroid 评论0 收藏0
  • SpringMVC之源码分析--ViewResolver(六)

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

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

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

    jcc 评论0 收藏0

发表评论

0条评论

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