一、概述

Digester组件用于XML文档到JAVA对象的映射处理。 对于构建可配置的软件系统和构建框架式软件平台有特别有用的帮助,这个技能目前国内比较不重视,因此这个组件对于国内有特别重要的意义。Digester的基本处理流程如下:

XML文档 读取-〉 系统处理模块(调用Digest组件) 生成-〉 运行中的对象

首先建立一个xml配置文档,然后系统在运行时其某处理模块读取该xml文档,并触发处理模块中定义的规则,从而生成需要的对象。其中的处理模块相当于一个高级的对象生成器,在生成对象的过程中,可以设置对象的属性和对象间的关系。

二、Digester基本说明

1.使用Digester的步骤

1.实例化org.apache.commons.digester.Digester类的一个对象,本处假设为dig。
2.对对象dig进行一些属性设置(如该对象用什么classloader,是否需要生成日志等)。
3.往对象dig的对象栈中预先push一些对象。
4.注册所有的元素匹配模式,这些匹配模式是下一步的处理规则。
5.调用dig.parse()来按照上面的规则处理XML文件中,生成我们需要的对象。

2.Digester运行环境:
Digester是一个java组件,依赖其它许多组件,如果一个一个去装,太麻烦了,直接装一个tomcat4.1.24,就全了,然后把他们都拷到当前录下c:\digester,清单如下:

1.c:\tomcat\server\lib\commons-beanutils.jar
2.c:\tomcat\server\lib\commons-collections.jar
3.c:\tomcat\server\lib\commons-digester.jar
4.c:\tomcat\server\lib\commons-logging.jar
5.c:\tomcat\common\lib\commons-logging-api.jar
6.c:\tomcat\common\endorsed\xmlParserAPIs.jar
7.c:\tomcat\common\endorsed\xercesImpl.jar

设置测试环境:
set classpath=%classpath%;.;c:\jdk\lib\dt.jar;c:\jdk\lib\tools.jar;c:\digester\commons-beanutils.jar;c:\digester\commons-collections.jar;c:\digester\commons-digester.jar;c:\digester\logging.jar;c:\digester\xercesImpl.jar;c\digester\digester\xmlParserAPIs.jar;c:\digester\commons-logging-api.jar

测试环境程序(test1.java)
import org.apache.commons.digester.Digester;

public class test1 {
public static void main( String[] args ) {

Digester dig = new Digester();
System.out.println("hello myDigester");

}
}

如果javac test1.java 编译通过,并且java test1打印出

hello myDigester

Digester的运行环境就可以了。

三、应用举例

1.简单应用:读取配置文件

Digester提供了xml文档-〉java对象的映射,映射情况可以用如下表示:

  <a att1=8>         -- 匹配模式 "a"
    <b>time</b>      -- 匹配模式 "a/b"    
  </a>

中间的“-〉”就是匹配方法,该匹配方法有一个统一接口的规则,此处说的Digester版本中提供了9个预设的规则,这9个预设的方法是最常用的规则,分别是:

ObjectCreateRule
FactoryCreateRule
SetPropertiesRule
SetPropertyRule
SetNextRule
SetTopRule
SetRootRule
CallMethodRule
CallParamRule

这些预设规则把对象的基本操作(创建、设置属性、调用方法)基本都包括了。

这些操作通过xml文件来映射,从而可以通过修改xml文件来更改系统的特性,只要不是接口的改动(接口的改动一般都是特别大的改动),不需要修改程序。如果做得好,系统的业务流程可以不改代码轻松改造。

我们以配置文件操作来说明Digester的基本操作,为下一步更深入的说明打下基础。

文件1:config.xml(只有一行)
<logger className="youlogger.class",file="mylog.txt",timestamp=1;deepth=2/>

文件2:抽象类logger.java

文件3:该抽象类的一个实现mylogger.java

文件4:应用程序myapp.java
main方法伪代码:
1.申明变量logger mylog;
2.读取并解析config.xml:getLogger();
3.执行一些操作
4.mylog.log("hello test");
5.执行其它操作

getLogger方法:
Digester digester = new Digester();
digester.addObjectCreate("logger", "mylogger","className");
digester.addSetProperties("logger);
digester.push(this);
digester.parse("config.xml");

 

2:高级应用:构建框架式软件平台

Tomcat是用Digester来构建的一个软件框架平台,你可以把你自己的处理模块放进去,当然由于程序作者没有写好文档,所以会有一定的难度,不过我们从以下说明中可以看出:

代码片断1。程序org.apache.catalina.startup/catalina.java中

digester.addObjectCreate("Server/Service/Connector", "org.apache.catalina.connector.http.HttpConnector", "className");
其中"Server/Service/Connector"是待匹配的模式,"org.apache.catalina.connector.http.HttpConnector"是系统的默认联接处理类,"className"是匹配模式中可以替换的属性。

代码片断2.相应conf/server.xml中

 <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
            port="8080" minProcessors="5" maxProcessors="75"
            enableLookups="true" redirectPort="8443"
            acceptCount="100" debug="0" connectionTimeout="20000"
            useURIValidationHack="false" disableUploadTimeout="true" />

从中可以看出,实际的运行系统使用了CoyoteConnector这个connector,这同时意味着你也可以写你自己的connector代替它,当然由于内部结构不是很清楚,我们要做这个可能会有一定的难度,其它许多处理模块都一样可以修改,包括server,service,listener,logger等等。

在用Digester构建软件平台的过程中,接口是其中最重要的一个技术。在设计平台时,应该首先设计好平台中各个模块间的接口,java的interface提供了很好的技术手段。

结论:

本文主要讨论Apache基金会的jakarta项目中的一个组件Digester的基本原理和它在构建框架式软件平台中的重用,认为用Digester作为一种解决手段,可以很好地构建当前大家讨论比较多的软件平台问题。