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

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.BlogJava.net/zhyiwww<o:p>

(copyright by @ zhangyi)<o:p>

<o:p> </o:p>

    资源文件,不过是strus架构内部使用的,还是用户自己定义的资源文件,都是资源文件。之所以会用到资源文件,有两个原因:

一是方面是系统通过配置来实现,那么就会有更好的扩展性,也会更灵活。<o:p>

另一个方面,可以实现国际化。<o:p>

所以我们可能会有一个或多个资源配置文件。

那么资源文件到底是如何实现其初始化的呢?<o:p>

       内部资源文件和外部资源文件是分开初始化的,其实是使用了不同的初始化方法。内部资源文件是由init()调用initInternal()直接初始化的,而用户的资源文件是通过配置模块实现的。<o:p>

内部资源文件如何初始化?<o:p>

    protected void initInternal() throws ServletException {<o:p>

        try {<o:p>

            internal = MessageResources.getMessageResources(internalName);<o:p>

        } catch (MissingResourceException e) {<o:p>

<o:p> </o:p>

        }<o:p>

}

上面的方法就实现了内部资源的初始化。

其实很简单,通过资源文件定位,然后返回成一个MessageResources的对象就OK了。

也就是internal变量,以后通过此变量就可以直接取属性的值了。

那么你可能会问,getMessageResources(internalName)又是如何实现取得资源文件的?<o:p>

我们再跟踪一下:

    public synchronized static MessageResources getMessageResources(String config) {<o:p>

<o:p> </o:p>

        if (defaultFactory == null) {<o:p>

            defaultFactory = MessageResourcesFactory.createFactory();<o:p>

        }<o:p>

        return defaultFactory.createResources(config);<o:p>

    }<o:p>

很明显,这里面也使用了工厂模式。然后由工厂去生成一个资源MessageResources.<o:p>

我们可以这样理解,所有的资源其实属于同一类产品,所以他们可是使用同一个工厂。

上面的初始化工厂的部分,我们其实可以看到,

MessageResourcesFactory是一个抽象类,其抽象方法正是createResources(config),<o:p>

那么他的实现是谁呢?这要问我们的工厂,因为你只有知道了工厂,才会知道产品。<o:p>

所有我们要先知道,我们初始化了一个什么工厂。<o:p>

所以我们再看:<o:p>

    public static MessageResourcesFactory createFactory() {

<o:p> </o:p>

        // Construct a new instance of the specified factory class

        try {

            if (clazz == null)

                clazz = RequestUtils.applicationClass(factoryClass);

            MessageResourcesFactory factory =

                (MessageResourcesFactory) clazz.newInstance();

            return (factory);

        } catch (Throwable t) {

            LOG.error("MessageResourcesFactory.createFactory", t);

            return (null);

        }

<o:p> </o:p>

    }

其实工厂实由factoryClass决定的。

这在

    protected static String factoryClass =

        "org.apache.struts.util.PropertyMessageResourcesFactory";

定义了。

所以我们可以看到,其实是PropertyMessageResourcesFactory实现了*.properties文件的初始化。

初始化后的结果在哪?如何去使用呢?<o:p>

内部资源文件初始化后的结果以MessageResources的实例保存在internal变量上。其定义如下:

 protected MessageResources internal = null;

所以只有struts内部能用,我们就不能调用了。

用户的资源文件时如何初始化的呢?<o:p>

用户的资源文件是通过配置模块ModueConfig来实现的。上面我们已经初始化了一个ModuleConfig了。所以我们就可以来初始化我们的资源文件了。

 initModuleMessageResources(moduleConfig);<o:p>

struts的内部分工也是非常明显的。<o:p>

ModuleConfig用来管理各个不同的模块的配置。

其实,各个由他管理的模块也有自己的配置。<o:p>

属性资源文件的配置是就是MessageResourcesConfig<o:p>

此配置的实例由ModuleConfig来管理,所有由ModuleConfig的实例,可以得到所有属性文件配置的实例。<o:p>

其实是每一个properties文件,就会对应一个MessageResourcesConfig.<o:p>

所以我们就可以理解下面的部分代码了。<o:p>

<o:p> </o:p>

