在一个比较完整的应用系统里,经常需要有一些配置文件。简单的属性使用.properties文件即可,但要配置一些复杂对象,则应该考虑使用xml文件。一般用来读取xml文件的工具包有DOM、SAX和JDOM等,但用过的人都知道,它们属于比较底层的API,写起来代码量很大,而且如果修改了xml文件的格式,代码也要做大幅度的改动。Jakarta Commons项目里的Digester包,可以轻松实现xml文件到Java对象的转换,看下面这个例子。
在一个项目里,需要提供一些统计图,但图的内容暂时未能确定。所以我决定让图可以配置,所有定义保存在一个名为charts.xml(或国际化后的文件名如charts_zh_CN.xml,这里只考虑缺省语言)的文件内,下面是该文件的部分内容:
<?xml version="1.0" encoding="UTF-8" ?>
<charts>
<chart id="BarChart1" >
<title>统计图一</title>
<legendVisible>false</legendVisible>
<toolTipsVisible>true</toolTipsVisible>
<type>Bar</type>
<labelx>时间</labelx>
<labely>数据</labely>
<width>500</width>
<height>360</height>
<hql>select count(c),c.department.name from edu.pku.pub.aims.model.business.Client c group by c.department</hql>
<description></description>
</chart>
</charts>
可以看出,我为每个图定义了id、title、legendVisible等等属性,这些属性的意义都很明显,它们将影响统计图的数据和在页面中的表现。在程序里,我需要把这个文件里的定义读到一个注册表类ChartRegistry里,该注册表维护一个java.util.List类型的registry变量,其中每个元素是一个ChartConfig类。现在Digester该显示它的价值了。
为了方便使用Digester,我们让ChartConfig也具有统计图的每个属性(id、title、legendVisible等等),名称与charts.xml里的元素的属性(子元素)一一对应,并且都具有getter和setter方法,也就是说,ChartConfig是一个bean类。在ChartRegistry类里定义一个deregister()方法,它的作用是用Digester读入并解析指定的xml文件,代码如下;还有一个register()方法用来把ChartConfig对象加到registry里。
public void deregister(URL url) throws IOException,SAXException{
InputStream is = new FileInputStream(url.getFile());
Digester digester = new Digester();
digester.push(this);
digester.setValidating(false);
digester.addObjectCreate("charts/chart", ChartConfig.class);
digester.addSetProperties("charts/chart");
digester.addBeanPropertySetter("charts/chart/legendVisible");
digester.addBeanPropertySetter("charts/chart/toolTipsVisible");
digester.addBeanPropertySetter("charts/chart/title");
digester.addBeanPropertySetter("charts/chart/type");
digester.addBeanPropertySetter("charts/chart/labelx");
digester.addBeanPropertySetter("charts/chart/labely");
digester.addBeanPropertySetter("charts/chart/width");
digester.addBeanPropertySetter("charts/chart/height");
digester.addBeanPropertySetter("charts/chart/hql");
digester.addBeanPropertySetter("charts/chart/description");
digester.addSetNext("charts/chart","register");
digester.parse(is);
Collections.sort(registry);
}
基本上来说,Digester和SAX解析xml的过程很像,它的原理就是制定一些规则,在遍历每个节点时检查是否有匹配的规则,如果有就执行对应的操作。例如,上面的代码中,“digester.addObjectCreate("charts/chart", ChartConfig.class);”这一句的作用是告诉Digester:如果遇到匹配“charts/chart”形式的节点,就执行一个“对象创建”操作,创建什么对象呢,应该创建Class为“ChartConfig.class”的对象;类似的,addSetProperties()是告诉Digester将指定节点的属性全部映射到对象的属性,在这个例子里指的就是id属性;addBeanPropertySetter()是将子节点转换为对象的属性,这个方法还可以有第二个参数,当对象的属性名和子节点的名字不一样时用来指定对象的属性名;addSetNext()是说在遇到匹配节点后,对当前对象的父对象执行一个方法,参数是当前参数,对这个例子来说就是执行ChartConfig.register(ChartConfig)方法。因此这样构造得到的Digester会把charts.xml里的每个元素转换为一个ChartConfig对象,并register到ChartRegistry里。
顺利得到了ChartRegister对象,我就可以在程序里根据它的内容构造统计图了(统计图一般使用jfreechart来生成,这里就不赘述了)。与Digester具有类似功能的工具包其实还有不少,例如Caster、Jato等等,我没有实际使用过它们,但因为我对用过的Jakarta其他项目都很满意(例如BeanUtils、HttpClient,品牌效应?),所以一开始就选择了Digester:简单方便。
分享到:
相关推荐
在本案例中,我们将深入探讨`digester`的用法,以及如何通过它来实现XML到Java对象的映射。 首先,我们需要了解XML解析的基本概念。XML(eXtensible Markup Language)是一种用于标记数据的语言,常用于存储和传输...
Digester使用堆栈来保存xml节点(stack.push()方法),当该xml节点中嵌套的所有子节点解析完毕,该节点将被弹出(stack.pup()方法)。Digester最大的优点就是使用模式匹配来表示xml文件中节点之间的父子关系 。
- **配置文件解析**:在很多框架中,如Spring,都使用类似Digester的方式解析XML配置文件,创建和配置对象。 - **对象的自动构建**:通过XML描述, Digester可以自动生成对象树,并按照XML结构设置对象属性,极大地...
使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。
1. **XML到Java对象映射**:Digester允许开发者定义一系列的规则,这些规则将XML元素映射到Java对象的实例化、方法调用或属性设置。例如,一个`<user>`元素可能对应一个`User`类的实例,而`<user>`内的`<name>`元素...
下面我们将深入探讨 Digester 的关键概念和使用方法: 1. **初始化 Digester**: 在使用 Digester 之前,我们需要创建一个 Digester 实例,并设置一些基本配置,例如XML解析器的命名空间处理等。然后可以通过 `...
1. **设置消化规则**:定义XML元素与Java方法之间的映射规则,当解析到特定XML元素时, Digester会调用相应的Java方法。 2. **解析XML**:使用`Digester`解析XML文档,并根据设定的规则执行操作。 下面是一个基本的...
本文将深入探讨如何使用Apache的 Digester 库来解析XML文档,这是一款强大的工具,能够将XML数据映射到Java对象,简化了处理XML的过程。 Digester 是Apache Commons项目的一部分,它提供了一种规则驱动的方法来处理...
7. **XML解析与事件驱动**: Digester使用DOM(Document Object Model)解析XML文档,但它的核心是事件驱动的,即每当遇到匹配的XML元素时,它会触发相应的Rule。 8. **使用示例**: 在实际应用中,首先你需要创建一...
2. **初始化 Stack**:使用 `Digester.push()` 方法将一个初始对象放入 Digester 的 Stack 中。这个初始对象在整个解析过程中将起到桥梁的作用,使得最终可以访问到解析得到的对象。 3. **注册匹配模式和规则**:...
使用Digester的基本步骤如下: 1. 创建一个`Digester`实例。实例化后,它可以安全地重复使用,但需要注意的是,它是非线程安全的。 2. 配置`Digester`属性,例如设置是否验证XML文档。 3. 添加处理规则,这些规则...
3. **API变更**:如果你的代码是基于较新版本的`commons-digester`编写,那么使用旧版本的jar文件可能会导致方法调用不匹配。 4. **编译问题**:如果在Maven构建过程中出现了问题,例如网络不稳定导致部分依赖未下载...
3. **定义规则**:使用`addRule`或`addSetProperties`等方法定义规则,将XML元素与Java对象的方法或属性关联起来。例如,`addRule("xmlTag", new SomeRule())`会将XML文档中名为"xmlTag"的元素映射到一个自定义的`...
使用Digester的基本步骤包括创建Digester实例、设置解析规则、然后调用`parse()`方法解析XML。 4. **规则定义** Digester的规则是通过`addRule()`方法添加的。例如,你可以使用`addRuleSet()`添加一个预定义的...
- **初始化对象**: 使用`push`方法向Digester使用的栈中添加一个初始对象。这是为了确保在解析过程中能够正确地保存和访问创建的对象。 - **注册规则**: 为每个需要处理的XML元素注册对应的规则。 - **解析XML文件**...
赠送jar包:commons-digester3-3.2.jar;...使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
在Java开发中,Apache Commons Digester是一个非常有用的库,它允许开发者通过XML配置来...在实际应用中,还可以结合使用这两种方法,以便在需要灵活性的地方使用硬编码规则,在其他地方利用规则文件来保持代码整洁。
在与digester结合使用时,它能帮助找到XML配置文件中引用的服务或者类,使得动态加载和配置成为可能。例如,当XML配置文件中包含类名但未提供完全限定路径时,commons-discovery可以自动查找并加载相应的类。 在...
本篇文章将深入剖析`Digester`的使用以及它在Tomcat7启动过程中的作用。 `Digester`是Apache Commons项目的一个组件,它的主要功能是解析XML文档,并根据预定义的规则创建和配置Java对象。在Tomcat的上下文中,这些...