熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

使用 Jakarta Commons 之庫組件攻略

2013-11-23 17:54:50  來源: Javascript 

  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
  
  組件
  為了組織方便我將個(包括ELLatka和Jexl)Commons組件分為五類如下表
  
  組件類別
  組件
  
  Web相關
  FileUploadHTTPClient和Net
  
  XML相關
  BetwixtDigesterJelly和JXPath
  
  工具
  BeanUtilsLoggingDBCPPool和 Validator
  
  打包
  Codec 和 Modeler
  
  小程序
  CLIDiscoveryLang和 Collections
  
  要注意的是這個分類只是對本文而言在Commons項目中是不存在的在某種程度上分類是重疊的本文將介紹Web相關和小程序類下篇文章包括XML相關和打包類工具類在最後一篇文章中
  
  小程序類
  將CLIDiscoveryLang和 Collections歸入小程序類是因為它們都是為了一個小而實用的目的編寫的
  
  CLI
  概要CLI(Command Line Interface)為你的Java程序提供讀取和解析命令行參數的通用接口
  在那得到主頁程序源代碼
  何時使用需要統一操作命令行參數時
  例子程序CLIDemojava需要將commonsclijarcommons加入CLASSPATH中
  描述通常在完成一個Java程序時不得不重寫應用程序輸入參數的處理部分如果有一個唯一的接口用來定義﹑解析和讀取輸入參數以決定程序的運行方式不是很好嗎?CLI就是答案
  對於CLI命令行中每個要處理的參數都是一個Option創建一個Options對象將Option對象添加進去然後用CLI提供的函數解析用戶的輸入參數一個Option也許也需要用戶輸入一個值例如文件名這時Option必須在指定處創建
  CLI使用步驟如下
  創建Options
  Options options = new Options();
  OptionsaddOption(tfalsecurrent time);
  
  創建解析器解析用戶輸入
  
      CommandLineParser parser = new BasicParser();
        CommandLine cmd;
        try{
             cmd = parserparse(options args);
           } catch(ParseException pe) {
             usage(options);
             return;
         }
  
     根據用戶輸入執行相應操作
  
         if(cmdhasOption(n)) {
             Systemerrprintln(Nice to meet you: +  cmdgetOptionvalue(n));
  }
  
  以上基本就是使用CLI的全過程當然CLI提供其他高級選項用於控制各種格式和解析器但基本操作是相同的完整的例子可以看demo
  
  Discovery
  
  概要discovery模式的實現提供定位與實例化類或其他資源的通用方法
  在那得到主頁程序源代碼該包處於prerelease狀態
  何時使用需要快速找到你的代碼中Java接口的實現時
  例子程序DiscoveryDemojavaMyInterfacejavaMyImpljavaMyImpljava MyInterface需要將commonsdiscoveryjar和commonsloggingjar添到CLASSPATH中
  
  描述Discovery的目的是使用最好的算法得到接口的所有實現當用戶想找到所有的提供某一服務的提供商時這將特別有用
  
  假設你寫了一個針對某一難題的接口這個接口的所有實現將以唯一的編碼方式解決這一難題真正的用戶在實際解決這一難題時將會有多種選擇他怎麼才能知道接口的那種實現在他的系統中是可行的?
  
  這就是Service與Service Provider結構Service就是你定義的接口Service Providers提供Service的實現用戶需要選擇Service ProvidersDiscovery組件用多種方法提供幫助注意Discovery不僅用於發現實現類而且可以尋找資源例如圖像或其他文件它遵照Sun的Service Provider Architecture規范
  
  同樣Discovery的使用也很簡單例子程序中MyImpl和MyImpl是MyInterface接口的實現MyInterface文件必須在METAINF/services目錄下注意這個文件必須對應接口的全路徑如果接口在包內那麼文件名也要相應改動
  
  .取得ClassLoader
  
  ClassLoaders loaders =
  
  ClassLoadersgetAppLoaders(MyInterfaceclass getClass() false);
  
  .創建DiscoverClass用於查找實現類
  
  DiscoverClass discover = new DiscoverClass(loaders);
  
  .查找實現類
  
  Class implClass = discoverfind(MyInterfaceclass);
  
  Systemerrprintln(Implementing Provider: + implClassgetName());
  
  運行以上代碼(DiscoveryDemojava)將得到MyInterface文件中注冊的類如下所示再次提醒如果實現包含在一個包結構內文件名必須做相應的修改如果這個文件不在規定目錄下或實現類不能實例化或定位將拋出DiscoveryException異常表明找不到MyInterface的實現
  
  MyImpl # Implementation
  
  當然這不是注冊實現的唯一方法否則Discovery還有什麼用!事實上這是Discovery發現類的內部機制的最後一步其他方法包括在系統屬性或用戶屬性中定義實現類的名字例如刪除METAINF/services目錄下的文件按以下輸入運行demo結果相同這裡系統屬性是接口名而值是接口實現提供者
  
  java DMyInterface=MyImpl DiscoveryDemo
  
  Discovery也可用於創建(單例)服務提供者的實例並調用它們的函數如下
  
  ((MyInterface)discovernewInstance(MyInterfaceclass))myMethod();
  
  注意此時我們並不知道那個服務提供者實現myMethod函數我們也不關心這個函數的實現取決於以何種方式運行以上代碼以及注冊的服務提供者
  
  Lang
  
  概要javalang包的擴展增加許多對String的操作提供類C語言的枚舉
  
  在那得到主頁程序源代碼這裡介紹的是Lang翻譯本文時Lang已經發布
  
  何時使用當對javalang提供的默認實現感到厭煩想更好的控制String的操作數值函數以及系統屬性時還有想使用C語言風格的枚舉時
  
  例子程序LangDemojava Mortgagejava OnTVjava需要將commonslangjar加入CLASSPATH中
  
  描述這個包中提供的很多工具函數可以簡化Java程序員的工作這些函數可以減少實現日常功能的編程量特別是StringUtils類它提供比標准的javalangString包更強的操作字符串的功能它們的使用十分簡單只要用正確的參數調用一個靜態函數例如要將一句話變為以大寫開頭只要
  
  StringUtilscapitalise(name);
  
  這個函數的輸出就象我們需要的Name浏覽StringUtils API的其他靜態函數你可能會發現對你有用的例子程序中使用了一些
  
  另一個有趣的類是RandomStringUtils這個類中的函數產生隨機字符串這在生成隨機密碼時很有用
  
  類NumberUtils提供數據操作的函數包括最大最小值函數以及將字符串轉換為數字的函數NumberRange和CharRange分別處理數字與字符的范圍
  
  Builder包中的類提供為類添加toStringhashCodecompareTo和equals函數的功能也就是說自己不需編碼就可以在類中添加高質量的toStringhashCodecompareTo和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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.