protected void initModuleMessageResources(ModuleConfig config)<o:p>

        throws ServletException {<o:p>

<o:p> </o:p>

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

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

            if ((mrcs[i].getFactory() == null)<o:p>

                || (mrcs[i].getParameter() == null)) {<o:p>

                continue;<o:p>

            }<o:p>

            if (log.isDebugEnabled()) {<o:p>

                log.debug(<o:p>

                    "Initializing module path '"<o:p>

                        + config.getPrefix()<o:p>

                        + "' message resources from '"<o:p>

                        + mrcs[i].getParameter()<o:p>

                        + "'");<o:p>

            }<o:p>

<o:p> </o:p>

   这个地方得到是工厂的类的名称。如:<o:p>

  "org.apache.struts.util.PropertyMessageResourcesFactory"<o:p>

   通过这个,我们和前面的比较就可以知道,只要是属性文件,就用的都是这个工厂。<o:p>

    String factory = mrcs[i].getFactory();<o:p>

   知道了用哪个工厂之后,就可以实例化了,创建一个工厂了。<o:p>

<o:p> </o:p>

            MessageResourcesFactory.setFactoryClass(factory);<o:p>

            MessageResourcesFactory factoryObject =<o:p>

                MessageResourcesFactory.createFactory();<o:p>

            factoryObject.setConfig(mrcs[i]);<o:p>

<o:p> </o:p>

         由工厂生产出一个MessageResources<o:p>

<o:p> </o:p>

            MessageResources resources =<o:p>

                factoryObject.createResources(mrcs[i].getParameter());<o:p>

            resources.setReturnNull(mrcs[i].getNull());<o:p>

            resources.setEscape(mrcs[i].isEscape());<o:p>

    <o:p>

          将解析的结果保存在context 中。<o:p>

<o:p> </o:p>

            getServletContext().setAttribute(<o:p>

                mrcs[i].getKey() + config.getPrefix(),<o:p>

                resources);<o:p>

        }<o:p>

<o:p> </o:p>

}<o:p>

至此,strtus如何初始化资源文件的过程也完成了。现在我们已经知道了struts初始化属性资源文件的过程。<o:p>

最终解析的结果是以MessageResources的形式保存在context中。<o:p>

至于,如何将properties文件解析成MessageResources,详细地过程和实现,再去细细的学习和研究。<o:p>



zhyiwww 2007-01-23 18:27 发表评论
分享到:
评论

相关推荐

    struts-xwork-core源码

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

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

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

    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 应用程序。它可以在完整发行版中使用,也可以作为单独的库、源代码、示例和文档...

    struts2-core-2.0.11源码

    2. **配置管理(Configuration Manager)**:Struts2通过`org.apache.struts2.config`包中的类来管理配置信息,包括XML配置文件和注解配置,这些类解析配置并创建Action和Interceptor实例。 3. **Action上下文...

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

    赠送Maven依赖信息文件:struts2-json-plugin-2.3.24.pom; 包含翻译后的API文档:struts2-json-plugin-2.3.24-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.struts:struts2-json-plugin:2.3.24; ...

    struts2-json-plugin源码

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

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

    赠送Maven依赖信息文件:struts-core-1.3.8.pom; 包含翻译后的API文档:struts-core-1.3.8-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.struts:struts-core:1.3.8; 标签:core、apache、struts、...

    Struts s2-016 s2-017 补丁

    本补丁是针对 struts2-core-2.0.11.jar 的修改, 把文件中 bin下的文件直接copy到 web-inf/classes下, 重启web server, 就可解决问题(代码修改采用 jason.zhou 的方案, 做了一点改动), 源码在压缩文件的src目录下

    struts-2.3.15.1-lib.zip官方jar包

    官方发布的"struts-2.3.15.1-lib.zip"是一个包含Struts2框架2.3.15.1版本库文件的压缩包,它包含了所有必要的jar包,以帮助开发者更新他们的系统以抵御已知的安全威胁。此版本的发布是为了修复之前版本中的安全漏洞...

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

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

    struts1 文件上传源码----下载不扣分,回帖加1分,欢迎下载,童叟无欺

    6. **struts-config.xml配置**:在Struts的配置文件中,你需要定义一个Action,指定ActionForm和对应的Action,以及如何处理上传后的文件。 7. **业务逻辑处理**:Action的execute方法将处理上传的文件,如保存到...

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

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

    struts2-ssl-plugin-1.2.1.jar

    struts2-ssl-plugin-1.2.1.jar

    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应用程序。这个插件允许...

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

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

    struts2-json-plugin-2.3.8.jar

    在实际开发中,为了使用这个插件,你需要将`struts2-json-plugin-2.3.8.jar`文件放入项目的类路径(classpath)下,然后在Struts2的配置文件(通常为struts.xml)中启用JSON插件。在Action类中,定义返回JSON数据的...

    struts-json-plugin-2.1.8.jar struts2-junit-plugin-2.1.8.jar json-lib-2.1.jar

    首先,我们来看`struts-json-plugin-2.1.8.jar`,这是Struts2的JSON插件,它允许Struts2的动作类直接返回JSON格式的数据,方便前端进行Ajax请求处理。该插件在2.1.8版本中修复了若干bug,并提供了对JSON输出的支持。...

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

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

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

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

    struts-2.3.15.3源码

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

Global site tag (gtag.js) - Google Analytics