上回说到Struts的ActionServlet,其中有一步是 initModuleConfig方法,就是用于初始化MoudleConfig实例,它是整个org.apache.struts.config包的核心,在Struts应用运行时用来存放整个Struts应用的配置信息.如果有多个子应用,每个子应用都会有一个ModuleConfig对象.ModuleConfig和Struts配置文件的根元素<struts-config>对应.<struts-config>根元素中包含<form-bean>,<action>和<forward>等一系列子元素,因此MouduleConfig中包含了和每个子元素对应的配置类实例.
同时Struts中的MessageResource、PlugIn、数据源等,都是通过ModuleConfig来实现的,所以在ActionServlet初始化上面的那些模块之前,就先要初始化ModuleConfig,然后由ModuleConfig来负责其初始化。
struts中读取模块配置MoudleConfig采用了这样的工厂方法
一个接口:ModuleConfig.java
一个抽象类:ModuleConfigFactory.java
一个ModuleConfig的实现类:ModuleConfigImpl.java
一个ModuleConfigFactory的子类:DefaultModuleConfigFactory.java
具体介绍
一.initModuleConfigFactory()
在ActionServlet初始化ModuleConfig的时候,先要初始化配置工厂,
那么这个工厂到底初始化了什么?
现看源代码:
很明显,现从配置参数取得其配置,如果用户没有作配置,那么就使用默认配置,如果用户作了配置,那么就使用用户的配置。
如果用户作了配置的话,那么就执行设置成用户的工厂。如何设置的呢?
直接给ModuleConfigFactory.factoryClass赋值,因为此变量是一个静态的变量:
由此定义决定了可以使用此赋值方法。正是因为此变量是一个静态的变量,所以在下面的得工厂生成对象的时候就可以创建一个用户自己的对象。
二.initModuleConfig()
之后由配置工厂再实例化一个ModuleConfig的对象。
看一下initModuleConfig方法是如何初始化ModuleConfig的,看下面的源代码:
同时Struts中的MessageResource、PlugIn、数据源等,都是通过ModuleConfig来实现的,所以在ActionServlet初始化上面的那些模块之前,就先要初始化ModuleConfig,然后由ModuleConfig来负责其初始化。
struts中读取模块配置MoudleConfig采用了这样的工厂方法
一个接口:ModuleConfig.java
一个抽象类:ModuleConfigFactory.java
一个ModuleConfig的实现类:ModuleConfigImpl.java
一个ModuleConfigFactory的子类:DefaultModuleConfigFactory.java
具体介绍
一.initModuleConfigFactory()
在ActionServlet初始化ModuleConfig的时候,先要初始化配置工厂,
- initModuleConfigFactory();
initModuleConfigFactory();
那么这个工厂到底初始化了什么?
现看源代码:
- protected void initModuleConfigFactory(){
- String configFactory = getServletConfig().getInitParameter("configFactory");
- if (configFactory != null) {
- ModuleConfigFactory.setFactoryClass(configFactory);
- }
- }
protected void initModuleConfigFactory(){
String configFactory = getServletConfig().getInitParameter("configFactory");
if (configFactory != null) {
ModuleConfigFactory.setFactoryClass(configFactory);
}
}
很明显,现从配置参数取得其配置,如果用户没有作配置,那么就使用默认配置,如果用户作了配置,那么就使用用户的配置。
如果用户作了配置的话,那么就执行设置成用户的工厂。如何设置的呢?
- public static void setFactoryClass(String factoryClass) {
- ModuleConfigFactory.factoryClass = factoryClass;
- ModuleConfigFactory.clazz = null;
- }
public static void setFactoryClass(String factoryClass) {
ModuleConfigFactory.factoryClass = factoryClass;
ModuleConfigFactory.clazz = null;
}
直接给ModuleConfigFactory.factoryClass赋值,因为此变量是一个静态的变量:
- protected static String factoryClass =
- "org.apache.struts.config.impl.DefaultModuleConfigFactory";
protected static String factoryClass =
"org.apache.struts.config.impl.DefaultModuleConfigFactory";
由此定义决定了可以使用此赋值方法。正是因为此变量是一个静态的变量,所以在下面的得工厂生成对象的时候就可以创建一个用户自己的对象。
二.initModuleConfig()
之后由配置工厂再实例化一个ModuleConfig的对象。
- ModuleConfig moduleConfig = initModuleConfig("", config);
ModuleConfig moduleConfig = initModuleConfig("", config);
看一下initModuleConfig方法是如何初始化ModuleConfig的,看下面的源代码: