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

Struts源码的切片学习(五)--再谈资源模块的初始化

阅读更多

Struts 源码的切片学习(五)

-- 再谈资源模块的初始化

<o:p>
</o:p>

Author      :      zhyiwww<o:p>

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

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

转载请注明出处 www.BlogJava.net/zhyiwww<o:p>

(copyright by @ zhangyi)<o:p>

<o:p> </o:p>

<o:p> </o:p>我以前已经说过了, Struts 的资源配置是, ActionServlet. 通过
<o:p> </o:p>

->init() 方法初始化 <o:p> </o:p>

-> 配置模块(初始化系统的配置) <o:p> </o:p>

-> 通过配置模块取得资源的配置 <o:p> </o:p>

-> 资源模块的初始化。 <o:p> </o:p>

<o:p> </o:p>
这是一个宏观的过程。整体的思路是这样的。那么,我们现在的疑问是:

资源模块初始化的时候要先取得配置,那么配置从何而来 ?<o:p>

<o:p> </o:p>

ModuleConfig config <o:p> </o:p>

MessageResourcesConfig mrcs[] = config.findMessageResourcesConfigs();<o:p>

通过这个语句,我们可以知道,其配置参数要通过 ModuleConfig 而来。 <o:p> </o:p>

<o:p> </o:p>

那么我们就要看一下, MessageResourcesConfig 参数的数组是如何初始化的呢? <o:p> </o:p>

findMessageResourcesConfigs ()方法里面仅仅是完成了 ModuleConfig 中的一个一个 HashMap 实例的转换,变成了一个数组。 <o:p> </o:p>

那么我们还要知道, 到底这个 HashMap 是怎么样初始化的,在什么时候初始化的 ? <o:p> </o:p>

其实这个我们已经找到了 ModuleConfig 的一个实现上来了,也就 ModuleConfigImpl <o:p> </o:p>

到这个地方就终止了。因为在 ModuleConfigImpl 里面就没有关于初始化里面的属性的部分。那么到底在什么地方,什么时候,系统给与其初始化了呢? <o:p> </o:p>

这说明,在调用之前,系统一定已经给与了初始化了。所以,我们在看 ActionServlet 的初始化模块配置的部分。 <o:p> </o:p>

看一下其配置模块部分是如何进行初始化的。 <o:p> </o:p>

            initModuleConfigFactory();<o:p>

            // Initialize modules as needed<o:p>

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

现在我们就找到了这两个语句。 <o:p> </o:p>

上面的就是初始化工厂的,下面语句就是我们漏掉的部分,也就是在这里面,偷偷的进行了系统的配置部分的初始化,也正是在这个部分,完成了所有的配置文件的解析和实例化。其利用的就是 Digester.<o:p>

这一句,执行结果的表面就是返回了一个 ModuleConfig 的实例 , 其实是 ModuleConfigImpl 的一个实例。 <o:p> </o:p>

那么,我们就去看一下,里面究竟做了些什么? <o:p> </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> </o:p>

<o:p> </o:p>

其实,从上到下,我们可以这样理解: <o:p> </o:p>

<!----> ü        <!----> 先实例化一个解析器 <o:p> </o:p>

<!----> ü        <!----> 然后把配置文件放入栈里面,等待解析 <o:p> </o:p>

<!----> ü        <!----> 解析配置文件 <o:p> </o:p>

<o:p> </o:p>

其实,也确实没有什么特别的地方,但是在初始化解析器的时候,我们要告诉他,到底要怎么样去解析,解析成什么对象的实例。这个部分其实才是核心的部分。 <o:p> </o:p>

那么,到底他是怎么样去初始化解析器的呢? <o:p> </o:p>

我们看一下 initConfigDigester ()是如何实现的。 <o:p> </o:p>

        // Create a new Digester instance with standard capabilities<o:p>

        configDigester = new Digester();<o:p>

        configDigester.setNamespaceAware(true);<o:p>

        configDigester.setValidating(this.isValidating());<o:p>

        configDigester.setUseContextClassLoader(true);<o:p>

        configDigester.addRuleSet(new ConfigRuleSet());<o:p>

<o:p> </o:p>

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

            URL url = this.getClass().getResource(registrations[i+1]);<o:p>

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

                configDigester.register(registrations[i], url.toString());<o:p>

            }<o:p>

        }<o:p>

<o:p> </o:p>

        this.addRuleSets();<o:p>

<o:p> </o:p>

这一段代码就实现了上面的初始化和实例化的功能,当然是解析配置文件 xml 文件后的结果。 <o:p> </o:p>

这个地方我们可以看到, <o:p> </o:p>

  configDigester.addRuleSet(new ConfigRuleSet());<o:p>

定义了解析的规则, <o:p> </o:p>

其实这个规则是由 ConfigRuleSet 制定的。 <o:p> </o:p>

ConfigRuleSet 里面,告诉了解析把每一个标签元素解析成什么样的对象。 <o:p> </o:p>

