- 浏览: 86869 次
文章分类
最新评论
-
mimicom:
晕倒.. 看了一半,,发现转载的 不全..... 至少:%s/ ...
正则表达式之道(转载) -
congjl2002:
你这个说了等于没说,不明白的还不明白,明白的也不是记住了这个才 ...
BC范式(转载) -
bud407:
<o:p> </o:p>
Struts的资源文件是如何初始化的--struts源码学习 -
johnnyhg:
根本没法运行!完整的代码给出来吧!
Java中实现图片裁剪 -
星光闪烁:
struts的初始化确实是很复杂啊,代码量太大了
Struts源码的切片学习(一)-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>
相关推荐
这个压缩包包含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 应用程序。它可以在完整发行版中使用,也可以作为单独的库、源代码、示例和文档...
struts2整合json的插件struts2-json-plugin源码,不是jar包
本代码只为学习,交流。 本代码是对博客Struts学习----Action 的配置和使用的代码的实现
struts2-core-2.0.1.jar, struts2-core-2.0.11.1.jar, struts2-core-2.0.11.2.jar, struts2-core-2.0.11.jar, struts2-core-2.0.12.jar, struts2-core-2.0.14.jar, struts2-core-2.0.5.jar, struts2-core-2.0.6.jar,...
赠送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 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 2源码查看xwork-2.1.5第二部分 Struts 2源码查看xwork-2.1.5第二部分 Struts 2源码查看xwork-2.1.5第二部分
Struts2完全学习手册-第19-21章 源码
Struts2完全学习手册-第15-18章 源码
struts-2.3.1.2-all.zip Struts源码和帮助文档 最新官方下载
Struts2源码分析--请求处理.pdf
struts2学习文档--中文版本。该版本是本人参考官方文档,里面的提到的内容皆通过本人的验证,可以放心使用!
赠送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-...
输出Hello World 使用到struts2标签和jstl表达式 2、 URL:http://localhost:8080/struts100515 输入用户名XXX ------> 提交 ,显示 你好 XXX 使用ONGL表达式 3、 URL:...
struts源码struts源码struts源码struts源码
struts2-convention-plugin-2.3.32