Struts源码的切片学习(四)--配置模块初始化的实现

Struts 源码的切片学习(四)——配置模块初始化的实现

<o:p> </o:p>

<o:p> </o:p>

Author      :      zhyiwww<o:p>

E-Mail       :      zhyiwww@163.com<o:p>

Date           :      2007-1-10<o:p>

转载请注明出处 www.JavaResearch.org<o:p>

(copyright by @ zhangyi)<o:p>

<o:p> </o:p>

<o:p> </o:p>

Struts 中的 MessageResource PlugIn 、数据源等,都是通过 ModuleConfig 来实现的。 <o:p> </o:p>

那么在 ActionServlet 初始化上面的那些模块之前,就先要初始化 ModuleConfig ,然后由 ModuleConfig 来负责其初始化。 <o:p> </o:p>

ActionServlet 初始化 ModuleConfig 的时候,先要初始化配置工厂,然后由配置工厂: <o:p> </o:p>

       initModuleConfigFactory();<o:p>

之后再实例化一个 ModuleConfig 的对象。 <o:p> </o:p>

ModuleConfig moduleConfig = initModuleConfig("", config);<o:p>

<o:p> </o:p>

那么这个工厂到底初始化了什么? <o:p> </o:p>

现看源代码: <o:p> </o:p>

    protected void initModuleConfigFactory(){<o:p>

        String configFactory = getServletConfig().getInitParameter("configFactory");<o:p>

        if (configFactory != null) {<o:p>

            ModuleConfigFactory.setFactoryClass(configFactory);<o:p>

        }<o:p>

}<o:p>

很明显,现从配置参数取得其配置,如果用户没有作配置,那么就使用默认配置,如果用户作了配置,那么就使用用户的配置。 <o:p> </o:p>

如果用户作了配置的话,那么就执行设置成用户的工厂。如何设置的呢? <o:p> </o:p>

    public static void setFactoryClass(String factoryClass) {<o:p>

        ModuleConfigFactory.factoryClass = factoryClass;<o:p>

        ModuleConfigFactory.clazz = null;<o:p>

    }<o:p>

在此我们可以看到,直接给 ModuleConfigFactory.factoryClass 赋值,为什么可以这样做呢?因为此变量是:

    protected static String factoryClass = <o:p> </o:p>

        "org.apache.struts.config.impl.DefaultModuleConfigFactory" ; <o:p> </o:p>

由此定义决定了可以使用此赋值方法。因为此变量是一个静态的变量。

<o:p> </o:p>

正是因为此变量是一个静态的变量,所以在下面的得工厂生成对象的时候就可以创建一个用户自己的对象。

看一下是如何初始化 ModuleConfig ,看下面的源代码:

   protected ModuleConfig initModuleConfig(String prefix, String paths)<o:p>

        throws ServletException {<o:p>

       /*************************************************************<o:p>

这个地方,我们可以看到,此时就由 ModuleConfigFactory 直接创建了一个工厂对象,而此时我们用的配置就是上面我们初始化后的配置。 <o:p> </o:p>

如果用户自己做了配置,那么此时初始化的工厂就是用户指定后的工厂。如果没有的话,那么就初始化的时默认的工厂。 <o:p> </o:p>

也就是 <o:p> </o:p>

    protected static String factoryClass = <o:p> </o:p>

        "org.apache.struts.config.impl.DefaultModuleConfigFactory" ; <o:p> </o:p>

的一个实例。 <o:p> </o:p>

*************************************************************/<o:p>

           ModuleConfigFactory factoryObject = ModuleConfigFactory.createFactory();<o:p>

        ModuleConfig config = factoryObject.createModuleConfig(prefix);<o:p>

<o:p> </o:p>

        // Configure the Digester instance we will use<o:p>

        Digester digester = initConfigDigester();<o:p>

<o:p> </o:p>

        // Process each specified resource path<o:p>

        while (paths.length() > 0) {<o:p>

            digester.push(config);<o:p>

            String path = null;<o:p>

            int comma = paths.indexOf(',');<o:p>

            if (comma >= 0) {<o:p>

                path = paths.substring(0, comma).trim();<o:p>

                paths = paths.substring(comma + 1);<o:p>

            } else {<o:p>

                path = paths.trim();<o:p>

                paths = "";<o:p>

            }<o:p>

<o:p> </o:p>

            if (path.length() < 1) {<o:p>

                break;<o:p>

            }<o:p>

<o:p> </o:p>

            this.parseModuleConfigFile(digester, path);<o:p>

        }<o:p>

<o:p> </o:p>

        getServletContext().setAttribute(<o:p>

            Globals.MODULE_KEY + config.getPrefix(),<o:p>

            config);<o:p>

<o:p> </o:p>

        // Force creation and registration of DynaActionFormClass instances<o:p>

        // for all dynamic form beans we wil be using<o:p>

        FormBeanConfig fbs[] = config.findFormBeanConfigs();<o:p>

        for (int i = 0; i < fbs.length; i++) {<o:p>

            if (fbs[i].getDynamic()) {<o:p>

                fbs[i].getDynaActionFormClass();<o:p>

            }<o:p>

        }<o:p>

<o:p> </o:p>

        return config;<o:p>

    }<o:p>

