DispatcherServlet是如何进行初始化的呢?

2023-11-01

转自:

DispatcherServlet是如何进行初始化的呢?

下文笔者讲述DispatcherServlet的初始化顺序,如下所示:

Web容器启动时将调用HttpServletBean的init方法

public abstract class HttpServletBean extends HttpServlet implements EnvironmentAware{
    @Override
    public final void init() throws ServletException {
       //省略部分代码
       //1、如下代码的作用是将Servlet初始化参数设置到该组件上
       //如contextAttribute、contextClass、namespace、contextConfigLocation;
       try {
           PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
           BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
           ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
           bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, this.environment));
           initBeanWrapper(bw);
           bw.setPropertyValues(pvs, true);
       }
       catch (BeansException ex) {
           //…………省略其他代码
       }
       //2、提供给子类初始化的扩展点,该方法由FrameworkServlet覆盖
       initServletBean();
       if (logger.isDebugEnabled()) {
           logger.debug("Servlet '" + getServletName() + "' configured successfully");
       }
    }
    //…………省略其他代码
}
将Servlet初始化参数(init-param)设置到该组件上(如contextAttribute、contextClass、namespace、contextConfigLocation)
通过BeanWrapper简化设值过程,方便后续使用;
为子类初始化扩展点initServletBean()该方法由FrameworkServlet覆盖

FrameworkServlet通过initServletBean()进行Web上下文初始化

public abstract class FrameworkServlet extends HttpServletBean {
	@Override
    protected final void initServletBean() throws ServletException {
        //省略部分代码
       try {
             //1、初始化Web上下文
           this.webApplicationContext = initWebApplicationContext();
             //2、提供给子类初始化的扩展点
           initFrameworkServlet();
       }
        //省略部分代码
    }
}
initFrameworkServlet方法主要作用如下:
初始化web上下文; 
提供给子类初始化扩展点;
protected WebApplicationContext initWebApplicationContext() {
	//ROOT上下文(ContextLoaderListener加载的)
   WebApplicationContext rootContext =
		  WebApplicationContextUtils.getWebApplicationContext(getServletContext());
   WebApplicationContext wac = null;
   if (this.webApplicationContext != null) {
	   // 1、在创建该Servlet注入的上下文
	   wac = this.webApplicationContext;
	   if (wac instanceof ConfigurableWebApplicationContext) {
		  ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) wac;
		  if (!cwac.isActive()) {
			  if (cwac.getParent() == null) {
				  cwac.setParent(rootContext);
			  }
			  configureAndRefreshWebApplicationContext(cwac);
		  }
	   }
   }
   if (wac == null) {
		 //2、查找已经绑定的上下文
	   wac = findWebApplicationContext();
   }
   if (wac == null) {
		//3、如果没有找到相应的上下文,并指定父亲为ContextLoaderListener
	   wac = createWebApplicationContext(rootContext);
   }
   if (!this.refreshEventReceived) {
		 //4、刷新上下文(执行一些初始化)
	   onRefresh(wac);
   }
   if (this.publishContext) {
	   // Publish the context as a servlet context attribute.
	   String attrName = getServletContextAttributeName();
	   getServletContext().setAttribute(attrName, wac);
	   //省略部分代码
   }
   return wac;
}
initWebApplicationContext()方法的功能,
如果ContextLoaderListener加载了上下文
将作为根上下文(DispatcherServlet的父容器)
最后调用了onRefresh()方法执行容器的一些初始化
 这个方法由子类实现,来进行扩展

DispatcherServlet实现了onRefresh()方法提供一些前端控制器相关的配置

public class DispatcherServlet extends FrameworkServlet {
     //实现子类的onRefresh()方法,该方法委托为initStrategies()方法。
    @Override
    protected void onRefresh(ApplicationContext context) {
       initStrategies(context);
    }

