Struts源码的学习之配置模块初始化的实现

开发者在线 Builder.com.cn 更新时间:2007-09-23作者:中国IT实验室 来源:中国IT实验室

本文关键词: 源码 Struts 编程 Java

Author    :    zhyiwww
E-Mail    :    zhyiwww@163.com
Date    :    2007-1-10
转载请注明出处 www.JavaResearch.org
(copyright by @ zhangyi)

Struts中的MessageResource、PlugIn、数据源等,都是通过ModuleConfig来实现的。
那么在ActionServlet初始化上面的那些模块之前,就先要初始化ModuleConfig,然后由ModuleConfig来负责其初始化。
在ActionServlet初始化ModuleConfig的时候,先要初始化配置工厂,然后由配置工厂:
     initModuleConfigFactory();
之后再实例化一个ModuleConfig的对象。
ModuleConfig moduleConfig = initModuleConfig("", config);

那么这个工厂到底初始化了什么?
现看源代码:
    protected void initModuleConfigFactory()
}
很明显,现从配置参数取得其配置,如果用户没有作配置,那么就使用默认配置,如果用户作了配置,那么就使用用户的配置。
如果用户作了配置的话,那么就执行设置成用户的工厂。如何设置的呢?
    public static void setFactoryClass(String factoryClass) 
在此我们可以看到,直接给ModuleConfigFactory.factoryClass赋值,为什么可以这样做呢?因为此变量是:
    protected static String factoryClass =
        "org.apache.struts.config.impl.DefaultModuleConfigFactory";
由此定义决定了可以使用此赋值方法。因为此变量是一个静态的变量。

正是因为此变量是一个静态的变量,所以在下面的得工厂生成对象的时候就可以创建一个用户自己的对象。
看一下是如何初始化ModuleConfig,看下面的源代码:
   protected ModuleConfig initModuleConfig(String prefix, String paths)
        throws ServletException  else 

            if (path.length() < 1) 

            this.parseModuleConfigFile(digester, path);
        }

        getServletContext().setAttribute(
            Globals.MODULE_KEY + config.getPrefix(),
            config);

        // Force creation and registration of DynaActionFormClass instances
        // for all dynamic form beans we wil be using
        FormBeanConfig fbs[] = config.findFormBeanConfigs();
        for (int i = 0; i < fbs.length; i++) 
        }

        return config;
    }

那么初始化配置模块的部分到底做了什么呢?
其实是生成了一个ModuleConfig的对象。这个对象是由其工厂产生的,由什么样的工厂就会生成什么样的产品。所以如果是用户配置过的工厂,那么就会生成其对应的配置模块的实现。
先看默认的情况:
public class DefaultModuleConfigFactory extends ModuleConfigFactory implements Serializable.
     * This method must be implemented by concrete subclasses.
     *
     * @param prefix Module prefix for Configuration
     */
    public ModuleConfig createModuleConfig(String prefix) 
}
通过其默认工厂的实现,我们可以看到,其实例化了一个ModuleConfigImpl的对象,这是ModuleConfig的一种实现,也是当前struts的默认的实现。

    如果是用户配置了实现工厂的话,可能的实现就是:
public class UserModuleConfigFactory extends ModuleConfigFactory implements Serializable
}
    当然,如果要启用你的工厂的话,那么还要在你的配置文件中添加如下部分,在web.xml中修改如下部分:
<servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>3</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>3</param-value>
</init-param>

    <init-param>
      <param-name>configFactory</param-name>
      <param-value>org.aa.struts. UserModuleConfigFactory </param-value>
</init-param>

    <load-on-startup>0</load-on-startup>
  </servlet>

这样的话,你的工厂就可以生效了,也可以生成你自己的配置模块的实例了。

到此,配置模块的初始化也已经完成,下面就是要实现如何对各个不同的模块进行初始化了。

查看本文来源

用户评论

  • 用户名
  • 评论内容