- 浏览: 130702 次
- 性别:
- 来自: ...
文章分类
最新评论
对于Digester的使用最近才明白一直以来的疑惑,主要是针对SetNextRule的。以下面的部分的xml为例:
其对应的Digester的构造代码大致如下:
按照API文档,当parse时,过程应该是把this(Catalina)对象压栈,看到addObjectCreate就把StandardServer实例压栈,接着第一次看到了addSetNext时会做什么呢?
SetNextRule的api说当碰到下一个pattern元素(此例是'server')时,栈顶对象出栈,并把其作为参数按照method传递给top-1的对象,在此处就是把Server的实例通过Catalina的setServer传递调用,当这个方法完毕,Server也就出栈了。关键就是这句'碰到下一个pattern元素',说的不明不白,网上搜了一堆的资料看也基本上直接翻译的,没有过多的解释。如果不管这句话,暂时直接理解成看到SetNextRule就执行出栈,赋值。那么继续看下面的元素,Service的对象又入栈了,当再次看到addSetNext的时候,此时栈顶的Service出栈,并传给addService作为参数,这个addService的方法是Server的,但是Server出栈了,top-1是Catalina,显然不成立。
那么什么样的流程能解释呢?对应看xml文件,第一次看到Server是<Server>元素的开始,再次看到Server呢,对应的肯定是</Server>结束,这就是所谓的'下一个pattern元素'了,所以此后的过程就非常清晰了。遵循着类似递归的过程,由内而外的执行SetNextRule的匹配规则,Catalina,Server,Service,Executor相继入栈,最先看到下一个pattern元素的是</executor>所以调用Service的addExecutor执行完毕,Executor出栈;接着看到</Service>执行Server的addService,然后Service出栈,随后</Server>执行Catalina的setServer,最后Server出栈。
简单的理解是所谓的'the next pattern element'一般情况下可以看作tag的结束符。这样理解关于Digester的构造简单而且好辨别。虽然没有去看它的源码,但是个人认为这种推理应该是有一定的道理的。
<Server port="8005" shutdown="SHUTDOWN"> <Service name="Catalina"> <Executor name="tomcatThreadPool" maxThreads="150" minSpareThreads="4"> </Executor> </Service> </Server>
其对应的Digester的构造代码大致如下:
Digester digester = new Digester(); digester.push(this); digester.addObjectCreate("Server","org.apache.catalina.core.StandardServer","className"); digester.addSetProperties("Server"); digester.addSetNext("Server","setServer","org.apache.catalina.Server"); digester.addObjectCreate("Server/Service","org.apache.catalina.core.StandardService","className"); digester.addSetProperties("Server/Service"); digester.addSetNext("Server/Service","addService","org.apache.catalina.Service"); digester.addObjectCreate("Server/Service/Executor","org.apache.catalina.core.StandardThreadExecutor","className"); digester.addSetProperties("Server/Service/Executor"); digester.addSetNext("Server/Service/Executor","addExecutor","org.apache.catalina.Executor"); ...
按照API文档,当parse时,过程应该是把this(Catalina)对象压栈,看到addObjectCreate就把StandardServer实例压栈,接着第一次看到了addSetNext时会做什么呢?
SetNextRule的api说当碰到下一个pattern元素(此例是'server')时,栈顶对象出栈,并把其作为参数按照method传递给top-1的对象,在此处就是把Server的实例通过Catalina的setServer传递调用,当这个方法完毕,Server也就出栈了。关键就是这句'碰到下一个pattern元素',说的不明不白,网上搜了一堆的资料看也基本上直接翻译的,没有过多的解释。如果不管这句话,暂时直接理解成看到SetNextRule就执行出栈,赋值。那么继续看下面的元素,Service的对象又入栈了,当再次看到addSetNext的时候,此时栈顶的Service出栈,并传给addService作为参数,这个addService的方法是Server的,但是Server出栈了,top-1是Catalina,显然不成立。
那么什么样的流程能解释呢?对应看xml文件,第一次看到Server是<Server>元素的开始,再次看到Server呢,对应的肯定是</Server>结束,这就是所谓的'下一个pattern元素'了,所以此后的过程就非常清晰了。遵循着类似递归的过程,由内而外的执行SetNextRule的匹配规则,Catalina,Server,Service,Executor相继入栈,最先看到下一个pattern元素的是</executor>所以调用Service的addExecutor执行完毕,Executor出栈;接着看到</Service>执行Server的addService,然后Service出栈,随后</Server>执行Catalina的setServer,最后Server出栈。
简单的理解是所谓的'the next pattern element'一般情况下可以看作tag的结束符。这样理解关于Digester的构造简单而且好辨别。虽然没有去看它的源码,但是个人认为这种推理应该是有一定的道理的。
发表评论
文章已被作者锁定,不允许评论。
-
一道位操作的趣味编程题
2010-03-14 10:50 2088看到一道很有意思的编程题:大厅里有64盏灯,每盏灯都编 ... -
一道字符串截取的编程题
2010-03-11 10:52 2283最近接触到一道字符串截取的编程题:编写一个截取字符串的 ... -
一道多线程趣味热身题
2010-02-28 18:01 1922保持对知识点或者技术的熟悉度对于程序员至关重要,要学会 ... -
疑似Google多线程面试题的Java实现
2010-02-24 17:39 4914来到一个完全陌生的地方,即将一切从新开始,内心兴奋又忐 ... -
Mina的线程池实现分析(2)
2010-02-10 17:31 4527分析了I/O事件的存储,下面看看多个Worker同时工 ... -
Mina的线程池实现分析(1)
2010-02-10 17:28 11579线程池是并发应用中,为了减少每个任务调用的开销增强性能 ... -
多线程基础总结十一--ConcurrentLinkedQueue
2010-02-03 17:52 12848ConcurrentLinkedQueue充分使用了a ... -
LinkedBlockingQueue应用--生产消费模型简单实现
2010-01-29 20:45 8141之前介绍时LinkedBlockingQueue提到了 ... -
多线程基础总结十--LinkedBlockingQueue
2010-01-28 14:33 15375随着多线程基础总结的增多,却明显的感觉知道的越来越少, ... -
号称放倒一片的一道J2SE基础题的个人理解
2010-01-23 14:07 2793近日无意中看到一道Java基础题,号称在接受测试的10 ... -
多线程基础总结九--Mina窥探(1)
2010-01-21 23:46 5404一直以来的多线程的基础总结都是脱离应用的,但是要说多线 ... -
多线程基础总结八--ReentrantReadWriteLock
2010-01-15 23:22 7513说到ReentrantReadWriteLock,首先 ... -
多线程基础总结七--ReentrantLock
2010-01-09 23:17 7682之前总结了部分无锁机制的多线程基础,理想的状态当然是利 ... -
关于atomic问题的一点理解
2009-12-30 16:42 2440之前看到一个帖子是关于atomic使用的,当时没有仔细 ... -
多线程基础总结六--synchronized(2)
2009-12-18 18:45 1872早在总结一时,我就尽量的把synchronized的重点 ... -
多线程基础总结五--atomic
2009-12-17 19:46 3554在简单介绍java.util.c ... -
多线程基础总结四--ThreadLocal
2009-12-16 19:48 2724说到ThreadLocal,首先 ... -
多线程基础总结三--volatile
2009-12-15 20:09 2530前面的两篇总结简 ... -
多线程基础总结二--Thread
2009-12-12 23:27 2672对于Thread来说 ... -
多线程基础总结一--synchronized(1)
2009-12-12 23:23 3070最近写关于并发的小应 ...
相关推荐
digester
Castor、digester实例 Castor、digester实例 Castor、digester实例
用Digester開發的一個小程序。
Digester java解析xml jar包
资源为Digester的xml解析应用案例,
赠送jar包:commons-digester3-3.2.jar; 赠送原API文档:commons-digester3-3.2-javadoc.jar; 赠送源代码:commons-digester3-3.2-sources.jar; 赠送Maven依赖信息文件:commons-digester3-3.2.pom; 包含翻译后...
Digester不是一个XML Parser,它只是对SAX更高层次上的一个封装使用Digester,将XML映射成javaBean. 我们无须了解SAX和DOM的解析过程,只要给Digester添加一些解析规则,就能对一个xml文件进行解析。Digester使用...
此为官网版本的commons-digester-2.1.jar maven中下载的commons-digester-2.1.jar无法使用
不错的解析XML的类,主要利用org.apache.commons.digester.Digester;
commons-digester-2.0.rar源文件及jar文件
digester3.2 源码 and digester3.2 application sample
Digester读取xml教程.rar
赠送jar包:commons-digester-1.8.1.jar; 赠送原API文档:commons-digester-1.8.1-javadoc.jar; 赠送源代码:commons-digester-1.8.1-sources.jar; 赠送Maven依赖信息文件:commons-digester-1.8.1.pom; 包含...
赠送jar包:commons-digester3-3.2.jar; 赠送原API文档:commons-digester3-3.2-javadoc.jar; 赠送源代码:commons-digester3-3.2-sources.jar; 赠送Maven依赖信息文件:commons-digester3-3.2.pom; 包含翻译后...
commons-digester.jar
digester相关jar包,包括:commons-beanutils.jar、commons-collections.jar、commons-digester.jar、commons-logging-1.1.3.jar
digester解析xml的全套组件,分别为digester-1.8, collections-3.2, beanutils-1.7.0, logging- <br>1.1.1。4个包里的jar文件已放在了一起,方便使用者导入,使用者亦可通过前缀区别组件。另外,jar <br>和...
digester组件简化了xml文件处理操作
Digester的XML规则文件配置: 在Digester中提供了一个包:org.apache.commons.digester.xmlrules。这个包中的类可以从一个XML文档中读取并返回一个指定的配置信息。XML文档配置文件必须使用DTD,这是xmlrules包的一...