    //初始化默认的Spring Web MVC框架使用的策略(如HandlerMapping)
    protected viod initStrategies(ApplicationContext context){
		initMultipartResolver(context);//初始化上传文件解析器
		initLocaleResolver(context);//初始化本地解析器
		initThemeResolver(context);//初始化主题解析器
		initHandlerMapping(context);
		//初始化处理器映射器,将请求映射到处理器
		initHandlerAdapters(context);//初始化处理器适配器
		initHandlerExceptionResolver(context);
		//初始化处理器异常解析器,如果执行过程中遇到异常将交给HandlerExceptionResolver来解析
		initRequestToViewNameTranslator(context);
		//初始化请求到具体视图名称解析器
		initViewResolvers(context);
		//初始化视图解析器,通过ViewResolver解析逻辑视图名到具体视图实现
		initFlshMapManager(context);//初始化flash映射管理
	}
}
initStrategies方法
  将在WebApplicationContext初始化后自动执行
  自动扫描上下文的Bean
 根据名称或者类型匹配的机制查找自定义组件
如果没有找到则会装配一套Spring的默认组件
在org.springframework.web.servlet路径下有一个DispatcherServlet.properties配置文件
该文件指定了DispatcherServlet所使用的默认组件
DispatcherServlet启动时会进行我们需要的Web层Bean的配置
如HandlerMapping、HandlerAdapter等,而且如果我们没有配置,还会给我们提供默认的配置

