服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

利用jakarta commons digester匹配xml配置文件信息与其对应的xml规则文件形成java object

利用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是非常强大
     大家可以有空研究一下。

扫描关注微信公众号