ActionServlet-init()方法详解
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()
该方法的执行情况如下图
this.initModuleDataSources(),initModulePlugIns()
与上面类似剩余的是读出init param的类似config/*这种类型的参数,且该参数的值为一个配置文件的位置,然后也为该配置生成一个ModuleConfig对象,完成相应的初始化