DispatcherServlet主要完成以下工作:
 初始化Spring Web MVC使用的Web上下文
 初始化DispatcherServlet使用的策略,如HandlerMapping、HandlerAdapter等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DispatcherServlet是如何进行初始化的呢? 的相关文章

  • web.xml中Servlet中init-param的作用说明

    转自 web xml中Servlet中init param的作用说明 下文讲述servlet配置中的功能说明 如下所示 servlet中init param属性下的值 用于servlet的init方法时 传入参数信息将在带哦用init方法时
  • SpringMVC ViewResolver查找序列

    原文地址 http xiaoyaocao iteye com blog 1839125 虽然我们在之前的示例中一直都是使用一个InternalResourceViewResolver进行视图查找 但这并不意味着每个基于 Spring MVC
  • SimpleServletHandlerAdapter类简介说明

    转自 SimpleServletHandlerAdapter类简介说明 下文笔者讲述SimpleServletHandlerAdapter类简介说明 如下所示 SimpleServletHandlerAdapter简介 SimpleServ
  • 基于Spring + Spring MVC + Mybatis 高性能web构建

    原文地址 http blog csdn net zoutongyuan article details 41379851 参考地址 http blog csdn net gebitan505 article details 44455235
  • 使用ajax请求提交数据时,日期类型无法转换为JAVA中的日期类型

    在做毕业项目时碰见日期类型无法传到后台controller中的问题 因为springMVC中没有提供默认的日期转换器 前端页面传过来的日期类字符串无法转换为java中的日期类型 使用 DatetimeFormat注解完成转换 做一个笔记 前
  • 设置一个FreemarkerExceptionHandler捕获freemarker页面上的异常

    在Freemarker页面中如果使用 userName 并且userName为空 那么Freemarker页面就会崩掉 需要设置默认值 userName 来避免对象为空的错误 同理 user userName 也应该写成这样 user us
  • spring mvc配置cas客户端

    1 在WEB INF lib中导入cas jar包 点击打开链接 2 导入证书 1 将证书server cer文件拷贝至业务系统所在服务器上的某路径下 如c盘根目录 在cmd命令界面切换至证书所在路径 执行以下命令 jdk路径自行修改 并信
  • springmvc+sitemesh2+freemarker整合

    1 背景 最近在搭建自己的springmvc sitemesh2 freemarker框架时 遇到了一个问题 就是sitemesh2整合springmvc时 springmvc没有正确的渲染sitemesh2的模板页面 在一番百度之后 发现
  • Spring、SpringMVC、SpringBoot三者的区别

    目录 Spring是什么 SpringMVC是什么 SpringBoot是什么 Spring SpringMVC SpringBoot三者之间的关系 Spring是什么 Spring是一个开源的应用程序框架 它提供了一种简易的开发方式 通过
  • Spring MVC实例(增删改查)

    本文转载自 https www cnblogs com beast king p 5786752 html 作者 beast king 转载请注明该声明 数据库配置文件application context jdbc xml
  • Dubbo+spring+springmvc+mybatis+Maven+Jetty+Mysql+Ajax多框架融合学习网址收藏

    原文地址 http blog csdn net wp1603710463 article details 49232797 Dubbo spring springmvc mybatis Maven Jetty Mysql Ajax多框架融合
  • Spring MVC参数的传递与接收

    SpringMVC主要做的就两方面的操作 在Controller接收从jsp传递过来的数据 把Controller的数据传递到jsp页面 将Controller里边的数据传到jsp 其返回值有三种类型 ModelAndView void S
  • JSR303使用说明文档

    1 引言 参数校验是我们程序开发中必不可少的过程 用户在前端页面上填写表单时 前端js程序会校验参数的合法性 当数据到了后端 为了防止恶意操作 保持程序的健壮性 后端同样需要对数据进行校验 后端参数校验最简单的做法是直接在业务方法里面进行判
  • springmvc 使用JSR-303进行数据校验

    项目中 通常使用较多的是前端的校验 比如页面中js校验以及form表单使用bootstrap校验 然而对于安全要求较高点建议在服务端进行校验 服务端校验 控制层controller 校验页面请求的参数的合法性 在服务端控制层controll
  • Spring MVC 起步

    一 MVC 首先http的请求到达前端控制器 前端知道具体的请求 将代理给到控制器 控制器了解具体的业务细节 因此调用业务逻辑 生成业务数据 并将业务数据返回给前端控制器 然后前端控制器将数据分发给我们的业务视图 由业务视图来呈现业务页面返
  • springmvc中操作json,配置FastJson

    目前网络上传递数据大部分都是json和xml 但是xml使用的很少了 这里主要介绍json 一般来说json常用的场景是提供外部接口 请求内使用request域就足够了 springmvc对于json的支持 上图 1 请求json方式分析
  • Springmvc 学习心得

    1 三层架构的介绍和mvc的设计模式 Springmvc的特点 清晰的角色划分 每个功能模块对应一个组件 1 前端控制器 DispatchServlet 2 处理器映射器 HanderMapping 根据 requestMapping 找到
  • springmvc / /* /img/**等问题

    在配置springmvc的前端控制器 DispatcherServlet的时候有三种配置方式 action 访问以 action结尾 由DispatcherServlet进行解析 第二种 所以访问的地址都由DispatcherServlet
  • dubbo zookeeper spring mvc简单整合的工程例子demo

    该demo只是简单的集成 包括了5个工程 都是maven结构的 如下图所示 服务端 dubbo demo server api 服务接口定义工程 dubbo demo server biz 服务接口实现工程 web dubbo server
  • Java SpringMVC开发前的准备工作

    转自 Java SpringMVC开发前的准备工作 下文讲述Java开发前的相关准备工作 如下所示 JDK配置 tomcat配置 eclipse配置 一 JDK配置 需在开发机器上安装相应的JDK版本 然后可使用下列方法检测其是否安装成功

随机推荐

  • Injection of autowired dependencies failed; 的解决办法!

    错误信息 严重 Exception sending context initialized event to listener instance of class org springframework web context Contex
  • 趣解面向对象

    小白自述 过去就听说 到面向对象的时候即使没有女朋友 都可以new好多个 啥时候我也能想new多少new多少 面向对象听了很多老师的课 感觉好绕啊 这个类套那个类 怎么套的也是一头雾水 怎么才能学好了面向对象嘛 好多人都说面向对象是java
  • 【Tensorflow2.0】8、tensorflow2.0_hdf5_savedmodel_pb模型转换[1]

    文章目录 1 训练模型 2 各种模型间互转并验证 2 1 hdf5转saved model 2 2 saved model转hdf5 2 3 所有模型精度测试 2 4 hdf5和saved模型转tensorflow1 x pb模型 2 5
  • Linux修改虚拟内存

    Linux机器默认swap空间 虚拟内存 为2G或更小 在运行一些大型程序如深度神经网络程序时 物理内存往往无法满足需求 可以扩大swap空间以达到正常运行的目的 主要分为6个步骤 1 创建swap文件夹 sudo mkdir usr sw
  • ospf小总结

    Ospf 开放式最短路径优先协议 Open Shortest Path First OSPF 无类别链路状态igp协议 周期更新 30min 触发更新 链路状态协议的更新量随着网络范围的扩展指数性的上升 因此ospf协议为了在中大型网络中工
  • 【cpolar、PHPStudy— 搭建企业论坛】

    公司内部搭建企业论坛 并实现在外也可以访问 文章目录 公司内部搭建企业论坛 并实现在外也可以访问 前言 1 cpolar PHPStudy 2 Discuz 3 打开PHPStudy 安装网页论坛所需软件 4 进行网页运行环境的构建 5 运
  • 关于ADMM的研究(二)

    4 Consensus and Sharing 本节讲述的两个优化问题 是非常常见的优化问题 也非常重要 我认为是ADMM算法通往并行和分布式计算的一个途径 consensus和sharing 即一致性优化问题与共享优化问题 Consens
  • Servlet的生命周期

    目录 1 Servlet的一生有这么几个阶段 2 一个Servlet从开始到消亡 1 Servlet的一生有这么几个阶段 调用构造方法进行实例化 1 构造方法 在第一次发起请求时 调用一次 public HomeServlet System
  • 61850协议服务器端开发,IEC61850中报告服务端开发

    实战的方式介绍IEC61850报告服务端的开发 本文讲述的是IEC61850中最常用的报告功能服务端的实现方法 内容包含了CID建模 编码实现 还包括后面的运行效果 MMS报文等 一 CID建模 1 通讯部分 1 1 9999 1 12 0
  • 【ReactiveX】介绍(译)

    更多内容 欢迎关注作者博客 http www china10s com blog p 465 ReactiveX 是通过使用 Observable 序列用来合成异步的和事件响应式的程序上的库文件 它扩展了通知者模式来支持数据和 或事件的响应
  • 8款超级好用的3D建模软件上下篇

    只要有水平 做出好作品 完全没问题 非也非也 做出一个好作品 不但要靠自身的技巧水平 选择适合自己的3D建模软件也是一个很重要的因素 所以小编今天就给大家安利8款好用的3D建模软件 无论你是一个0基础的初阶学者 还是想提升自己水平的进阶从业
  • 第3章-数组

    1 数组的概述 数组 Array 是多个相同类型数据按一定顺序排列 的集合 并使用一个名字命名 并通过编号的方式 对这些数据进行统一管理 数组的常见概念 数组名 下标 或索引 元素 数组的长度 数组本身是引用数据类型 而数组中的元素可以是任
  • 解决 Xshell 连接 centOs7 的Could not connect to '192.168.119.129' (port 22): Connection failed.

    在用Xshell 连接centos7的时候会遇到Could not connect to 192 168 119 129 port 22 Connection failed 这个问题 我的解决办法如下 Step1 获取 centos7 的I
  • 刷题-Leetcode-39. 组合总和(回溯-组合)

    39 组合总和 题目链接 来源 力扣 LeetCode 链接 https leetcode cn com problems combination sum submissions 著作权归领扣网络所有 商业转载请联系官方授权 非商业转载请注
  • 【手撕代码系列】JS手写实现防抖函数

    公众号 Code程序人生 分享互联网所见所闻 防抖是一种前端常见的性能优化技术 可以避免在高频触发的情况下频繁地执行函数 从而减少资源的消耗 本文将介绍如何手写实现一个防抖函数 防抖的原理 防抖的原理是当事件被触发后 计时器会被重置 如果在
  • 计算两个旋转矩形的交集——Python

    转自 https blog csdn net sda42342342423 article details 79746736 知识准备 cv2 rotatedRectangleIntersection rect1 rect2 计算两个旋转矩
  • 【C++】类和对象

    面向对象和面向过程 举个例子 淘宝这个软件 我要买一个东西 就应该有以下几步 上架商品 下单 送快递 收快递 评价 C语言关注的就是这个过程 而C 关注的更多是对象 平台 快递 用户 这就是面向对象 将上面繁琐的过程总结为三个对象 这样再来
  • Merkle树介绍

    默克尔树 Merkle树 又叫哈希树 是区块链数据存储运用到的一个重要的技术算法 简单来说 哈希树 默克尔树 中 每个节点都标有一个数据块的加密哈希值 哈希树可以用来验证任何一种在计算机中和计算机之间存储 处理和传输的数据 它们可以确保在点
  • linux ss命令详解

    ss 是 Socket Statistics 的缩写 ss 命令可以用来获取 socket 统计信息 它显示的内容和 netstat 类似 但 ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息 而且比 netstat 更
  • DispatcherServlet是如何进行初始化的呢?

    转自 DispatcherServlet是如何进行初始化的呢 下文笔者讲述DispatcherServlet的初始化顺序 如下所示 Web容器启动时将调用HttpServletBean的init方法 public abstract clas