一、概述
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作為一種解決手段,可以很好地構建當前大家討論比較多的軟件平臺問題。