zhyiwww
用平实的笔,记录编程路上的点点滴滴………
posts - 536,comments - 394,trackbacks - 0

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

 

 

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(){

        String configFactory = getServletConfig().getInitParameter("configFactory");

        if (configFactory != null) {

            ModuleConfigFactory.setFactoryClass(configFactory);

        }

}

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

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

    public static void setFactoryClass(String factoryClass) {

        ModuleConfigFactory.factoryClass = factoryClass;

        ModuleConfigFactory.clazz = null;

    }

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

    protected static String factoryClass =

        "org.apache.struts.config.impl.DefaultModuleConfigFactory" ;

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

 

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

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

   protected ModuleConfig initModuleConfig(String prefix, String paths)

        throws ServletException {

       /*************************************************************

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

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

也就是

    protected static String factoryClass =

        "org.apache.struts.config.impl.DefaultModuleConfigFactory" ;

的一个实例。

*************************************************************/

           ModuleConfigFactory factoryObject = ModuleConfigFactory.createFactory();

        ModuleConfig config = factoryObject.createModuleConfig(prefix);

 

        // Configure the Digester instance we will use

        Digester digester = initConfigDigester();

 

        // Process each specified resource path

        while (paths.length() > 0) {

            digester.push(config);

            String path = null;

            int comma = paths.indexOf(',');

            if (comma >= 0) {

                path = paths.substring(0, comma).trim();

                paths = paths.substring(comma + 1);

            } else {

                path = paths.trim();

                paths = "";

            }

 

            if (path.length() < 1) {

                break;

            }

 

            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++) {

            if (fbs[i].getDynamic()) {

                fbs[i].getDynaActionFormClass();

            }

        }

 

        return config;

    }

 

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

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

先看默认的情况:

public class DefaultModuleConfigFactory extends ModuleConfigFactory implements Serializable{

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

 

    /**

     * 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) {

 

        return new ModuleConfigImpl(prefix);

 

    }

}

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

 

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

public class UserModuleConfigFactory extends ModuleConfigFactory implements Serializable{

       public ModuleConfig createModuleConfig(String prefix) {

 

        return new ModuleConfigUserImpl(prefix);

 

    }

}

       当然,如果要启用你的工厂的话,那么还要在你的配置文件中添加如下部分,在 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 >

 

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

 

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



|----------------------------------------------------------------------------------------|
                           版权声明  版权所有 @zhyiwww
            引用请注明来源 http://www.blogjava.net/zhyiwww   
|----------------------------------------------------------------------------------------|
posted on 2007-02-01 17:34 zhyiwww 阅读(824) 评论(0)  编辑  收藏 所属分类: j2ee

只有注册用户登录后才能发表评论。


网站导航: