`
kuru
  • 浏览: 140187 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

挖掘Jakarta Commons中隐藏的宝贝(一)

    博客分类:
  • java
阅读更多
如果你不熟悉Jakarta Commons话,那么很有可能你已经重新发明了好几个轮子。在你编写更多的普通的框架或工具之前,体验一下Commons吧。它将会大大地节约你的时间。太多的人自己写一个,其实是与Commons Lang中的StringUtils重复的StringUtils类,或者,开发者不知道从Commons Collections中重新创建工具,哪怕commons-collections.jar已经在classpath中可用了。

真的,请停一下。看看Commons Collections API,然后再回到你的任务中;我发誓你会发现一些简单有用的东西可以帮你在明年节省一周的时间。如果大家花一点时间看看Jakarta Commons,我们将会得到更少的重复代码—我们将在重用的宗旨下真正做一些有用的事情。

我确实看到这样的情况发生过:一些人研究了一下Commons BeanUtils或者Commons Collections,然后总是有“啊,如果我那时知道这个的话,我就不会写那一万行的代码了”这样的时刻。Jakarta Commons仍有一部分保持相当的神秘;比如,许多人还没有听说过Commons CLI和Commons Configuration,并且大多数人还没有注意到Commons Collections中的functors(算子)包的价值。在这一系列中,我会专门强调一些Jakarta Commons中较少得到重视的工具和功能。

在这一系列的第一部分,我将探索定义在Commons Digester中的XML规则,Commons Collections中的功能,和使用一个有趣的应用,Commons JXPath,来查询一个对象的List。Jakarta Commons包含的功能目的在于帮助你解决低层次的编程问题:遍历集合,解析XML和从List中检出对象。我建议你花一些时间在这些小功能上,学习Jakarta Commons真的会为你节省不少时间。

并不简单地是学习使用Commons Digester来解析XML或者使用CollectionUtils的Predicate来过滤一个集合,而是当你一旦意识到如何将这些功能组合起来使用并且如何将Commons集成到你的项目中去的时候,你才会真正地看到它的好处。如果你这样做地话,你将会把commons-lang.jar, commons-beanutils.jar,和 commons-digester.jar当成JVM本身来看待。

如果你对Jakarta Commons更深的内容感兴趣的话,可以看一下Jakarta Commons Cookbook。这本书给你很多方法来更好的使用Commons,并告诉你如何将Jakarta Commons与其它的小的开源组件集成,如Velocity, FreeMarker, Lucene, 和 Jakarta Slide。这本书,我介绍了一组广泛的工具从Commons Lang中的简单工具到组合了Commons Digester, Commons Collections, 和Jakarta Lucene来搜索威廉.莎士比亚的著作。我希望这一系列和Jakarta Commons Cookbook这本书能够提供给你一些有趣的低层次的编程问题的解决方案。

1. 用于Commons Digester的基于XML的规则集
Commons Digester 1.6提供了将XML转化为对象的最简单的方法。Digester已经由O'Reilly网站上的两篇文章介绍过了:“学习和使用Jakarta Digester”,作者是Philipp K. Janert,和“使用Jakarta Commons, 第二部分”,作者是Vikram Goyal。两篇文章都演示了XML规则集的使用,但如何在XML中定义规则集并没有理解。大多所见到的Digester的使用是程序化地定义规则集,以已编译的形式。你应该避免硬编码的Digester规则,特别是当你可以将映射信息存储在外部文件中或一个类路径资源中时。外部化一个Digester规则可以更好地适应一个演化中的XML文档结构或者说一个演化中的对象模型。

为了演示在XML中定义规则集与硬编码的规则集之间的区别,考虑系统解析XML给一个Person bean,包括在下面定义的属性—id, name和age。
package org.test;

public class Person {
  public String id;
  public String name;
  public int age;
               
  public Person() {}

  public String getId() { return id; }
  public void setId(String id) {
    this.id = id;
  }

  public String getName() { return name; }
  public void setName(String name) {
    this.name = name;
  }

  public int getAge() { return age; }
  public void setAge(int age) {
    this.age = age;
  }
}
确认你的应用需要解析一个包含了多个person元素的XML文件。下面的XML文件,data.xml,包含了两个person元素,你想要把它们解析到Person对象中:
<people>
  <person id="1">
    <name>Tom Higgins</name>
    <age>25</age>
  </person>
  <person id="2">
    <name>Barney Smith</name>
    <age>75</age>
  </person>
  <person id="3">
    <name>Susan Shields</name>
    <age>53</age>
  </person>
</people>

你希望如果结构和XML文件的内容在未来几个月中变化,你不需要在已编译的Java代码中硬编码XML文件的结构。为了做到这一点,你需要在一个XML文件中定义Digester的规则,并且它可以作为一种资源从类路径中装入。下面的XML文档,person-rules.xml,映射person元素到Person bean:

<digester-rules>
  <pattern value="people/person">
    <object-create-rule classname="org.test.Person"/>
    <set-next-rule methodname="add" paramtype="java.lang.Object"/>
    <set-properties-rule/>
    <bean-property-setter-rule pattern="name"/>
    <bean-property-setter-rule pattern="age"/>
  </pattern>
</digester-rules>

上述所做的是指示Digester创建一个新的Person实例,当它遇到一个person元素时,调用add()来将Person对象加入到一个ArrayList中,设置person元素中相匹配的属性,并从下一级元素name和age中设置name和age的属性。

现在你已经看到了Person类,会被解析的文档,和以XML的形式定义的Digester规则。现在你需要创建一个由person-rules.xml定义了规则的Digester的实例。下面的代码创建 了一个Digester,通过将person-rules.xml的URL传递给DigesterLoader

既然person-rules.xml文件是与解析它的类在同一个包内的类路径资源,URL可以通过getClass().getResource()来得到。DigesterLoader然后解析规则并将它加到新创建的Digester上:

import org.apache.commons.digester.Digester;
import org.apache.commons.digester.xmlrules.DigesterLoader;

// 从XML规则集中配置Digester
URL rules = getClass().getResource("./person-rules.xml");
Digester digester = DigesterLoader.createDigester(rules);

// 将空的List推入到Digester的堆栈
List people = new ArrayList();
digester.push( people );

// 解析XML文档
InputStream input = new FileInputStream( "data.xml" );
digester.parse( input );

一旦Digester完成对data.xml的解析,三个Person对象将会在ArrayList people中。
与将规则定义在XML不同的方法是使用简便的方法将它们加入到一个Digester实例中。大多数文章和例子都用这种方法,使用addObjectCreate() 和 addBeanPropertySetter()这样的方法来将规则加入中Digester上。下面的代码加入了与定义在person-rules.xml中相同的规则:

digester.addObjectCreate("people/person", Person.class);
digester.addSetNext("people/person", "add", "java.lang.Object");
digester.addBeanPropertySetter("people/person", "name");
digester.addBeanPropertySetter("people/person", "age");

如果你曾经发现自己正在用一个有着2500行代码的类,用SAX来解析一个巨大的XML文档,或者使用DOM或JDOM的完整的一个集合类,你就会理解XML的解析比它应该做的要复杂的多,就大多数情况来说。如果你正在建一个有着严格的速度和内存要求的高效的系统,你会需要SAX解析器的速度。如果你需要DOM级别3的复杂度,你会需要像Apache Xerces的解析器。但如果你只是简单的试图将几个XML文档解析到对象中去的话,看一下Commons Digester, 并把你的规则定义在一个XML文件中。

任何时候你都应该将配置信息从硬编码中移出来。我会建议你在一个XML文件中定义规则并从文件系统或类路径中装入它。这样可以使你的程序更好地适应XML文档以及对象模型的变化。
分享到:
评论

相关推荐

    jakarta commons cookbook 电子版

    《Jakarta Commons Cookbook》是Java开发领域中一本非常实用的指南,主要涵盖了Apache Jakarta Commons组件的使用技巧和最佳实践。这本书旨在帮助开发者更好地理解和利用Jakarta Commons库中的各种工具类和模块,...

    Jakarta Commons组件之Lang

    其中,Lang组件是Jakarta Commons中的一个核心模块,它提供了大量的静态方法,用于处理基本Java对象,如字符串、数组、日期等。本文将深入探讨Jakarta Commons Lang组件以及在`commons-lang-2.3-src.zip`压缩包中的...

    Apache Jakarta Commons 使用手册

    Apache Jakarta Commons项目汇集了一系列高质量且可重用的Java库,它们广泛应用于企业级应用开发之中。 #### 二、主要组件介绍 ##### 2.1 FileUpload - **功能简介**:`FileUpload` 是一个用于解析HTTP请求中的多...

    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-logging 1.1.1

    jakarta commons-logging 1.1.1

    jakarta commons cookbook.zip

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

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

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

    jakarta commons-API

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

    Jakarta Commons使用

    Jakarta Commons 是一个 Apache 软件基金会的项目,它包含了一系列独立、可重用的 Java 类库,旨在提供常见编程任务的解决方案。这些类库覆盖了从输入输出处理到字符串操作,再到网络通信等多个领域。Jakarta ...

    Jakarta commons\Apache Jakarta Commons Reusable Java Components.chm

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

    JAKARTA COMMONS

    这些组件都是 Jakarta Commons 中的一部分,它们各自解决了特定问题,为 Java 开发人员提供了强大的工具,提高了开发效率和代码质量。在实际开发中,可以根据需求选择合适组件进行集成,从而快速实现功能,降低开发...

    Jakarta Commons

    Jakarta Commons 是 Apache 软件基金会的一个项目集合,它提供了大量的可重用 Java 类库,旨在简化开发人员的工作。这些类库覆盖了从文件上传、缓存处理到网络通信等多个领域,极大地丰富了Java 开发者的工具箱。...

    Jakarta Commons-lang API & Source Code-chm

    Jakarta Commons-lang API & Source Code Jakarta lang包API帮助文档,并带有源码

    JakartaCommons 详细教程更助于你的基础

    Jakarta Commons是一系列开源Java组件的集合,最初由Apache Software Foundation维护,并从 Jakarta EE (以前称为 J2EE) 分离出来。Jakarta Commons涉及多个领域,包括字符串处理、验证、Bean操作、集合类等,其设计...

    Jakarta commons docs API CHM 格式

    commons-validator 提供了一个简单的,可扩展的框架来在一个XML文件中定义校验器 (校验方法)和校验规则 commons-vfs 虚拟文件系统 httpcomponents-client 和 http 协议客户端一起协作的框架 httpcomponents-core ...

    Jakarta Commons Online Bookshelf

    Jakarta Commons是一系列开源、模块化的Java库,旨在解决软件开发中的常见问题,提高开发效率,减少重复工作。通过阅读本书,读者将能够了解Jakarta Commons的历史背景、组织结构、设计理念及其在实际项目中的应用。...

    jakarta_commons_io

    Jakarta Commons IO是Java开发中的一个关键库,它由Apache软件基金会维护,为处理输入/输出操作提供了大量的实用工具和类。这个库弥补了Java标准库在IO操作上的不足,使得开发者可以更方便地处理文件、流、字符编码...

    Jakarta Commons FileUpload 用户指南

    ### Jakarta Commons FileUpload 用户指南知识点总结 #### 一、FileUpload 概览 - **Jakarta Commons FileUpload** 是一个用于处理HTTP文件上传的Java库,它基于**RFC1867**标准来解析和处理文件上传请求。 - **...

Global site tag (gtag.js) - Google Analytics