Jakarta Commons:巧用类和组件

2008-02-23 10:15:20来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

Jakarta Commons是Jakarta的子项目,它创建和维护着许多独立软件包,这些包一般与其他框架或产品无关,其中收集了大量小型、实用的组件,大部分面向服务器端编程。

  Commons的包分成两部分:Sandbox,Commons代码库。Sandbox是一个测试平台,用来检验各种设想、计划。本文介绍的组件属于Commons代码库,文章将展示各个组件的功能、适用场合,并通过简单的例子介绍其用法。

  一、概述

  可重用性是Jakarta Commons项目的灵魂所在。这些包在设计阶段就已经考虑了可重用性问题。其中一些包,例如Commons里面用来记录日志的Logging包,最初是为其他项目设计的,例如Jakarta Struts项目,当人们发现这些包对于其他项目也非常有用,能够极大地帮助其他项目的开发,他们决定为这些包构造一个"公共"的存放位置,这就是Jakarta Commons项目。

  为了真正提高可重用性,每一个包都必须不依赖于其他大型的框架或项目。因此,Commons项目的包基本上都是独立的,不仅是相对于其他项目的独立,而且相对于Commons内部的大部分其他包独立。虽然存在一些例外的情况,例如Betwixt包要用到XML API,但绝大部分只使用最基本的API,其主要目的就是要能够通过简单的接口方便地调用。

  不过由于崇尚简洁,许多包的文档变得过于简陋,缺乏维护和支持,甚至有一部分还有错误的链接,文档也少得可怜。大部分的包需要我们自己去找出其用法,甚至有时还需要我们自己去分析其适用场合。本文将逐一介绍这些包,希望能够帮助你迅速掌握这一积累了许多人心血的免费代码库。

  说明:Jakarta Commons和Apache Commons是不同的,后者是Apache Software Foundation的一个顶层项目,前者则是Jakarta项目的一个子项目,同是也是本文要讨论的主角。本文后面凡是提到Commons的地方都是指Jakarta的Commons。

  为了便于说明,本文把Commons项目十八个成品级的组件(排除了EL、Latka和Jexl)分成5类,如下表所示。



  必须指出的是,这种分类只是为了方便文章说明,Commons项目里面实际上并不存在这种分类,同时这些分类的边界有时也存在一定的重叠。

  本文首先介绍Web相关类和其他类里面的组件,下一篇文章将涉及XML相关、包装这两类,最后一篇文章专门介绍属于工具类的包。

  二、其他类

  CLI、Discovery、Lang和Collections包归入其他类,这是因为它们都各自针对某个明确、实用的小目标,可谓专而精。

  2.1 CLI

  ■ 概况:CLI即Command Line Interface,也就是"命令行接口",它为Java程序访问和解析命令行参数提供了一种统一的接口。

  ■ 官方资源:主页,二进制,源代码

  ■ 何时适用:当你需要以一种一致的、统一的方式访问命令行参数之时。

  ■ 示例应用:CLIDemo.java。CLASSPATH中必须包含commons-cli-1.0.jar。

  ■ 说明:

  有多少次你不得不为一个新的应用程序重新设计新的命令行参数处理方式?如果能够只用某个单一的接口,统一完成诸如定义输入参数(是否为强制参数,数值还是字符串,等等)、根据一系列规则分析参数、确定应用要采用的路径等任务,那该多好!答案就在CLI。

  在CLI中,每一个想要在命令中指定的参数都是一个Option对象。首先创建一个Options对象,将各个Option对象加入Options对象,然后利用CLI提供的方法来解析用户的输入参数。Option对象可以要求用户必须输入某个参数,例如必须在命令行提供文件名字。如果某个参数是必须的,创建Option对象的时候就要显式地指定。

  下面是使用CLI的步骤。

// …

// ①  创建一个Options:

Options options = new Options();

options.addOption("t", false, "current time");

// …

// ② 创建一个解析器,分析输入:

CommandLineParser parser = new BasicParser();

CommandLine cmd;

try {

	cmd = parser.parse(options, args); 

} catch (ParseException pe) {

	usage(options);

	return;

}

// …

// ③ 最后就可以根据用户的输入,采取相应的操作:

if (cmd.hasOption("n")) {

	System.err.println("Nice to meet you: "  

	cmd.getOptionValue('n'));

}


  这就是使用CLI的完整过程了。当然,CLI还提供了其他高级选项,例如控制格式和解析过程等,但基本的使用思路仍是一致的。请参见本文最后提供的示例程序。

  2.2 Discovery

  ■ 概况:Discovery组件是发现模式(Discovery Pattern)的一个实现,它的目标是按照一种统一的方式定位和实例化类以及其他资源。

  ■ 官方资源:主页,二进制,源代码。

  ■ 何时适用:当你想用最佳的算法在Java程序中查找Java接口的各种实现之时。

  ■ 应用实例:DiscoveryDemo.java,MyInterface.java,MyImpl1.java,MyImpl2.java,MyInterface。要求CLASSPATH中必须包含commons-discovery.jar和commons-logging.jar。

  ■ 说明:

  Discovery的意思就是"发现",它试图用最佳的算法查找某个接口的所有已知的实现。在使用服务的场合,当我们想要查找某个服务的所有已知的提供者时,Discovery组件尤其有用。

  考虑一下这种情形:我们为某个特别复杂的任务编写了一个接口,所有该接口的实现都用各不相同的方式来完成这个复杂任务,最终用户可以根据需要来选择完成任务的具体方式。那么,在这种情形下,最终用户应该用什么办法来找出接口的所有可用实现(即可能的完成任务的方式)呢?

  上面描述的情形就是所谓的服务-服务提供者体系。服务的功能由接口描述,服务提供者则提供具体的实现。现在的问题是最终用户要用某种办法来寻找系统中已经安装了哪些服务提供者。在这种情形下,Discovery组件就很有用了,它不仅可以用来查找那些实现了特定接口的类,而且还可以用来查找资源,例如图片或其他文件等。在执行这些操作时,Discovery遵从Sun的服务提供者体系所定义的规则。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:JAVA 的MD5加密算法源代码

下一篇:Struts学习笔记1