<o:p> </o:p>

        digester.addObjectCreate<o:p>

            ("struts-config/data-sources/data-source",<o:p>

             "org.apache.struts.config.DataSourceConfig",<o:p>

             "className");<o:p>

        digester.addSetProperties<o:p>

            ("struts-config/data-sources/data-source");<o:p>

        digester.addSetNext<o:p>

            ("struts-config/data-sources/data-source",<o:p>

             "addDataSourceConfig",<o:p>

             "org.apache.struts.config.DataSourceConfig");<o:p>

    …………………………………<o:p>

              还有很多,但是都是实现一样的功能和目的。 <o:p> </o:p>

这样我们就知道了,通过这个过程之后,我们就把配置文件 struts-config.xml 或者你自己的配置的文件中的配置解析到了对象中。 <o:p> </o:p>

具体到消息资源模块的部分就是: <o:p> </o:p>

   digester.addObjectCreate <o:p> </o:p>

            ( "struts-config/message-resources" , <o:p> </o:p>

             "org.apache.struts.config.MessageResourcesConfig" , <o:p> </o:p>

             "className" ); <o:p> </o:p>

        digester.addSetProperties <o:p> </o:p>

            ( "struts-config/message-resources" ); <o:p> </o:p>

        digester.addSetNext <o:p> </o:p>

            ( "struts-config/message-resources" , <o:p> </o:p>

             "addMessageResourcesConfig" , <o:p> </o:p>

             "org.apache.struts.config.MessageResourcesConfig" ); <o:p> </o:p>

<o:p> </o:p>

        digester.addSetProperty <o:p> </o:p>

            ( "struts-config/message-resources/set-property" , <o:p> </o:p>

             "property" , "value" );<o:p>

这一段代码告诉我们把消息资源的配置的部分放到了 org.apache.struts.config.MessageResourcesConfig 对象的对应属性里面了。 <o:p> </o:p>

所以,我们才可以从上面的部分直接去的其配置数组。 <o:p> </o:p>

至于后面的消息资源模块的初始化的其他细节,在此不在详细说明了。 <o:p> </o:p>



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

相关推荐

    struts-xwork-core源码

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

    struts2-core-2.0.11源码

    5. **结果类型(Result Types)**:`org.apache.struts2.dispatcher.mapper`包中的`ResultMapper`接口及其实现类,定义了如何根据Action的结果名映射到实际的视图资源,比如JSP页面或FreeMarker模板。 6. **插件...

    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框架入门学习---工程源码

    这个“Struts框架入门学习---工程源码”压缩包提供了学习Struts的基础材料,让我们逐步深入理解这个框架的核心概念。 首先,Struts框架的核心是Action类,它是业务逻辑处理的主要载体。在mystruts工程中,你可以...

    struts2-json-plugin源码

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

    struts2-json-plugin-2.3.24-API文档-中文版.zip

    赠送jar包:struts2-json-plugin-2.3.24.jar; 赠送原API文档:struts2-json-plugin-2.3.24-javadoc.jar; 赠送源代码:struts2-json-plugin-2.3.24-sources.jar; 赠送Maven依赖信息文件:struts2-json-plugin-...

    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...

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

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

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

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

    struts2-dojo-plugin-2.2.1.jar

    1. Dojo的模块化系统(AMD,Asynchronous Module Definition):了解如何导入和使用Dojo模块,这将帮助你有效地组织和加载代码。 2. Dojo的Dijit部件:掌握常见的Dijit部件,如Button、TextBox、Grid等,以及如何在...

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

    `struts2-json-plugin-2.1.8.1.jar` 则是Struts 2框架的一个插件,主要用于增强Struts 2对JSON的支持。Struts 2是一款非常流行的MVC(Model-View-Controller)框架,用于构建企业级的Java Web应用程序。这个插件允许...

    struts-2.3.15.3源码

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

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

    本资源包含了Struts2完全学习手册的第19至21章的源码,这三章主要涵盖了Struts2的核心机制、自定义拦截器和高级特性。通过深入学习这些章节的源码,开发者可以更深入地理解Struts2的工作原理,并能够灵活地应用到...

    struts2-convention-plugin-2.3.32

    struts2-convention-plugin-2.3.32

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

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

    struts2-core-2.2.3-sources源码

    struts2-core-2.2.3-sources 源码直接在eclipse或者MyEclipse中attach在struts2-core-2.2.3.jar包上就可以在工程中直接查看Struts2源码。可以再网上搜索教程

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

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

    struts2-core-2.3.7源码

    1. **StrutsPrepareAndExecuteFilter**: 这是Struts2的过滤器,负责初始化框架并处理请求。 2. **ActionContext**: 包含了当前请求的所有上下文信息,如session、request、response、value stack等。 3. **...

    struts2-json-plugin-2.3.8.jar

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

    struts-2.1.8-all-src.zip

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

Global site tag (gtag.js) - Google Analytics