- 浏览: 132392 次
- 性别:
- 来自: ...
文章分类
最新评论
对于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 2128看到一道很有意思的编程题:大厅里有64盏灯,每盏灯都编 ... -
一道字符串截取的编程题
2010-03-11 10:52 2324最近接触到一道字符串截取的编程题:编写一个截取字符串的 ... -
一道多线程趣味热身题
2010-02-28 18:01 1965保持对知识点或者技术的熟悉度对于程序员至关重要,要学会 ... -
疑似Google多线程面试题的Java实现
2010-02-24 17:39 4992来到一个完全陌生的地方,即将一切从新开始,内心兴奋又忐 ... -
Mina的线程池实现分析(2)
2010-02-10 17:31 4602分析了I/O事件的存储,下面看看多个Worker同时工 ... -
Mina的线程池实现分析(1)
2010-02-10 17:28 11644线程池是并发应用中,为了减少每个任务调用的开销增强性能 ... -
多线程基础总结十一--ConcurrentLinkedQueue
2010-02-03 17:52 12976ConcurrentLinkedQueue充分使用了a ... -
LinkedBlockingQueue应用--生产消费模型简单实现
2010-01-29 20:45 8238之前介绍时LinkedBlockingQueue提到了 ... -
多线程基础总结十--LinkedBlockingQueue
2010-01-28 14:33 15456随着多线程基础总结的增多,却明显的感觉知道的越来越少, ... -
号称放倒一片的一道J2SE基础题的个人理解
2010-01-23 14:07 2855近日无意中看到一道Java基础题,号称在接受测试的10 ... -
多线程基础总结九--Mina窥探(1)
2010-01-21 23:46 5470一直以来的多线程的基础总结都是脱离应用的,但是要说多线 ... -
多线程基础总结八--ReentrantReadWriteLock
2010-01-15 23:22 7568说到ReentrantReadWriteLock,首先 ... -
多线程基础总结七--ReentrantLock
2010-01-09 23:17 7741之前总结了部分无锁机制的多线程基础,理想的状态当然是利 ... -
关于atomic问题的一点理解
2009-12-30 16:42 2495之前看到一个帖子是关于atomic使用的,当时没有仔细 ... -
多线程基础总结六--synchronized(2)
2009-12-18 18:45 1920早在总结一时,我就尽量的把synchronized的重点 ... -
多线程基础总结五--atomic
2009-12-17 19:46 3602在简单介绍java.util.c ... -
多线程基础总结四--ThreadLocal
2009-12-16 19:48 2769说到ThreadLocal,首先 ... -
多线程基础总结三--volatile
2009-12-15 20:09 2605前面的两篇总结简 ... -
多线程基础总结二--Thread
2009-12-12 23:27 2717对于Thread来说 ... -
多线程基础总结一--synchronized(1)
2009-12-12 23:23 3126最近写关于并发的小应 ...
相关推荐
Digester是Apache软件基金会下的Jakarta项目中的一个Java库,主要用于简化XML到Java对象的映射过程。在处理XML文档时,它通过匹配XML元素结构到相应的Java对象的方法调用,实现了XML解析的自动化。这个工具对于那些...
Digester是Apache软件基金会的Jakarta项目中的一个实用工具库,它主要用来解析XML文档,并根据预定义的规则自动创建和配置Java对象。这个工具在处理XML到Java对象映射时,极大地简化了代码,避免了手动解析XML的繁琐...
Castor和Digester是两个在Java开发中用于对象与XML数据之间进行映射的库,它们简化了XML数据的解析和对象的序列化过程。在本文中,我们将深入探讨这两个库,以及如何通过实例来使用它们。 首先,让我们了解Castor。...
赠送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; 包含翻译后...
Java中的Digester库是Apache Commons项目的一部分,它提供了一种方便的方式来解析XML文档,并将解析结果映射到Java对象模型上。这个库特别适合于创建简单的XML到Java对象的映射,而不需要编写大量的手动解析代码。在...
`commons-digester.jar`是Apache Commons项目中的一个组件,主要功能是解析XML文档并根据预定义的规则自动创建和填充Java对象。这个组件在Java应用程序中尤其有用,特别是那些需要从XML配置文件中构建复杂对象层次...
`commons-digester-2.1.jar` 是Apache Commons项目中的一个组件,主要负责XML文档的解析和对象的创建与绑定。Apache Commons Digester库提供了一种规则驱动的方法来解析XML文档,并根据预定义的规则将XML数据映射到...
《digester深度解析》 Java世界中,XML作为数据交换和配置文件的常用格式,其解析和对象绑定是一项常见的任务。Apache Commons Digester是Apache软件基金会提供的一个强大的工具,专门用于将XML文档解析为Java对象...
标题“利用commons-digester解析XML”涉及到的是Java开发中的一种处理XML文档的工具——Apache Commons Digester。这个库提供了一种方便的方式来映射XML文档结构到Java对象,从而简化了XML数据的处理过程。 Apache ...
Digester支持多种规则,例如`ObjectCreateRule`用于创建新对象,`SetPropertiesRule`用于设置对象属性,`SetNextRule`用于控制对象间的链接,还有其他如`CallMethodRule`用于调用对象的方法等。 通过组合不同的...
《使用Digester解析XML的深度指南》 在Java开发中,处理XML文件是常见的任务,而Apache Commons Digester库提供了一种高效且便捷的方式来解析XML并将其映射到Java对象。本教程将深入探讨如何使用Digester来读取XML...
在Java开发中,Apache Commons Digester是一个非常有用的库,它允许开发者通过XML配置来实例化、配置和关联Java对象。 Digester提供了两种主要的解析方式,即规则硬编码和独立的规则文件,这两种方法各有其特点和...
### Digester组件简化XML文件处理操作 #### 一、引言 随着Web技术的发展,XML作为数据交换格式的重要性日益凸显。然而,对于大型且复杂的XML文档进行解析与处理时,传统的方法如DOM(Document Object Model)和SAX...
本文将深入探讨如何使用Apache的 Digester 库来解析XML文档,这是一款强大的工具,能够将XML数据映射到Java对象,简化了处理XML的过程。 Digester 是Apache Commons项目的一部分,它提供了一种规则驱动的方法来处理...
赠送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; 包含翻译后...
《digester3.2源码解析与应用实例》 Apache Digester是一个强大的Java库,用于在XML文档和Java对象之间建立映射关系,通过规则来自动解析XML并创建或更新对象结构。在digester3.2版本中,我们能够深入理解其内部...
### Digester 实例详解 #### 一、Digester 概述 Digester 是一个非常实用且功能强大的 XML 解析工具,它属于 Jakarta 开源项目下的 Commons 子项目之一。通过 Digester,开发者能够轻松地解析复杂的 XML 文件,而...
### 使用Apache Commons Digester开发指南 #### 概述 Apache Commons Digester 是一款基于 Java 的开源库,专门用于简化 XML 文件解析的过程。它利用 SAX(Simple API for XML)解析器来解析 XML 数据,并通过一...
在Java开发中,Struts框架提供了一个强大的工具——Digester,用于解析XML文件并自动创建、配置Java对象。本文将详细介绍如何使用Digester处理具有嵌套结构的XML文档,并通过一个具体的实例——"DigesterXmlTest"来...
Digester 是 Apache Commons 中的一个工具类库,它用于解析 XML 文档,并根据预先定义的规则自动创建和配置 Java 对象。在上述问题中,我们看到一个 XML 文档表示了一个考试,其中包含了多个题目,每个题目有其编号...