利用Jakarta Commons Digester匹配xml配置文件信息与其对应的xml规则文件形成Java Object
说明:在这里以一个简单的例子来说明如何使用Digester。
第一步:下载Digester 在http://jakarta.apache.org/commons/index.html页面找到Digester Project,并下载commons-digester-1.6.zip(我使用的)
第二步:所需主要lib commons-digester.jar : 这个就是Digester主要的lib (digester中解析xml利用的是Sax方法,有可能需要crimson.jar,在我的JBuilder环境就不需要,因为jdk已经带了解析xml文件的lib) commons-beanutils.jar : 主要公用包(请查看http://www.apache.org) commons-logging.jar : 其log包,由于commons-digester.jar该包中使用
第三步:书写xml配置文件(config.xml)、xml规则文件(rules.xml)与Java Object(Example.java) 1.config.xml <?xml version="1.0" encoding="UTF-8"?> <db-base-config> <control> <queue-connection-factory>java:/ConnectionFactory</queue-connection-factory> <sender-queue> <param name="Internet">queue/Email</param> <param name="CDMA">queue/SmsCdma</param> </sender-queue> </control> <db-foreign-exchange-sql> <publication_id>1</publication_id> <receiver-list> <param>Telephone</param> <param>Email</param> </receiver-list> </db-foreign-exchange-sql> </db-base-config>
2. rules.xml <?xml version="1.0" encoding="UTF-8"?> <digester-rules> <pattern value="db-base-config/control"> <call-method-rule pattern="queue-connection-factory" methodname="setQueueConnectionFactory" paramcount="0"/> <pattern value="sender-queue/param"> <call-method-rule methodname="addSenderQueue" paramcount="2"/> <call-param-rule paramnumber='0' attrname='name'/> <call-param-rule paramnumber='1'/> </pattern> </pattern> <pattern value="db-base-config/db-foreign-exchange-sql"> <call-method-rule pattern="publication_id" methodname="setExchangePublicationID" paramcount="0"/> <pattern value="receiver-list/param"> <call-method-rule methodname="addReceiverList" paramcount="0"/> </pattern> </pattern> </digester-rules>
3. Example.java import java.net.*; import java.util.*;
import org.apache.commons.digester.*; import org.apache.commons.digester.xmlrules.*;
public class Example {
/* 以下两个String变量,严实在xml配置文件,在不同节点下查找 */ private String queueConnectionFactory = null; private String exchangePublicationID = null;
/* 以下两个主要演示xml配置文件,是怎样形成Collection的 */ private HashMap senderQueueMap = new HashMap(); private LinkedList receiverList = new LinkedList();
public Example() { try {
/* 请把两个xml放在该Example的class文件,使该类能找到xml文件 */ URL inputURL = getClass().getResource("config.xml"); URL rulesURL = getClass().getResource("rules.xml");
Digester digester = DigesterLoader.createDigester(rulesURL); digester.push(this); digester.parse(inputURL.openStream());
} catch (Exception e) { System.out.print( "Can not get configurations, system initialization failed." + e.toString()); System.exit(1); } System.out.print("Get configurations is successful "); }
public static void main(String[] args) { Example paramconfig = new Example(); System.out.print(paramconfig.getSenderQueueMap()); System.out.println(paramconfig.getExchangePublicationID()); System.out.print(paramconfig.getReceiverList()); }
public String getQueueConnectionFactory() { return queueConnectionFactory; }
public HashMap getSenderQueueMap() { return senderQueueMap; }
public String getExchangePublicationID() { return exchangePublicationID; }
/*增加Map元素*/ public void addSenderQueue(String name, String value) { senderQueueMap.put(name.toLowerCase(), value); }
public LinkedList getReceiverList() { return receiverList; }
public void setQueueConnectionFactory(String queueConnectionFactory) { this.queueConnectionFactory = queueConnectionFactory; }
/*增加LinkedList元素*/ public void addReceiverList(String value) { receiverList.addLast(value); }
public void setSenderQueueMap(HashMap senderQueueMap) { this.senderQueueMap = senderQueueMap; }
public void setExchangePublicationID(String exchangePublicationID) { this.exchangePublicationID = exchangePublicationID; }
public void setReceiverList(LinkedList receiverList) { this.receiverList = receiverList; } }
说明:请注意rules.xml的中pattern属性以及methodname属性
第四步:运行(在Jbuilder下调试通过)
第五步:(高级)形成DataSource的例子
以配置Oracle为例子,所增lib(class12.jar:oracle jdbc driver) 1.config.xml <?xml version="1.0" encoding="UTF-8"?> <db-base-config> <database> <user>user</user> <password>pwd</password> </database> <db-provider class="oracle.jdbc.pool.OracleDataSource"> <user>user</user> <password>pwd</password> <driver-type>thin</driver-type> <server-name>192.168.0.59</server-name> <network-protocol>tcp</network-protocol> <port-number>1521</port-number> <database-name>example</database-name> </db-provider> </db-base-config>
2.rules.xml <?xml version="1.0" encoding="UTF-8"?> <digester-rules> <pattern value="db-base-config/database"> <call-method-rule pattern="user" methodname="setDbUser" paramcount="0" /> <call-method-rule pattern="password" methodname="setDbPass" paramcount="0" /> </pattern> <pattern value="db-base-config/db-provider"> <object-create-rule classname="oracle.jdbc.pool.OracleDataSource" attrname="class" /> <call-method-rule pattern="user" methodname="setUser" paramcount="0" /> <call-method-rule pattern="password" methodname="setPassword" paramcount="0" /> <call-method-rule pattern="driver-type" methodname="setDriverType" paramcount="0" /> <call-method-rule pattern="server-name" methodname="setServerName" paramcount="0" /> <call-method-rule pattern="network-protocol" methodname="setNetworkProtocol" paramcount="0" /> <call-method-rule pattern="port-number" methodname="setPortNumber" paramcount="0" paramtypes="java.lang.Integer" /> <call-method-rule pattern="database-name" methodname="setDatabaseName" paramcount="0" /> <set-next-rule methodname="setDs" /> </pattern> </digester-rules>
3. Java Object
import javax.sql.DataSource; import java.net.*; import java.util.*;
import org.apache.commons.digester.*; import org.apache.commons.digester.xmlrules.*;
public class Example { private static DataSource ds = null;
private String dbUser = null; private String dbPass = null;
public Example() { try {
/* 请把两个xml放在该Example的class文件,使该类能找到xml文件 */ URL inputURL = getClass().getResource("config.xml"); URL rulesURL = getClass().getResource("rules.xml");
Digester digester = DigesterLoader.createDigester(rulesURL); digester.push(this); digester.parse(inputURL.openStream());
} catch (Exception e) { System.out.print( "Can not get configurations, system initialization failed." + e.toString()); System.exit(1); } System.out.print("Get configurations is successful "); }
public static void main(String[] args) { Example paramconfig = new Example(); DataSource dataSource = paramconfig.getDs().getConnection(); //已经得到connection,就看你处理数据库的能力的,呵呵 java.sql.Connection conn = dataSource.getConnection(paramconfig.getDbUser(),paramconfig.getDbPass());
}
public DataSource getDs() { return ds; } public void setDs(DataSource ds) { this.ds = ds; }
public String getDbPass() { return dbPass; }
public String getDbUser() { return dbUser; }
public void setDbPass(String dbPass) { this.dbPass = dbPass; }
public void setDbUser(String dbUser) { this.dbUser = dbUser; } }
总结:Digester功能越来越强大,在这里我只是抛砖引玉。 Java Application Framework---Spring 的Dependency Injection是非常强大 大家可以有空研究一下。 
|