容器启动后,FilterDispatcher类被实例化,并调用它的init(FilterConfig filterConfig)方法。其中FilterConfig接口用于储存初始化信息。
在init方法中会初始化log信息,然后生成Dispatcher类的实例。
其中createDisplatcher方法的定义如下:将filterConfig中的信息封装到一个Map中,作为Dispatcher类构造函数的参数。
然后dispatcher初始化,主要是读取一些配置文件,
init_DefaultProperties方法初始化properties配置:
接下来看DefaultPropertiesProvider类的register方法:
PropertiesSettings类的构造函数:读取default.properties的内容。
再来看init_TraditionalXmlConfigurations的方法实现。
首先读取web.xml中的config初始参数值,如果没有配置,默认读取“struts-default.xml,struts-plugin.xml,struts.xml”,
(private static final String DEFAULT_CONFIGURATION_PATHS = "struts-default.xml,struts-plugin.xml,struts.xml";)
所以默认的配置文件必须取名为这三个值,否则不被识别。当然可以添加自己的配置文件,并在web.xml中添加即可。
读取默认的配置文件是,如果不包含xwork.xml,就把StrutsXmlConfigurationrovider类加入ConfigurationProvider队列。
StrutsXmlConfigurationrovider类的构造函数实现:
此类继承XmlConfigurationProvider,而XmlConfigurationProvider又实现ConfigurationProvider接口。
类XmlConfigurationProvider负责配置文件的读取和解析。addAction()方法负责读取<action>标签,并将数据保存在ActionConfig中;addResultTypes()方法负责将<result-type>标签转化为ResultTypeConfig对象;loadInterceptors()方法负责将<interceptor>标签转化为InterceptorConfi对象;loadInterceptorStack()方法负责将<interceptor-ref>标签转化为InterceptorStackConfig对象;loadInterceptorStacks()方法负责将<interceptor-stack>标签转化成InterceptorStackConfig对象。而上面的方法最终会被addPackage()方法调用,将所读取到的数据汇集到PackageConfig对象中,那么让我们看一下addPackage()方法的内容:
而实际的读取xml的方法是loadConfigurationFiles()方法:
接下来看init_LegacyStrutsProperties方法的实现。
LegacyPropertiesConfigurationProvider类的register方法:
接下来看init_CustomConfigurationProviders方法:读取web.xml中configProviders初始参数的配置信息。(通常是自定义的Provider)
剩下的方法与上面这几个类似,就不多赘述了。好了,到此,struts2.0的启动部分就完成了。