`
zhyiwww
  • 浏览: 90082 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

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>

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



zhyiwww 2007-02-01 17:34 发表评论
分享到:
评论

相关推荐

    struts-xwork-core源码

    Struts-xwork-core是Struts2框架的核心组件,它提供了Action和结果的执行模型,以及类型转换、数据验证和国际化等功能。在这个压缩包中,包含了该核心库的源代码,对于学习和理解Struts2的工作原理及其内部机制极具...

    Struts学习----Action 的配置和使用(源码学习)

    首先,Action配置主要在Struts配置文件(struts-config.xml)中进行。这个文件定义了应用程序的行为,包括Action的映射、结果页面的设定、数据校验规则等。在`&lt;struts-config&gt;`标签内,我们通常会看到`&lt;action&gt;`标签...

    struts框架入门学习---工程源码

    总结来说,这个“Struts框架入门学习---工程源码”提供了实践Struts框架的基础,涵盖了Action、MVC模式、配置文件、拦截器和视图等方面,对于初学者来说是一份宝贵的资料。通过分析和运行这个工程,你可以更好地理解...

    struts2-json-plugin源码

    3. **JSON插件配置**:在`struts-plugin.xml`配置文件中,会注册JSON插件,声明结果类型和其他相关设置,如启用GZIP压缩、排除某些字段等。 4. **拦截器**:Struts2的拦截器机制允许在Action调用前后执行特定逻辑。...

    Apache Struts 2 源码(struts-2.5.28.3-src.zip)

    Apache Struts 2 源码(struts-2.5.28.3-src.zip),Apache Struts 2.5.28.3是一个优雅的、可扩展的框架,用于创建企业级 Java Web 应用程序。它可以在完整发行版中使用,也可以作为单独的库、源代码、示例和文档...

    struts-core-1.3.8-API文档-中文版.zip

    赠送jar包:struts-core-1.3.8.jar; 赠送原API文档:struts-core-1.3.8-javadoc.jar; 赠送源代码:struts-core-1.3.8-sources.jar; 赠送Maven依赖信息文件:struts-core-1.3.8.pom; 包含翻译后的API文档:struts...

    Struts2源码分析--请求处理.pdf

    Struts2源码分析--请求处理.pdf

    json-lib-2.1.jar和struts2-json-plugin-2.1.8.1.jar

    - 插件集成:此插件使得Struts 2可以无缝集成JSON支持,无需额外的配置。 - JSON Action:允许Action返回JSON结果,而不是HTML,这对于AJAX请求非常有用。 - 自动映射:自动将Action的属性映射到JSON对象,简化了...

    struts2-ssl-plugin-1.2.1.jar

    struts2-ssl-plugin-1.2.1.jar

    struts-2.1.8-all-src.zip

    4. **struts-default**:这个模块包含了Struts2默认的配置和行为,如默认的拦截器栈。 通过研究这些源代码,开发者不仅可以深入理解Struts2的工作机制,还能学习到如何设计和实现一个成熟的MVC框架。此外,对于那些...

    struts2-json-plugin-2.3.8.jar

    这个插件主要的功能是让Struts2应用程序能够轻松地处理JSON(JavaScript Object Notation)数据格式,使得Web应用可以方便地进行JSON序列化和反序列化,从而实现与前端的Ajax交互。 Struts2是一个基于Model-View-...

    struts-2.3.15.3源码

    总的来说,Struts 2.3.15.3 源码的学习可以帮助开发者深入理解MVC框架的设计与实现,以及如何在实际项目中有效地运用Struts 2。通过阅读源码,你可以探索其内部工作原理,提高问题排查能力,并了解如何优化和定制...

    Struts2完全学习手册-第19-21章 源码

    通过理解并分析这一章的源码,你可以了解到如何定义、实现和配置拦截器,以及如何构建拦截器链,这将极大地增强你对Struts2处理流程的控制能力。 第21章深入探讨了Struts2的高级特性和最佳实践。这可能包括动态方法...

    struts2 的类库 commons-logging-1.1 源码

    在实际使用中,`LogFactory` 类是获取 `Log` 实例的主要入口点,它负责根据类路径下的配置或者系统属性来查找并实例化合适的日志实现。例如,如果系统中存在 Log4j 的配置,那么 Commons Logging 就会使用 Log4j ...

    Struts2完全学习手册-第15-18章 源码

    本资源包含了Struts2完全学习手册的第15至18章的源码,这四章主要涵盖以下几个核心知识点: 1. **Action与Result** (第15章) - **Action**: Struts2的核心组件,它代表了用户请求处理的业务逻辑。Action类是自定义...

    struts-2.3.1.2-all.zip Struts源码和帮助文档

    总之,`struts-2.3.1.2-all.zip`包含的源码和帮助文档是深入理解Struts 2框架及其工作原理的重要资源,无论是初学者还是经验丰富的开发者,都能从中受益匪浅。通过阅读源码,开发者可以了解到框架内部的实现细节,而...

    struts1.38包,struts-core-1.3.8.jar

    struts1.38包,struts-core-1.3.8.jarstruts1.38包,struts-core-1.3.8.jar

    Struts2源码分析--请求处理[汇编].pdf

    Struts2源码分析--请求处理[汇编].pdf

    Struts-2.2.3.1-src.zip

    这个版本的Struts源码提供了深入理解框架内部工作原理的机会,对于开发者来说,是学习和调试Struts应用的重要资源。 在Struts 2.2.3.1的源码中,我们可以看到以下几个关键组成部分: 1. **xwork-core**: 这是...

    struts2 最新漏洞 S2-016、S2-017修补方案 .docx

    同时,需要注意的是,这两个漏洞的修补需要对 Struts2 的配置文件进行修改,因此需要对 Struts2 的配置文件有充分的了解和掌握。 Struts2 的 S2-016 和 S2-017 漏洞的修补需要对 Struts2 的源代码和配置文件进行...

Global site tag (gtag.js) - Google Analytics