利用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是非常强大
大家可以有空研究一下。
闽公网安备 35060202000074号