`

Digester 1.0 源码阅读

阅读更多

    近来在学习tomcat的源码,里面有一部分是使用Digester来解析xml文件的过程。感觉这个工具的代码量比较小,就稍微研究了一下,我近来发现研究开源的代码要从最小版本开始研究,这样
研究有下面一些好处(个人感觉):
    1. 一般来说代码量比较小,阅读起来稍微简单一些;
    2. 容易和作者产生共鸣;
     3. 一般来说都是基于第一版本向上重构,可以进一步和作者进行共鸣。
有一篇博客我详细介绍了Digester的使用,大家可以参考我的另一篇博客。
大家可以看一下类结构图:


1. 首先Digester类是一个核心,它实现了XML解析的所有逻辑,重点有两个全局
变量,一个是ArrayStack bodyTexts,这个里面保存着任何两个节点之间的内容,
我也不知道这样描述合适不,稍微讲一下吧。


      
<students>
			<student>
				<name value="Test Person" />
			</student>
	   </students>

遇到students节点后,会将“”压到栈中,遇到student节点后,会将\n\t压入到栈中,遇到
name节点后会将\n\t\t压入到栈中,我想大家就明白了,就是把所有的内容都会压入到栈中。
还有一个全局变量是ArrayStack stack,这个里面保存着压入到栈中的对象,比如一般我们会
将root对象压入到栈中,然后遇到student节点后会创建一个对象并把它压入到栈中。


2. 在Digester的startElement方法会触发当前所有匹配的rule的begin方法。
   在endElement方法里面会触发当前所有匹配的rule的body方法,接着会触发所有匹配rule的
end方法, 在endDocument方法里面会触发当前所有匹配rule的finish方法,来完成一下善后处理。


3. 其实bodyTexts的变化主要是在startElement和endElement方法进行的,而stack的变化则是
主要在我们定义的一些rule里面操作的,比如ObjectCreateRule,就是创建一个新的对象,然后
将它压入到栈中。


4. 我们来简单的讲一下rule的实现吧,Rule抽象类主要是定义了一些操作,我们也讲过了主要是在
startElement和endElement方法以及endDocument方法里面触发。


5. ObjectCreateRule就是在begin方法里面创建一个对象,并把它压入到栈中,而目标类我们可以
定义在xml的属性中的,这一点我们不惊奇,因为Digester的初衷就是为了解析struts1的配置文件的。
在end方法里面把当前对象从栈中弹出。


6. SetNextRule和SetTopRule和相似,我到理解就是一个是setChild一个是setParent,就是基于栈中
的两个元素来进行操作的。 在SetNextRule里面,child是栈顶元素,parent是栈中的第二个元素。在
SetTopRule中,parent是栈顶元素,child是栈中的第二个元素。


7. SetProperitesRule很好理解就是用反射去给元素设置上相应的值, SetPropertyRule很不好理解,不过
看了例子之后应该也没有问题,就是真正的name和value是用另外的属性来保存的。


8. CallMethodRule和CallParamRule是配合使用的,在CallMethodRule里面定义了要调用的函数的名称,参数个数,参数类型等信息,如果参数个数为0,则是使用当前的节点里面的内容作为参数,如果参数的类型信息没有传递,则是使用的是String类型。 然后将函数的参数信息构造成一个String类型的数组,等待CallParamRule来进行赋值。 CallParamRule则是定义了要赋值的参数index和相应的值,这两个配合的很好,感觉设计的很巧妙。


9. 还有Digeister的rules是一个Map<String,ArrayList<Rule>>类型的一个数据结构, 所以它的顺序是
put和get的顺序是相同的。



读源码后的感受:
     虽然使用了ArrayStack bodyTexts来保存节点的content信息,但是保存的是一个StirngBuffer bodyText对象,而清空它使用的是bodyText.setLength(0),所以栈中的内容每时每刻都是相同的,感觉这个栈没有发挥它的最大 作用,这个不明白为什么?????
       现在Digester的最新源码是2.0,中间有1.4 1.8 和 2.0, 我都会去阅读的,并分享给大家。 还希望高手能解决我的疑问。



  • 大小: 44.8 KB
0
0
分享到:
评论

相关推荐

    利用digester来将xml转换为bean

    本篇文章将深入探讨如何利用Digester来实现XML到Bean的转换,并通过实例代码演示这一过程。 Apache Commons Digester是一个开源工具,它允许开发者定义一系列规则,这些规则描述了XML文档结构与Java对象之间的映射...

    利用commons-digester解析xml

    在上述代码中,我们创建了一个`Digester`实例,并使用`RulesBinder`配置了规则。规则包括在遇到"root/person"时创建`Person`对象,遇到"name"时调用`setName`方法,以此类推。最后,`digester.parse()`方法会根据...

    RSSLIBJ的API文档及源代码

    2. **源代码** (`rome-1.0-sources`) RSSLIBJ 的源代码提供了深入理解库内部工作原理的机会。开发者可以查看类的实现细节,理解其设计模式和算法,这对于进行自定义扩展或者调试非常有用。例如,`...

    心之语许愿墙 v1.0

    配置源程序附加数据库SQL Server 2008(1)将DataBase文件夹中的两个文件拷贝到SQL Server 2000安装路径下的Data文件夹中。(2)打开SQL Server 2008中的“你的服务器”,然后展开本地服务器,在“数据库”数据项上...

    Extjs Tree + JSON + Struts2 示例源代码

    现在我自己做了一个所有源代码的包,供大家下载。 有几点事项请大家注意 1、blogjava的文件上载要求单个文件不能超过4M,所以,我把web-inf目录下的所有jar文件删除了。 所有jar文件的列表是: commons-beanutils-...

    心之语许愿墙 v1.0.zip

    (2)将Struts 2.0驱动包(antlr.jar、commons-beanutils.jar、commons-digester.jar、commons-fileupload.jar、commons-logging.jar、commons-validator.jar、jakarta-oro.jar、jsf-api.jar、jsf-impl.jar、jstl-...

    心之语许愿墙系统源码 v1.0

    (2)将Struts 2.0驱动包(antlr.jar、commons-beanutils.jar、commons-digester.jar、commons-fileupload.jar、commons-logging.jar、commons-validator.jar、jakarta-oro.jar、jsf-api.jar、jsf-impl.jar、jstl-...

    Struts实践入门(原创)

    在开始安装 Struts 之前,首先需要下载其源代码和支持库。这里以 Struts 1.1 beta1 版本为例: - **jakarta-struts-1.1-b1-src.zip**:包含 Struts 的源代码。 - **jakarta-struts-1.1-b1-lib.zip**:包含 Struts ...

    Struts 源码学习之ActionServlet

    ### Struts 源码学习之ActionServlet #### 一、引言 在Java Web开发领域,Struts框架因其简洁的MVC(Model-View-Controller)架构模式而备受开发者青睐。本文旨在深入剖析Struts框架的核心组件之一——`Action...

    apache commons jar(commons所有的jar包,从官网下载提供给大家)

    因为涉及jar太多,包括有src源代码,只需要3分,希望大家理解,我也是从官网花了很长时间才一个一个下完,需要的请自取。全部是zip文件,每个对应的会有一个bin和一个src源文件。 apache-sanselan-incubating-0.97-...

    新增LIB

    标签“源码”和“工具”表明内容可能涉及源代码管理和使用的工具,可能包括编译、构建或依赖管理工具。 从提供的压缩包文件名称列表来看,这些是Java项目的jar文件,它们是Java类库,用于提供额外的功能。下面对...

    JSF+Spring+Hibernate小例子

    commons-fileupload-1.0.jar commons-lang-2.3.jar commons-logging-1.1.jar commons-pool-1.2.jar dbunit-2.2.jar dom4j-1.6.1.jar ehcache-1.1.jar hibernate-3.1.3.jar jstl-1.2.jar jta.jar log4j-1.2.14.jar ...

    Velocity用户手册---中文版

    Velocity的出现为Web应用的开发提供了一个遵循MVC架构的选择,它支持多种应用场景,不仅限于Web站点开发,还可以用于生成SQL、PostScript、XML等,甚至作为源代码生成工具或集成到其他系统中。 要使用Velocity,你...

    jasperReport+struts2+jatoolsPrinter打印

    8. commons-digester-1.7.jar:Apache Commons Digester,用于将XML数据自动绑定到Java对象。 9. jatoolsPrinter1.0.rar:这是jatoolsPrinter的库文件,可能需要解压后在项目中引用,用于实现打印功能。 总的来说...

    xml解析

    1. **文档声明**:XML文档通常以`&lt;?xml version="1.0" encoding="UTF-8"?&gt;`开头,定义了文档的版本和字符编码。 2. **元素(Element)**:XML的核心组成部分,由标签包围,如`&lt;tag&gt;`和`&lt;/tag&gt;`。元素可以包含文本、...

    struts国际化的使用

    - **研究源码**:`.war`文件在Tomcat启动时会被自动解压成文件夹形式,这有助于开发者研究其内部结构。 ##### 3. 创建工程 在`webapps`目录下新建`international`文件夹,并在其内创建`WEB-INF`和`WEB-INF/classes...

    介绍J2EE常用Jar包的含义.doc

    - **用途**: 与JavaMail相关的库,主要负责邮件的数据源和类型管理等。通常与`mail.jar`一起使用。 - **应用场景**: 在需要发送或接收邮件的应用程序中,如订单确认邮件、用户注册确认邮件等场景。 2. **ajaxtags...

Global site tag (gtag.js) - Google Analytics