<o:p> </o:p>

那么初始化配置模块的部分到底做了什么呢?

其实是生成了一个 ModuleConfig 的对象。这个对象是由其工厂产生的,由什么样的工厂就会生成什么样的产品。所以如果是用户配置过的工厂,那么就会生成其对应的配置模块的实现。

先看默认的情况:

public class DefaultModuleConfigFactory extends ModuleConfigFactory implements Serializable{

    // --------------------------------------------------------- Public Methods

<o:p> </o:p>

    /**

     * Create and return a newly instansiated {@link ModuleConfig}.

     * This method must be implemented by concrete subclasses.

     *

     * @param prefix Module prefix for Configuration

     */

    public ModuleConfig createModuleConfig(String prefix) {

<o:p> </o:p>

        return new ModuleConfigImpl(prefix);

<o:p> </o:p>

    }

}

通过其默认工厂的实现,我们可以看到,其实例化了一个 ModuleConfigImpl 的对象,这是 ModuleConfig 的一种实现,也是当前 struts 的默认的实现。

<o:p> </o:p>

       如果是用户配置了实现工厂的话,可能的实现就是:

public class UserModuleConfigFactory extends ModuleConfigFactory implements Serializable{

       public ModuleConfig createModuleConfig(String prefix) {

<o:p> </o:p>

        return new ModuleConfigUserImpl(prefix);

<o:p> </o:p>

    }

}

       当然,如果要启用你的工厂的话,那么还要在你的配置文件中添加如下部分,在 web.xml 中修改如下部分:

< servlet > <o:p> </o:p>

    < servlet-name > action </ servlet-name > <o:p> </o:p>

    < servlet-class > org.apache.struts.action.ActionServlet </ servlet-class > <o:p> </o:p>

    < init-param > <o:p> </o:p>

      < param-name > config </ param-name > <o:p> </o:p>

      < param-value > /WEB-INF/struts-config.xml </ param-value > <o:p> </o:p>

    </ init-param > <o:p> </o:p>

    < init-param > <o:p> </o:p>

      < param-name > debug </ param-name > <o:p> </o:p>

      < param-value > 3 </ param-value > <o:p> </o:p>

    </ init-param > <o:p> </o:p>

    < init-param > <o:p> </o:p>

      < param-name > detail </ param-name > <o:p> </o:p>

      < param-value > 3 </ param-value > <o:p> </o:p>

</ init-param ><o:p>

<o:p> </o:p>

    <init-param><o:p>

      <param-name>configFactory</param-name><o:p>

      <param-value>org.aa.struts. UserModuleConfigFactory </param-value><o:p>

</init-param> <o:p> </o:p>

<o:p> </o:p>

    < load-on-startup > 0 </ load-on-startup > <o:p> </o:p>

  </ servlet ><o:p>

<o:p> </o:p>

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

<o:p> </o:p>

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

97329.html

zhyiwww 2007-02-01 17:34 发表评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值