国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

使用 Jakarta Commons 之庫組件攻略

2019-11-18 13:16:22
字體:
供稿:網(wǎng)友

  Jakarta Commons是Jakarta的一個(gè)子項(xiàng)目,目的是創(chuàng)建和維護(hù)獨(dú)立于其他框架和產(chǎn)品的程序包(packages)。這些程序包是一些服務(wù)于小范圍的有效組件的集合,通常適用于服務(wù)器端編程。
  
  Commons項(xiàng)目分為兩部分:Sandbox和Commons庫。Sandbox用于測試。本文關(guān)注庫組件,包括它們什么時(shí)候使用,在那里,以及用例子說明如何使用。
  
  簡要介紹
  Jakarta Commons項(xiàng)目源于重用,其中的程序包必須確保能夠重用。有一些包來自于其他項(xiàng)目,例如通用日志包是Jakarta Struts的一部分。當(dāng)開發(fā)者發(fā)現(xiàn)某個(gè)包對于其他項(xiàng)目很有用,可以縮短開發(fā)周期,他們決定將這些包做成通用組件。這就是Jakarta Commons項(xiàng)目。
  
  要真正做到可重用,每個(gè)程序包必須獨(dú)立于其他較大的框架和項(xiàng)目。因此,Commons項(xiàng)目中的每個(gè)包在很大程度上是獨(dú)立的,不僅相對于其他項(xiàng)目,甚至對于其他包也是如此。違反這一原則的情況是存在的,但決大多數(shù)情況是使用成熟的APIs。例如,Betwixt包建立在xml APIs基礎(chǔ)之上。盡管這個(gè)項(xiàng)目的本意是建立不依靠其他組件的程序包。
  
  大多數(shù)程序包十分簡潔,以至于缺少必要的文檔、維護(hù)和幫助。有些包甚至只有錯(cuò)誤的連接和極少的文檔。大多數(shù)情況下,你只能自己摸索如何使用它們,為什么使用它們。希望這篇文章對你有幫助。
  
  注重:Jakarta Commons與Apache Commons是不同的。后者是Apache Software Foundation(ASF)的頂級項(xiàng)目。而前者是ASF的另一個(gè)頂級項(xiàng)目Jakarta的子項(xiàng)目,是本文介紹的對象。而且,Jakarta Commons只使用java。在本文中Commons指的是Jakarta Commons。
  
  組件
  為了組織方便,我將18個(gè)(包括EL,Latka和Jexl)Commons組件分為五類。如下表:
  
  組件類別
  組件
  
  Web相關(guān)
  FileUpload,HTTPClient和Net
  
  XML相關(guān)
  Betwixt,Digester,Jelly和JXPath
  
  工具
  BeanUtils,Logging,DBCP,Pool和 Validator
  
  打包
  Codec 和 Modeler
  
  小程序
  CLI,Discovery,Lang和 Collections
  
  要注重的是這個(gè)分類只是對本文而言,在Commons項(xiàng)目中是不存在的。在某種程度上分類是重疊的。本文將介紹Web相關(guān)和小程序類,下篇文章包括XML相關(guān)和打包類,工具類在最后一篇文章中。
  
  小程序類
  將CLI,Discovery,Lang和 Collections歸入小程序類是因?yàn)樗鼈兌际菫榱艘粋€(gè)小而實(shí)用的目的編寫的。
  
  1.CLI
  概要:CLI(Command Line Interface)為你的Java程序提供讀取和解析命令行參數(shù)的通用接口。
  在那得到:主頁,程序,源代碼。
  何時(shí)使用:需要統(tǒng)一操作命令行參數(shù)時(shí)。
  例子程序:CLIDemo.java,需要將commons-cli-1.0.jarcommons加入CLASSPATH中。
  描述:通常在完成一個(gè)Java程序時(shí)不得不重寫應(yīng)用程序輸入?yún)?shù)的處理部分。假如有一個(gè)唯一的接口用來定義﹑解析和讀取輸入?yún)?shù),以決定程序的運(yùn)行方式不是很好嗎?CLI就是答案。
  對于CLI,命令行中每個(gè)要處理的參數(shù)都是一個(gè)Option。創(chuàng)建一個(gè)Options對象,將Option對象添加進(jìn)去,然后用CLI提供的函數(shù)解析用戶的輸入?yún)?shù)。一個(gè)Option也許也需要用戶輸入一個(gè)值,例如文件名。這時(shí)Option必須在指定處創(chuàng)建。
  CLI使用步驟如下:
  1.創(chuàng)建Options:
  Options options = new Options();
  Options.addOption(“t”,false,”current time”);
  
  2.創(chuàng)建解析器解析用戶輸入:
  
      CommandLineParser parser = new BasicParser();
        CommandLine cmd;
        try{
             cmd = parser.parse(options, args);
           } catch(ParseException pe) {
             usage(options);
             return;
         }
  
     3.根據(jù)用戶輸入執(zhí)行相應(yīng)操作:
  
         if(cmd.hasOption(“n”)) {
             System.err.PRintln(“Nice to meet you: ”+  cmd.getOptionvalue(‘n’));
  }
  
  以上基本就是使用CLI的全過程。當(dāng)然,CLI提供其他高級選項(xiàng)用于控制各種格式和解析器,但基本操作是相同的。完整的例子可以看demo。
  
  2.Discovery
  
  概要:discovery模式的實(shí)現(xiàn),提供定位與實(shí)例化類或其他資源的通用方法。
  在那得到:主頁,程序,源代碼。該包處于pre-release狀態(tài)。
  何時(shí)使用:需要快速找到你的代碼中Java接口的實(shí)現(xiàn)時(shí)。
  例子程序:DiscoveryDemo.java,MyInterface.java,MyImpl1.java,MyImpl2.java, MyInterface。需要將commons-discovery.jar和commons-logging.jar添到CLASSPATH中。
  
  描述:Discovery的目的是使用最好的算法得到接口的所有實(shí)現(xiàn)。當(dāng)用戶想找到所有的提供某一服務(wù)的提供商時(shí),這將非凡有用。
  
  假設(shè)你寫了一個(gè)針對某一難題的接口。這個(gè)接口的所有實(shí)現(xiàn)將以唯一的編碼方式解決這一難題。真正的用戶在實(shí)際解決這一難題時(shí)將會有多種選擇。他怎么才能知道接口的那種實(shí)現(xiàn)在他的系統(tǒng)中是可行的?
  
  這就是Service與Service Provider結(jié)構(gòu)。Service就是你定義的接口。Service Providers提供Service的實(shí)現(xiàn)。用戶需要選擇Service Providers。Discovery組件用多種方法提供幫助。注重Discovery不僅用于發(fā)現(xiàn)實(shí)現(xiàn)類,而且可以尋找資源,例如圖像或其他文件。它遵照Sun的Service Provider Architecture規(guī)范。
  
  同樣,Discovery的使用也很簡單。例子程序中,MyImpl1和MyImpl2是MyInterface接口的實(shí)現(xiàn)。MyInterface文件必須在META-INF/services目錄下。注重這個(gè)文件必須對應(yīng)接口的全路徑。假如接口在包內(nèi),那么文件名也要相應(yīng)改動(dòng)。
  
  1.取得ClassLoader:
  
  ClassLoaders loaders =
  
  ClassLoaders.getAppLoaders(MyInterface.class, getClass(), false);
  
  2.創(chuàng)建DiscoverClass用于查找實(shí)現(xiàn)類:
  
  DiscoverClass discover = new DiscoverClass(loaders);
  
  3.查找實(shí)現(xiàn)類:
  
  Class implClass = discover.find(MyInterface.class);
  
  System.err.println("Implementing Provider: " + implClass.getName());
  
  運(yùn)行以上代碼(DiscoveryDemo.java)將得到MyInterface文件中注冊的類,如下所示。再次提醒,假如實(shí)現(xiàn)包含在一個(gè)包結(jié)構(gòu)內(nèi),文件名必須做相應(yīng)的修改。假如這個(gè)文件不在規(guī)定目錄下,或?qū)崿F(xiàn)類不能實(shí)例化或定位,將拋出DiscoveryException異常,表明找不到MyInterface的實(shí)現(xiàn)。
  
  MyImpl2 # Implementation 2
  
  當(dāng)然,這不是注冊實(shí)現(xiàn)的唯一方法,否則Discovery還有什么用!事實(shí)上,這是Discovery發(fā)現(xiàn)類的內(nèi)部機(jī)制的最后一步。其他方法包括在系統(tǒng)屬性或用戶屬性中定義實(shí)現(xiàn)類的名字。例如,刪除META-INF/services目錄下的文件,按以下輸入運(yùn)行demo,結(jié)果相同。這里系統(tǒng)屬性是接口名,而值是接口實(shí)現(xiàn)提供者。
  
  java -DMyInterface=MyImpl1 DiscoveryDemo
  
  Discovery也可用于創(chuàng)建(單例)服務(wù)提供者的實(shí)例并調(diào)用它們的函數(shù)。如下:
  
  ((MyInterface)discover.newInstance(MyInterface.class)).myMethod();
  
  注重此時(shí)我們并不知道那個(gè)服務(wù)提供者實(shí)現(xiàn)myMethod函數(shù),我們也不關(guān)心。這個(gè)函數(shù)的實(shí)現(xiàn)取決于以何種方式運(yùn)行以上代碼以及注冊的服務(wù)提供者。
  
  3.Lang
  
  概要:java.lang包的擴(kuò)展,增加許多對String的操作。提供類C語言的枚舉。
  
  在那得到:主頁,程序,源代碼。這里介紹的是Lang1.0,翻譯本文時(shí)Lang2.0已經(jīng)發(fā)布。
  
  何時(shí)使用:當(dāng)對java.lang提供的默認(rèn)實(shí)現(xiàn)感到厭煩,想更好的控制String的操作,數(shù)值函數(shù)以及系統(tǒng)屬性時(shí),還有,想使用C語言風(fēng)格的枚舉時(shí)。
  
  例子程序:LangDemo.java, Mortgage.java, OnTV.java。需要將commons-lang.jar加入CLASSPATH中。
  
  描述:這個(gè)包中提供的很多工具函數(shù)可以簡化Java程序員的工作。這些函數(shù)可以減少實(shí)現(xiàn)日常功能的編程量。非凡是StringUtils類,它提供比標(biāo)準(zhǔn)的java.lang.String包更強(qiáng)的操作字符串的功能。它們的使用十分簡單,只要用正確的參數(shù)調(diào)用一個(gè)靜態(tài)函數(shù)。例如,要將一句話變?yōu)橐源髮戦_頭只要:
  
  StringUtils.capitalise("name");
  
  這個(gè)函數(shù)的輸出就象我們需要的“Name”。瀏覽StringUtils API的其他靜態(tài)函數(shù),你可能會發(fā)現(xiàn)對你有用的。例子程序中使用了一些。
  
  另一個(gè)有趣的類是RandomStringUtils。這個(gè)類中的函數(shù)產(chǎn)生隨機(jī)字符串,這在生成隨機(jī)密碼時(shí)很有用。
  
  類NumberUtils提供數(shù)據(jù)操作的函數(shù),包括最大最小值函數(shù),以及將字符串轉(zhuǎn)換為數(shù)字的函數(shù)。NumberRange和CharRange分別處理數(shù)字與字符的范圍。
  
  Builder包中的類提供為類添加toString,hashCode,compareTo和equals函數(shù)的功能。也就是說,自己不需編碼就可以在類中添加高質(zhì)量的toString,hashCode,compareTo和equals函數(shù),只要使用Builder包中的函數(shù)就可以了。例如,用ToStringBuilder函數(shù)給類添加toString方法:
  
      public class Mortgage {
          private float rate;
          private int years;
          ....
          public String toString() {
                 return new ToSt

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 金昌市| 长子县| 广宗县| 和平县| 吉林市| 双流县| 赣榆县| 司法| 荆门市| 临江市| 遂川县| 永平县| 鄂伦春自治旗| 甘洛县| 南涧| 乌兰浩特市| 祁东县| 伊吾县| 阿巴嘎旗| 正镶白旗| 鹤庆县| 黎川县| 乌鲁木齐市| 双峰县| 永年县| 汨罗市| 甘孜县| 金塔县| 孟连| 古浪县| 汉沽区| 滨海县| 恭城| 南宁市| 阳高县| 开远市| 周宁县| 宜良县| 兴安县| 榕江县| 彰化县|