`
ftj20003
  • 浏览: 132105 次
  • 性别: Icon_minigender_1
  • 来自: ...
社区版块
存档分类
最新评论

关于Digester的SetNextRule的一点想法

    博客分类:
  • Java
阅读更多
对于Digester的使用最近才明白一直以来的疑惑,主要是针对SetNextRule的。以下面的部分的xml为例:
<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的构造简单而且好辨别。虽然没有去看它的源码,但是个人认为这种推理应该是有一定的道理的。
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Digester

    Digester是Apache软件基金会下的Jakarta项目中的一个Java库,主要用于简化XML到Java对象的映射过程。在处理XML文档时,它通过匹配XML元素结构到相应的Java对象的方法调用,实现了XML解析的自动化。这个工具对于那些...

    digester用法测试案例

    Digester是Apache软件基金会的Jakarta项目中的一个实用工具库,它主要用来解析XML文档,并根据预定义的规则自动创建和配置Java对象。这个工具在处理XML到Java对象映射时,极大地简化了代码,避免了手动解析XML的繁琐...

    Castor、digester实例

    Castor和Digester是两个在Java开发中用于对象与XML数据之间进行映射的库,它们简化了XML数据的解析和对象的序列化过程。在本文中,我们将深入探讨这两个库,以及如何通过实例来使用它们。 首先,让我们了解Castor。...

    commons-digester3-3.2-API文档-中英对照版.zip

    赠送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 java解析xml

    Java中的Digester库是Apache Commons项目的一部分,它提供了一种方便的方式来解析XML文档,并将解析结果映射到Java对象模型上。这个库特别适合于创建简单的XML到Java对象的映射,而不需要编写大量的手动解析代码。在...

    commons-digester.jar

    `commons-digester.jar`是Apache Commons项目中的一个组件,主要功能是解析XML文档并根据预定义的规则自动创建和填充Java对象。这个组件在Java应用程序中尤其有用,特别是那些需要从XML配置文件中构建复杂对象层次...

    commons-digester-2.1.jar

    `commons-digester-2.1.jar` 是Apache Commons项目中的一个组件,主要负责XML文档的解析和对象的创建与绑定。Apache Commons Digester库提供了一种规则驱动的方法来解析XML文档,并根据预定义的规则将XML数据映射到...

    digester使用

    《digester深度解析》 Java世界中,XML作为数据交换和配置文件的常用格式,其解析和对象绑定是一项常见的任务。Apache Commons Digester是Apache软件基金会提供的一个强大的工具,专门用于将XML文档解析为Java对象...

    利用commons-digester解析xml

    标题“利用commons-digester解析XML”涉及到的是Java开发中的一种处理XML文档的工具——Apache Commons Digester。这个库提供了一种方便的方式来映射XML文档结构到Java对象,从而简化了XML数据的处理过程。 Apache ...

    Java_XML解析之Digester的使用

    Digester支持多种规则,例如`ObjectCreateRule`用于创建新对象,`SetPropertiesRule`用于设置对象属性,`SetNextRule`用于控制对象间的链接,还有其他如`CallMethodRule`用于调用对象的方法等。 通过组合不同的...

    Digester读取xml教程.rar

    《使用Digester解析XML的深度指南》 在Java开发中,处理XML文件是常见的任务,而Apache Commons Digester库提供了一种高效且便捷的方式来解析XML并将其映射到Java对象。本教程将深入探讨如何使用Digester来读取XML...

    Digester两种解析方式

    在Java开发中,Apache Commons Digester是一个非常有用的库,它允许开发者通过XML配置来实例化、配置和关联Java对象。 Digester提供了两种主要的解析方式,即规则硬编码和独立的规则文件,这两种方法各有其特点和...

    digester组件简化了xml文件处理操作

    ### Digester组件简化XML文件处理操作 #### 一、引言 随着Web技术的发展,XML作为数据交换格式的重要性日益凸显。然而,对于大型且复杂的XML文档进行解析与处理时,传统的方法如DOM(Document Object Model)和SAX...

    XML的解析之——使用Digester

    本文将深入探讨如何使用Apache的 Digester 库来解析XML文档,这是一款强大的工具,能够将XML数据映射到Java对象,简化了处理XML的过程。 Digester 是Apache Commons项目的一部分,它提供了一种规则驱动的方法来处理...

    commons-digester3-3.2-API文档-中文版.zip

    赠送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 源码

    《digester3.2源码解析与应用实例》 Apache Digester是一个强大的Java库,用于在XML文档和Java对象之间建立映射关系,通过规则来自动解析XML并创建或更新对象结构。在digester3.2版本中,我们能够深入理解其内部...

    使用Apache_Commons_Digester

    ### 使用Apache Commons Digester开发指南 #### 概述 Apache Commons Digester 是一款基于 Java 的开源库,专门用于简化 XML 文件解析的过程。它利用 SAX(Simple API for XML)解析器来解析 XML 数据,并通过一...

    Digester解析XML的小例子(对象嵌套)

    在Java开发中,Struts框架提供了一个强大的工具——Digester,用于解析XML文件并自动创建、配置Java对象。本文将详细介绍如何使用Digester处理具有嵌套结构的XML文档,并通过一个具体的实例——"DigesterXmlTest"来...

    digester解析xml的问题.pdf

    Digester 是 Apache Commons 中的一个工具类库,它用于解析 XML 文档,并根据预先定义的规则自动创建和配置 Java 对象。在上述问题中,我们看到一个 XML 文档表示了一个考试,其中包含了多个题目,每个题目有其编号...

Global site tag (gtag.js) - Google Analytics