资源文件的初始化
<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>
资源文件,不过是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>
分享到:
相关推荐
struts-config.xml struts标准配置文件 struts-config
这个压缩包包含struts-xwork-core的src源码,导入eclipse即可。
struts框架入门学习---工程源码,希望对你有用,O(∩_∩)O~
Apache Struts 2 源码(struts-2.5.28.3-src.zip),Apache Struts 2.5.28.3是一个优雅的、可扩展的框架,用于创建企业级 Java Web 应用程序。它可以在完整发行版中使用,也可以作为单独的库、源代码、示例和文档...
Struts 2源码查看xwork-2.1.5第二部分 Struts 2源码查看xwork-2.1.5第二部分 Struts 2源码查看xwork-2.1.5第二部分
Struts2学习之二--Struts2标签介绍
赠送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学习----Action 的配置和使用的代码的实现
struts2整合json的插件struts2-json-plugin源码,不是jar包
struts 2 核心包 的源码 自己编译的 有错误是难免的
Struts 2源码查看xwork-2.1.5第一部分Struts 2源码查看xwork-2.1.5第一部分Struts 2源码查看xwork-2.1.5第一部分
struts源码+struts-lib struts源码+struts-lib
struts 1 文件 上传 源码 struts 1 文件 上传 源码 struts 1 文件 上传 源码 struts 1 文件 上传 源码 下载不扣分,回帖加1分,欢迎下载,童叟无欺
Struts2完全学习手册-第15-18章 源码
Struts2完全学习手册-第19-21章 源码
java struts2入门学习实例--使用struts2快速实现多个文件上传
struts2官方例子8-资源配置文件的使用(包括国际化),主要讲述struts资源文件的使用,以及国际化i18n的使用
赠送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源码分析--请求处理.pdf
struts-2.3.1.2-all.zip Struts源码和帮助文档 最新官方下载