`
li285913050
  • 浏览: 22407 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    jakarta commons cookbook 电子版

    7. **Digester组件**:用于将XML文档映射到Java对象,使得XML配置文件可以方便地驱动Java对象的创建和初始化,常用于框架和应用服务器的配置。 8. **Exec组件**:提供了一个更高级别的API来执行外部进程,可以控制...

    使用Digester解析XML文档示例

    Digester能够根据定义好的规则自动将XML文档转换成Java对象,非常适合用在配置文件读取、数据交换等场景。 #### 二、Digester的基本原理 1. **SAX事件驱动**:Digester内部使用SAX事件模型来解析XML文档。当解析器...

    JAKARTA COMMONS

    12. **Commons Digester**: 使用 XML 配置文件映射到 Java 对象,简化 XML 解析和对象创建过程。 13. **Commons Discovery**: 提供工具定位资源,通过模式匹配服务/引用名称和资源名称。 14. **Commons EL**: 提供...

    jakarta-commons 相关依赖包

    jakarta-commons 相关依赖包,文件列表: commons-attributes-api.jar commons-attributes-compiler.jar commons-beanutils.jar commons-codec.jar commons-collections.jar commons-dbcp.jar commons-digester.jar ...

    Jakarta commons docs API CHM 格式

    commons-digester XML 文件到 Java 对象的映射机制 commons-discovery 提供工具来定位资源 (包括类) ,通过使用各种模式来映射服务/引用名称和资源名称。 commons-el 提供在JSP2.0规范中定义的EL表达式的解释器. ...

    Apache Jakarta Commons 使用手册

    《Apache Jakarta Commons 使用手册》是一部详细介绍Apache Jakarta Commons项目下的各种Java组件的专业书籍。该书由Will Iverson编写,旨在为开发者提供一个全面深入理解并应用这些组件的学习资源。Apache Jakarta ...

    Jakarta Commons组件之Lang

    Jakarta Commons是Apache软件基金会的一个项目集合,它包含了一系列实用工具类,用于简化Java开发工作。其中,Lang组件是Jakarta Commons中的一个核心模块,它提供了大量的静态方法,用于处理基本Java对象,如字符串...

    Jakarta Commons

    Digester 是一个XML解析器,它可以将XML文档映射到Java对象实例化和配置的过程。通过定义规则,可以自动创建和配置对象,减少了手动解析XML的复杂性。 4. **FileUpload**: 当需要处理HTTP请求中的多部分文件上传...

    jakarta commons-API

    **Jakarta Commons API** 是一个Java开发人员广泛使用的开源库集合,它包含了多个模块,每个模块专注于特定的编程任务,从而简化了Java应用程序的开发。Jakarta Commons是Apache软件基金会的一个项目,它提供了大量...

    Jakarta commons\Apache Jakarta Commons Reusable Java Components.chm

    本书是一本介绍apache commons使用的电子书

    Jakarta Commons使用

    除了上述组件外,Jakarta Commons 还包括 BeanUtils、Codec、 Digester 等,它们提供了诸如对象属性映射、编码解码、XML 解析等功能,大大简化了 Java 开发中的常见任务。 通过了解和使用 Jakarta Commons,开发者...

    Jakarta-Common-Digester使用笔记

    我们无须了解SAX和DOM的解析过程,只要给Digester添加一些解析规则,就能对一个xml文件进行解析。Digester使用堆栈来保存xml节点(stack.push()方法),当该xml节点中嵌套的所有子节点解析完毕,该节点将被弹出...

    Jakarta Commons Online Bookshelf

    《Jakarta Commons在线书架》一书深入探讨了Jakarta Commons框架的核心概念与应用实践,为读者提供了一次全面理解并掌握Jakarta Commons组件的机会。本书由Vikram Goyal编写,版权归属Manning Publications,出版于...

    jakarta commons cookbook.zip

    《Jakarta Commons Cookbook》是Java开发者的一份宝贵资源,它包含了一系列实用的工具类和组件,可以帮助开发者在日常编程工作中提高效率。Jakarta Commons是Apache软件基金会的一个项目,旨在为Java社区提供一系列...

    Digester

    Digester是Apache软件基金会下的Jakarta项目中的一个Java库,主要用于简化XML到Java对象的映射过程。在处理XML文档时,它通过匹配XML元素结构到相应的Java对象的方法调用,实现了XML解析的自动化。这个工具对于那些...

    Jakarta Commons cookbook.chm与中文版的笔记

    《Jakarta Commons Cookbook》是Java开发者的一本重要参考资料,它主要涵盖了Apache Jakarta Commons项目中的各种组件和工具的使用方法。Apache Commons是Java开发中的一个关键部分,提供了许多实用且功能强大的类库...

    jakarta commons-logging 1.1.1

    jakarta commons-logging 1.1.1

    Iverson book Apache Jakarta Commons[E文版]

    3. **Digester**: Digester允许开发者通过XML配置来实例化和配置Java对象,简化了基于XML的配置文件的解析。 4. **FileUpload**: 处理HTTP文件上传,支持大文件分块上传和内存优化,解决了Servlet处理文件上传的...

Global site tag (gtag.js) - Google Analytics