ActionServlet-init()方法详解

init方法的基本内容

ActionServlet-init()方法详解

this.initInternal()

该方法主要是用来把国际化资源的文件加载到内存,并且完成对ActionServlet里类型为MessageResources的变量internal进行初始化。

该方法的执行流程

  • getMessageResources(MessageResources)
  • createFactory(MessageResourcesFactory 默认会创建PropertyMessageResourcesFactory)
  • createResources(PropertyMessageResourcesFactory,该方法创建一个PropertyMessageResources对象,而该对象的构造方法里是调用的父类的构造方法,即MessageResources的构造方法)

this.initOther()

该方法主要作用是得到ActionServlet的初始化参数(config 和 convertNull),并且给ActionServlet里的相应属性进行复制,如果没有配置,则按照默认值(“/WEB-INF/struts-config.xml” 和 false)

该方法的执行流程

  • 从ServletConfig里拿到对应的参数值,如果不为空就给相应的属性赋值
  • 如果convertNull值为TRUE,还会向 ConvertUilts里注册一些转换器

this.initServlet()

该方法的功能主要是对Web.xml里的Servlet-Mapping进行解析,并且完成对ActionServlet里的servletName,servletMapping等进行初始化,并且向Application中设置了一个设置了一个属性名为”org.apache.struts.action.SERVLET_MAPPING”,属性值为servletMapping的一个属性,之后再init方法里又向Application添加了一个属性名为”org.apache.struts.action.ACTION_SERVLET”,属性值为该ActionServlet对象

this.initModuleConfigFactory()

该方法的功能主要是完成对ModuleConfigFactory的初始化

该方法的执行流程

  • 查看ServletConfig里是否存在configFactory该属性,即是否给ActionServlet配置configFactory参数
  • 如果有,则调用ModuleConfigFactory的setFactoryClass方法给ModuleConfigFactory的类属性factoryClass进行赋值
  • 如果没有ModuleConfigFactory的类属性factoryClass还是使它的默认值”org.apache.struts.config.impl.DefaultModuleConfigFactory”,也就是使用该默认的工厂生产MoudleConfig对象

this.initModuleConfig(String prefix, String paths)

该方法的作用主要是创建一个对象MoudleConfig(Struts里的一个重要的配置对象,对该对象的详细解释请看后续章节)对象,并且读取Struts的配置文件完成对MoudleConfig的初始化

该方法的执行流程

  • 调用ModuleConfigFactory的createFactory方法创建一个工厂对象(如果没有配置就是创建上面默认的工厂)
  • 调用该工厂的createModuleConfig方法,如果是默认的工厂则该工厂是通过new来创建一个ModuleConfigImpl对象
  • 读取struts的配置文件,完成ModelConfig的初始化
  • 并且向Application中添加一个属性名为”org.apache.struts.action.MODULE” + config.getPrefix(),属性值为该对象

该方法的执行流程

this.initModuleMessageResources()
该方法主要是对于那些配置了factory的属性MessageResources进行重新赋值


  • 从ModuleConfig对象里拿到类型为HashMap的messageResources的属性
  • 遍历该属性,如果存在存在factory和parameter都不为空,则重新创建ModuleConfigFactory,创建MessageResources对象
  • 把该对象放到Application,key为遍历属性的key,value为后创建的对象

this.initModulePrefixes()
该方法的执行情况如下图

ActionServlet-init()方法详解

this.initModuleDataSources(),initModulePlugIns()与上面类似

剩余的是读出init param的类似config/*这种类型的参数,且该参数的值为一个配置文件的位置,然后也为该配置生成一个ModuleConfig对象,完成相应的初始化

以上是本人通过看源码之后的一些认识,如果不当之处,还望大家一起指正,共同进步