Jakarta Commons是Jakarta的一個子項目
目的是創建和維護獨立於其他框架和產品的程序包(packages)
這些程序包是一些服務於小范圍的有效組件的集合
通常適用於服務器端編程
Commons項目分為兩部分
Sandbox和Commons庫
Sandbox用於測試
本文關注庫組件
包括它們什麼時候使用
在那裡
以及用例子說明如何使用
簡要介紹 Jakarta Commons項目源於重用
其中的程序包必須確保能夠重用
有一些包來自於其他項目
例如通用日志包是Jakarta Struts的一部分
當開發者發現某個包對於其他項目很有用
可以縮短開發周期
他們決定將這些包做成通用組件
這就是Jakarta Commons項目
要真正做到可重用
每個程序包必須獨立於其他較大的框架和項目
因此
Commons項目中的每個包在很大程度上是獨立的
不僅相對於其他項目
甚至對於其他包也是如此
違反這一原則的情況是存在的
但決大多數情況是使用成熟的APIs
例如
Betwixt包建立在XML APIs基礎之上
盡管這個項目的本意是建立不依賴其他組件的程序包
大多數程序包十分簡潔
以至於缺少必要的文檔
維護和幫助
有些包甚至只有錯誤的連接和極少的文檔
大多數情況下
你只能自己摸索如何使用它們
為什麼使用它們
希望這篇文章對你有幫助
注意
Jakarta Commons與Apache Commons是不同的
後者是Apache Software Foundation(ASF)的頂級項目
而前者是ASF的另一個頂級項目Jakarta的子項目
是本文介紹的對象
而且
Jakarta Commons只使用Java
在本文中Commons指的是Jakarta Commons
組件 為了組織方便
我將
個(包括EL
Latka和Jexl)Commons組件分為五類
如下表
組件類別
組件
Web相關
FileUpload
HTTPClient和Net
XML相關
Betwixt
Digester
Jelly和JXPath
工具
BeanUtils
Logging
DBCP
Pool和 Validator
打包
Codec 和 Modeler
小程序
CLI
Discovery
Lang和 Collections
要注意的是這個分類只是對本文而言
在Commons項目中是不存在的
在某種程度上分類是重疊的
本文將介紹Web相關和小程序類
下篇文章包括XML相關和打包類
工具類在最後一篇文章中
小程序類
將CLI
Discovery
Lang和 Collections歸入小程序類是因為它們都是為了一個小而實用的目的編寫的
CLI
概要
CLI(Command Line Interface)為你的Java程序提供讀取和解析命令行參數的通用接口
在那得到
主頁
程序
源代碼
何時使用
需要統一操作命令行參數時
例子程序
CLIDemo
java
需要將commons
cli
jarcommons加入CLASSPATH中
描述
通常在完成一個Java程序時不得不重寫應用程序輸入參數的處理部分
如果有一個唯一的接口用來定義﹑解析和讀取輸入參數
以決定程序的運行方式不是很好嗎?CLI就是答案
對於CLI
命令行中每個要處理的參數都是一個Option
創建一個Options對象
將Option對象添加進去
然後用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提供其他高級選項用於控制各種格式和解析器
但基本操作是相同的
完整的例子可以看demo
Discovery
概要
discovery模式的實現
提供定位與實例化類或其他資源的通用方法
在那得到
主頁
程序
源代碼
該包處於pre
release狀態
何時使用
需要快速找到你的代碼中Java接口的實現時
例子程序
DiscoveryDemo
java
MyInterface
java
MyImpl
java
MyImpl
java
MyInterface
需要將commons
discovery
jar和commons
logging
jar添到CLASSPATH中
描述
Discovery的目的是使用最好的算法得到接口的所有實現
當用戶想找到所有的提供某一服務的提供商時
這將特別有用
假設你寫了一個針對某一難題的接口
這個接口的所有實現將以唯一的編碼方式解決這一難題
真正的用戶在實際解決這一難題時將會有多種選擇
他怎麼才能知道接口的那種實現在他的系統中是可行的?
這就是Service與Service Provider結構
Service就是你定義的接口
Service Providers提供Service的實現
用戶需要選擇Service Providers
Discovery組件用多種方法提供幫助
注意Discovery不僅用於發現實現類
而且可以尋找資源
例如圖像或其他文件
它遵照Sun的Service Provider Architecture規范
同樣
Discovery的使用也很簡單
例子程序中
MyImpl
和MyImpl
是MyInterface接口的實現
MyInterface文件必須在META
INF/services目錄下
注意這個文件必須對應接口的全路徑
如果接口在包內
那麼文件名也要相應改動
.取得ClassLoader
ClassLoaders loaders =
ClassLoaders
getAppLoaders(MyInterface
class
getClass()
false);
.創建DiscoverClass用於查找實現類
DiscoverClass discover = new DiscoverClass(loaders);
.查找實現類
Class implClass = discover
find(MyInterface
class);
System
err
println(
Implementing Provider:
+ implClass
getName());
運行以上代碼(DiscoveryDemo
java)將得到MyInterface文件中注冊的類
如下所示
再次提醒
如果實現包含在一個包結構內
文件名必須做相應的修改
如果這個文件不在規定目錄下
或實現類不能實例化或定位
將拋出DiscoveryException異常
表明找不到MyInterface的實現
MyImpl
# Implementation
當然
這不是注冊實現的唯一方法
否則Discovery還有什麼用!事實上
這是Discovery發現類的內部機制的最後一步
其他方法包括在系統屬性或用戶屬性中定義實現類的名字
例如
刪除META
INF/services目錄下的文件
按以下輸入運行demo
結果相同
這裡系統屬性是接口名
而值是接口實現提供者
java
DMyInterface=MyImpl
DiscoveryDemo
Discovery也可用於創建(單例)服務提供者的實例並調用它們的函數
如下
((MyInterface)discover
newInstance(MyInterface
class))
myMethod();
注意此時我們並不知道那個服務提供者實現myMethod函數
我們也不關心
這個函數的實現取決於以何種方式運行以上代碼以及注冊的服務提供者
Lang
概要
java
lang包的擴展
增加許多對String的操作
提供類C語言的枚舉
在那得到
主頁
程序
源代碼
這裡介紹的是Lang
翻譯本文時Lang
已經發布
何時使用
當對java
lang提供的默認實現感到厭煩
想更好的控制String的操作
數值函數以及系統屬性時
還有
想使用C語言風格的枚舉時
例子程序
LangDemo
java
Mortgage
java
OnTV
java
需要將commons
lang
jar加入CLASSPATH中
描述
這個包中提供的很多工具函數可以簡化Java程序員的工作
這些函數可以減少實現日常功能的編程量
特別是StringUtils類
它提供比標准的java
lang
String包更強的操作字符串的功能
它們的使用十分簡單
只要用正確的參數調用一個靜態函數
例如
要將一句話變為以大寫開頭只要
StringUtils
capitalise(
name
);
這個函數的輸出就象我們需要的
Name
浏覽StringUtils API的其他靜態函數
你可能會發現對你有用的
例子程序中使用了一些
另一個有趣的類是RandomStringUtils
這個類中的函數產生隨機字符串
這在生成隨機密碼時很有用
類NumberUtils提供數據操作的函數
包括最大最小值函數
以及將字符串轉換為數字的函數
NumberRange和CharRange分別處理數字與字符的范圍
Builder包中的類提供為類添加toString
hashCode
compareTo和equals函數的功能
也就是說
自己不需編碼就可以在類中添加高質量的toString
hashCode
compareTo和equals函數
只要使用Builder包中的函數就可以了
例如
用ToStringBuilder函數給類添加toString方法
public class Mortgage {
private float rate;
private int years;
public String toString() {
return new ToSt
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25340.html