一、概述
Digester組件用于XML文檔到JAVA對(duì)象的映射處理。 對(duì)于構(gòu)建可配置的軟件系統(tǒng)和構(gòu)建框架式軟件平臺(tái)有特別有用的幫助,這個(gè)技能目前國(guó)內(nèi)比較不重視,因此這個(gè)組件對(duì)于國(guó)內(nèi)有特別重要的意義。Digester的基本處理流程如下:
XML文檔 | 讀取-〉 | 系統(tǒng)處理模塊(調(diào)用Digest組件) | 生成-〉 | 運(yùn)行中的對(duì)象 |
首先建立一個(gè)xml配置文檔,然后系統(tǒng)在運(yùn)行時(shí)其某處理模塊讀取該xml文檔,并觸發(fā)處理模塊中定義的規(guī)則,從而生成需要的對(duì)象。其中的處理模塊相當(dāng)于一個(gè)高級(jí)的對(duì)象生成器,在生成對(duì)象的過(guò)程中,可以設(shè)置對(duì)象的屬性和對(duì)象間的關(guān)系。
二、Digester基本說(shuō)明
1.使用Digester的步驟
1.實(shí)例化org.apache.commons.digester.Digester類的一個(gè)對(duì)象,本處假設(shè)為dig。
2.對(duì)對(duì)象dig進(jìn)行一些屬性設(shè)置(如該對(duì)象用什么classloader,是否需要生成日志等)。
3.往對(duì)象dig的對(duì)象棧中預(yù)先push一些對(duì)象。
4.注冊(cè)所有的元素匹配模式,這些匹配模式是下一步的處理規(guī)則。
5.調(diào)用dig.parse()來(lái)按照上面的規(guī)則處理XML文件中,生成我們需要的對(duì)象。
2.Digester運(yùn)行環(huán)境:
Digester是一個(gè)java組件,依賴其它許多組件,如果一個(gè)一個(gè)去裝,太麻煩了,直接裝一個(gè)tomcat4.1.24,就全了,然后把他們都拷到當(dāng)前錄下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
設(shè)置測(cè)試環(huán)境:
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
測(cè)試環(huán)境程序(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 編譯通過(guò),并且java test1打印出
hello myDigester
Digester的運(yùn)行環(huán)境就可以了。
三、應(yīng)用舉例
1.簡(jiǎn)單應(yīng)用:讀取配置文件
Digester提供了xml文檔-〉java對(duì)象的映射,映射情況可以用如下表示:
<a att1=8> -- 匹配模式 "a" <b>time</b> -- 匹配模式 "a/b" </a>
中間的“-〉”就是匹配方法,該匹配方法有一個(gè)統(tǒng)一接口的規(guī)則,此處說(shuō)的Digester版本中提供了9個(gè)預(yù)設(shè)的規(guī)則,這9個(gè)預(yù)設(shè)的方法是最常用的規(guī)則,分別是:
ObjectCreateRule
FactoryCreateRule
SetPropertiesRule
SetPropertyRule
SetNextRule
SetTopRule
SetRootRule
CallMethodRule
CallParamRule
這些預(yù)設(shè)規(guī)則把對(duì)象的基本操作(創(chuàng)建、設(shè)置屬性、調(diào)用方法)基本都包括了。
這些操作通過(guò)xml文件來(lái)映射,從而可以通過(guò)修改xml文件來(lái)更改系統(tǒng)的特性,只要不是接口的改動(dòng)(接口的改動(dòng)一般都是特別大的改動(dòng)),不需要修改程序。如果做得好,系統(tǒng)的業(yè)務(wù)流程可以不改代碼輕松改造。
我們以配置文件操作來(lái)說(shuō)明Digester的基本操作,為下一步更深入的說(shuō)明打下基礎(chǔ)。
文件1:config.xml(只有一行)
<logger className="youlogger.class",file="mylog.txt",timestamp=1;deepth=2/>
文件2:抽象類logger.java
文件3:該抽象類的一個(gè)實(shí)現(xiàn)mylogger.java
文件4:應(yīng)用程序myapp.java
main方法偽代碼:
1.申明變量logger mylog;
2.讀取并解析config.xml:getLogger();
3.執(zhí)行一些操作
4.mylog.log("hello test");
5.執(zhí)行其它操作
getLogger方法:
Digester digester = new Digester();
digester.addObjectCreate("logger", "mylogger","className");
digester.addSetProperties("logger);
digester.push(this);
digester.parse("config.xml");
2:高級(jí)應(yīng)用:構(gòu)建框架式軟件平臺(tái)
Tomcat是用Digester來(lái)構(gòu)建的一個(gè)軟件框架平臺(tái),你可以把你自己的處理模塊放進(jìn)去,當(dāng)然由于程序作者沒(méi)有寫(xiě)好文檔,所以會(huì)有一定的難度,不過(guò)我們從以下說(shuō)明中可以看出:
代碼片斷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"是系統(tǒng)的默認(rèn)聯(lián)接處理類,"className"是匹配模式中可以替換的屬性。
代碼片斷2.相應(yīng)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" />
從中可以看出,實(shí)際的運(yùn)行系統(tǒng)使用了CoyoteConnector這個(gè)connector,這同時(shí)意味著你也可以寫(xiě)你自己的connector代替它,當(dāng)然由于內(nèi)部結(jié)構(gòu)不是很清楚,我們要做這個(gè)可能會(huì)有一定的難度,其它許多處理模塊都一樣可以修改,包括server,service,listener,logger等等。
在用Digester構(gòu)建軟件平臺(tái)的過(guò)程中,接口是其中最重要的一個(gè)技術(shù)。在設(shè)計(jì)平臺(tái)時(shí),應(yīng)該首先設(shè)計(jì)好平臺(tái)中各個(gè)模塊間的接口,java的interface提供了很好的技術(shù)手段。
結(jié)論:
本文主要討論Apache基金會(huì)的jakarta項(xiàng)目中的一個(gè)組件Digester的基本原理和它在構(gòu)建框架式軟件平臺(tái)中的重用,認(rèn)為用Digester作為一種解決手段,可以很好地構(gòu)建當(dāng)前大家討論比較多的軟件平臺(tái)問(wèn)題。