Commons-configuration Commons-FileUpload Commons DbUtils Commons BeanUtils Commons CLI Commons Codec Commons Collections Commons DBCP Commons HttpClient Commons IO Commons JXPath Commons Lang Commons Math Commons Net Commons Validator
在看項目代碼的過程中你會發(fā)現(xiàn)某些代碼完全可以直接用開源框架來減少代碼量的,如一些帶有util的工具類,、一些常用的io操作等; 研究發(fā)現(xiàn)一般的應(yīng)用程序每 1,000 行代碼就包含 20 到 250 個 bug,!這個度量被稱作缺陷密度。因此可得出一個重要的結(jié)論:更少的代碼意味著更少的缺陷,。 個人認(rèn)為在項目開發(fā)過程中最好能有這樣的習(xí)慣:能用開源框架(開源框架基本都是眾多程序員智慧的結(jié)晶,,經(jīng)得住考驗)就盡量用,最大限度地減少編碼量,;即當(dāng)編碼處理一些業(yè)務(wù)邏輯時首先想想或找找有沒相關(guān)的開源框架,,有適合的就用。 重視Apache Commons 公司的各個應(yīng)用下基本都有Apache Commons下的一些jar包,,但在開發(fā)過程中習(xí)慣性用到這些工具包的童鞋可能比較少(經(jīng)常使用到這些jar包的童鞋可以忽視),,其實用好Apache Commons下工具集和幫助集可以減少好些編碼量,。 Apache Commons包含了很多開源的工具,,用于解決平時編程經(jīng)常會遇到的問題,減少重復(fù)編碼,。
commons-beanutils commons-lang commons-logging commons-collections commons-digester commons-codec commons-jxpath
1. Properties files 2. XML documents 3. Property list files (.plist) 4. JNDI 5. JDBC Datasource 6. System properties 7. Applet parameters 8. Servlet parameters 最主要的作用是讀取資源文件,每一種文件格式都有一個對應(yīng)的類,,如下
properties文件--PropertiesConfiguration類; xml文件—XMLConfiguration; .ini文件—INIConfiguration; .plist文件—PropertyListConfiguration;
還可以從JNDI中讀取properties—JNDIConfiguration,;當(dāng)然還可以使用system的properties--SystemConfiguration
usergui.properties(放在類根路徑下面): colors.background = #FFFFFF colors.foreground = #000080 window.width = 500 window.height = 300 keys=cn,com,org,uk,edu,jp,hk
(1) 一般寫法: public static void readProperties() { InputStream in = null; try { in = new BufferedInputStream((new ClassPathResource( "usergui.properties")).getInputStream()); } catch (IOException e1) { e1.printStackTrace(); } Properties p = new Properties(); try { p.load(in); System.out.println(p.getProperty("colors.background")); } catch (IOException e) { } }
(2) 另一種ResourceBundle方式: public static void readProperties() { Locale locale = Locale.getDefault(); ResourceBundlelocalResource = ResourceBundle.getBundle("usergui", locale); String value = localResource.getString("colors.background"); System.out.println("ResourceBundle: " + value); }
(3) 使用PropertiesConfiguration public static void loadProperty() { try { PropertiesConfigurationconfig = new PropertiesConfiguration( "usergui.properties"); config.setProperty("colors.background", "#00000F");// 更改值 config.save(); config.save("usergui.backup.properties");// save a copy System.out.println(config.getProperty("colors.background")); System.out.println(config.getInt("window.width")); String[] keys = config.getStringArray("keys"); List key2 = config.getList("keys"); for (int i = 0; i < keys.length; i++) { System.out.println(keys[i]); } for (Object str : key2) { System.out.println(str.toString()); } } catch (Exception e) { } }
詳細(xì)案例請參考 文件上傳---普通文件和url文件
這個工具并不是現(xiàn)在流行的OR-Mapping工具(比如Hibernate),,只是簡化數(shù)據(jù)庫操作,比如 QueryRunner run = new QueryRunner(dataSource); commons-dbutils是 Apache 組織提供的一個開源 JDBC 工具類庫,,對傳統(tǒng)操作數(shù)據(jù)庫的類進行二次封裝,,可以把結(jié)果集轉(zhuǎn)化成List。 項目主頁: http://commons./dbutils/ 文檔地址: http://commons./dbutils/examples.html 下載地址:http://commons./downloads/download_dbutils.cgi (1) org.apache.commons.dbutils DbUtils : 提供如關(guān)閉連接,、裝載 JDBC 驅(qū)動程序等常規(guī)工作的工具類 QueryRunner : 該類簡單化了 SQL 查詢,,它與ResultSetHandler組合在一起使用可以完成大部分的數(shù)據(jù)庫操作,能夠大大減少編碼量,。 QueryLoader : 屬性文件加載器,,主要用于加載屬性文件中的 SQL 到內(nèi)存中。 (2) org.apache.commons.dbutils.handlers ArrayHandler:將ResultSet中第一行的數(shù)據(jù)轉(zhuǎn)化成對象數(shù)組 ArrayListHandler將ResultSet中所有的數(shù)據(jù)轉(zhuǎn)化成List,,List中存放的是Object[] BeanHandler:將ResultSet中第一行的數(shù)據(jù)轉(zhuǎn)化成類對象 BeanListHandler:將ResultSet中所有的數(shù)據(jù)轉(zhuǎn)化成List,,List中存放的是類對象 ColumnListHandler:將ResultSet中某一列的數(shù)據(jù)存成List,List中存放的是Object對象 KeyedHandler:將ResultSet中存成映射,,key為某一列對應(yīng)為Map,。Map中存放的是數(shù)據(jù) MapHandler:將ResultSet中第一行的數(shù)據(jù)存成Map映射 MapListHandler:將ResultSet中所有的數(shù)據(jù)存成List。List中存放的是Map ScalarHandler:將ResultSet中一條記錄的其中某一列的數(shù)據(jù)存成Object (3) org.apache.commons.dbutils.wrappers SqlNullCheckedResultSet:該類是用來對sql語句執(zhí)行完成之后的的數(shù)值進行null的替換,。 StringTrimmedResultSet:去除ResultSet中中字段的左右空格,。Trim()
View Code
Commons BeanUtils是針對Bean的一個工具集。由于Bean往往是有一堆get和set組成,,所以BeanUtils也是在此基礎(chǔ)上進行一些包裝,。 使用示例:一個比較常用的功能是Bean Copy,也就是copy bean的屬性,。如果做分層架構(gòu)開發(fā)的話就會用到,,比如從PO(Persistent Object)拷貝數(shù)據(jù)到VO(Value Object)。
TeacherFormteacherForm=(TeacherForm)form; //得到TeacherForm Teacher teacher=new Teacher();//構(gòu)造Teacher對象 //賦值 teacher.setName(teacherForm.getName()); teacher.setAge(teacherForm.getAge()); teacher.setGender(teacherForm.getGender()); teacher.setMajor(teacherForm.getMajor()); teacher.setDepartment(teacherForm.getDepartment()); //持久化Teacher對象到數(shù)據(jù)庫 HibernateDAO= ; HibernateDAO.save(teacher);
使用BeanUtils后,,代碼就大大改觀了,,如下所示: TeacherForm teacherForm=(TeacherForm)form; //得到TeacherForm Teacher teacher=new Teacher();//構(gòu)造Teacher對象 BeanUtils.copyProperties(teacher,teacherForm); //賦值 HibernateDAO.save(teacher); //持久化Teacher對象到數(shù)據(jù)庫
說明:這是一個處理命令的工具。比如main方法輸入的string[]需要解析,。你可以預(yù)先定義好參數(shù)的規(guī)則,,然后就可以調(diào)用CLI來解析。 View Code
說明:這個工具是用來編碼和解碼的,,包括Base64,,URL,DES,、SHA1,、MD5、Soundx等等,。 MD5 String str = "abc"; DigestUtils.md5Hex(str);
SHA1 String str = "abc"; DigestUtils.shaHex(str);
BASE64 //加密 String str= "abc"; // abc為要加密的字符串 byte[] b = Base64.encodeBase64(str.getBytes(), true); System.out.println(new String(b));
//解密 String str = "YWJj"; // YWJj為要解密的字符串 byte[] b = Base64.decodeBase64(str.getBytes()); System.out.println(new String(b));
Commons Collections說明:你可以把這個工具看成是java.util的擴展,。 使用示例:舉一個簡單的例子 OrderedMap map = new LinkedMap();
說明:數(shù)據(jù)庫連接池,,類似的還有common-pool和c3p0等,具體以后再總結(jié)
詳情請參考:HttpClient學(xué)習(xí)整理
說明:可以看成是java.io的擴展 使用示例:
a) 標(biāo)準(zhǔn)代碼: InputStream in = new URL( "http://jakarta." ).openStream(); b) 使用IOUtils
File file = new File("/commons/io/project.properties");
longfreeSpace = FileSystemUtils.freeSpace("C:/");
說明:那么JXpath就是基于Java對象的Xpath,,也就是用Xpath對Java對象進行查詢,。 Addressaddress=(Address)JXPathContext.newContext(vendor).getValue("locations[address/zipCode='90210']/address"); Address address = null;
說明:這個工具包可以看成是對java.lang的擴展。提供了諸如StringUtils, StringEscapeUtils, RandomStringUtils, Tokenizer, WordUtils等工具類,。 Lang.*下有很多Utils類,,提供了若干static方法供調(diào)用,涵蓋了字符串操作,、字符操作,、JVM交互操作、歸類,、異常和位域校驗等等,。 首先看看字符串處理類StringUtils 全部的靜態(tài)方法,StringUtils繼承自O(shè)bject,。屬于null safe操作,。何謂null safe,就是遇到是null的string對象,,也會quietly的把它處理掉,,而不會有NullPointerException異常,如果有這個異常,,那么就是該類的bug了~~ 看看StringUtils的各種方法對比吧 比較一下isEmpty和isBlank這兩個方法,。isEmpty在判斷” “這樣的字符串時返回的是false,而isBlank返回的是true,。這就明顯了吧,,empty只對null和””有效,而blank對” ”也有效~~ Clean方法和trim方法都封裝了String的trim方法,,唯一的不同是clean將null處理為””,,而trim將null處理為null。 以Strip開頭的一系列方法基本可以看做trim方法的擴展,,但是更強大的是可以處理前導(dǎo)和后續(xù)的各種stripChars,,不局限于空白符了。 Equal系列的方法加入了null的判斷,,如果都是null那么也返回true,。 IndexOf與String的indexOf類似,,加入了null的判斷而已,,且多了一個ordinalIndexOf方法,可以找到第n個字符串出現(xiàn)的位置,。還有一個indexOfIgnoreCase可以不考慮大小寫的判斷位置匹配,。實際代碼是調(diào)用了string的regionMatches方法,,只不過在ignorecase參數(shù)上選擇了true。 Contains的實現(xiàn)是一樣的,,只是加入了null的判斷,。剩下的indexOfAny和containsAny方法都很不錯,完成了集合的匹配~~都包含一個字符數(shù)組的參數(shù),,可以檢測字符串中是否包含字符數(shù)組中的任意個元素,,算法沒有特殊的地方,復(fù)雜度O(MN)吧~~相比較而言,,contains系列的containsOnly和containsNone我倒是覺得更有用一些,。 Substring系列的方法,除了substring封裝了string的substring完成了null safe的檢查外,,還加入了left,、right和mid方法。顧名思義,,left可以得到最左邊的若干個字符作為字串,,其實就是調(diào)用了str.substring(0, len);而right同樣是調(diào)用了str.substring(str.length() - len);另外還有一些比如substringBefore和substringAfter之類的,用法類似,。substringBetween可以找到兩個字串中間的子串,。 Split是值得說道的一個改動,原本大量封裝string的方法,,split是個例外,,大家知道,string的split方法用到的參數(shù)是一個正則式,,雖然強大,,但是有時候容易出錯。而且string并沒有提供簡化版本,。StringUtils提供的split改變了這一狀況,,開始使用完整的字符串作為參數(shù),而不是regex,。同時,,對類似功能的jdk版本的StringTokenizer,在內(nèi)部方法splitWorker中有段注釋:Direct code is quicker than StringTokenizer.也就是說,,這個是更快的一個工具了~~ 對于split的反向操作join,,用到了一個lang.text包下的StrBuilder類。主要實現(xiàn)即將若干個object數(shù)組一個個的append到buffer中,。然后最后toString就好,。 Delete和remove可以用來刪除string中的內(nèi)容,比如deleteSpaces可以除去字符串中的所有空白字符(" "t"r"n"b");remove更強大,,可以removeStart(只匹配開頭)和removeEnd(只匹配結(jié)尾),,當(dāng)然remove可以刪掉字符串中的任意字串。 Replace,,同理這里的replace不像string中的一樣是基于正則的,,用起來更簡單。而且有replaceOnce和replaceEach等各種用法,。還有一個輔助的overlay方法,,可以直接替換~~ Chomp和chop我覺得是比較雞肋的一個功能了,去除字符串的最后一個字符或者尾部串,,這功能很必要么,? Repeat將已有字符串復(fù)制n次。 Pad是一個很有意思的方法,,可以將一個已有字符串?dāng)U展n個大小,,并且填充特定的字符。比如StringUtils.rightPad("bat", 5, 'z') = "batzz",。Pad調(diào)用了string的concat方法,。 Case conversion的操作就不用多講了,upper和lower都是一樣的,。補充說的是,,capitalize系列的方法真的很貼心。 補充一個容易讓人誤會的方法——countMatches,,記錄一個字符串str中某串sub出現(xiàn)的次數(shù),。為什么容易誤會,“aaaa”中有多少“aa”呢,?用該方法得到的答案是2~~~大家懂的 Is打頭的一系列方法都非常強大,,可以判斷字符串是否符合某種格式,比如isAlpha判斷是否都是字母,,isNumeric判斷是否都是數(shù)字等等等等,。 Reverse這個功能出來后,最先想到的是當(dāng)初筆試面試時候的一堆回文字符串翻轉(zhuǎn)之類的考試都要囧了,。 Abbreviate方法我覺得是相當(dāng)實用的一個方法封裝,,我們在各種應(yīng)用中都很常見的“一堆文字……”就是這個方法的最好應(yīng)用。 Difference方法返回兩個字符串的不同處,,可以說是返回第二個字符串的第一個不同的位置開始的子串,。indexOfDifference返回不同處的位置。 getCommonPrefix這個方法也很好,,可以找到一組字符串的公共前綴,。當(dāng)然只是調(diào)用了indexOfDifference這個方法,。 接著就是ArrayUtils了 ArrayUtils是一個對數(shù)組進行特殊處理的類。當(dāng)然jdk中的Arrays是有一些功能的,,Array也提供了一些動態(tài)訪問java數(shù)組的方法,,這里的ArrayUtils擴展提供了更多的功能,。 第一個可以說的方法是toMap方法,,該方法就是將一個二維數(shù)組轉(zhuǎn)換為一個HashMap。當(dāng)然對輸入的參數(shù)要求比較嚴(yán)格,,會拋出各種異常,。NullToEmpty方法是一個防御性編程方法的代表,將null的數(shù)組直接變?yōu)橐粋€空(長度為0)的數(shù)組,。Subarray方法提供了基于拷貝的子數(shù)組生成方法,。Reverse方法提供了一個數(shù)組翻轉(zhuǎn)的算法實現(xiàn)。indexOf方法是一個查找指定對象的線性數(shù)組查找方法,。還提供了一系列裝箱拆箱方法(toPrimitive和toObject),,就是將Integer之類的對象類型變成int,反之亦然,。addAll方法提供了基于數(shù)組拷貝的數(shù)組合并,,就是將數(shù)組1和數(shù)組2合并為一個新的數(shù)組返回。當(dāng)然,,add方法雖然只添加了一個元素,,但是也是要數(shù)組拷貝的(數(shù)組的效率啊?。,。。?。同樣的原理,,remove(刪除)方法也是基于數(shù)組拷貝的,以指定刪除元素為界,,分別兩次拷貝它前后的子數(shù)組,。 再來就是一些補充了 把一些看到的有意思的可能有用的接口方法提取出來。 RandomStringUtils類里有一個random方法,,可以產(chǎn)生一個固定長度的隨機字符串,。用到了java.util.Random。其中的注釋中提到了對Unicode中沒法處理的surrogate的處理方法,。如果不幸隨機到那個位置(D800-DBFF, DC00-DFFF),,那么算法中將進行count補充,即提供一次重新隨機的機會,。 另外一個比較有趣的類是StopWatch,,這是一個秒表類,,通過start方法開始計時,通過split方法截斷每一次的分段計時,,suspend方法可以暫停秒表,,resume恢復(fù)計時。最后stop后可以通過getTime獲得總共計時,。當(dāng)然在split后的分段計時可以用getSplitTime獲取,。技術(shù)實現(xiàn)上就是定義了幾個狀態(tài),然后通過每次狀態(tài)的轉(zhuǎn)變和系統(tǒng)時間的差來表達(dá)計時效果,。
說明:這個包提供的功能有些和Commons Lang重復(fù)了,,但是這個包更專注于做數(shù)學(xué)工具,功能更強大,。 Math 是一個輕量的,,自包含的數(shù)學(xué)和統(tǒng)計組件,解決了許多非常通用但沒有及時出現(xiàn)在Java標(biāo)準(zhǔn)語言中的實踐問題. 我們可以參考其主頁上的用戶指導(dǎo)(User Guide ).或者直接研究其API,,發(fā)現(xiàn)在commons-math中有以下幾個包: ?。保畂rg.apache.commons.math Common classes used throughout the commons-math library. 2.org.apache.commons.math.analysis Implementations of common numerical analysis procedures, including root finding and function interpolation. 主要解決一些數(shù)學(xué)通常的分析方法,,包括求方程的根,,其中有對分算法,牛頓算法等等.以及函數(shù)的改寫. ?。常畂rg.apache.commons.math.complex Complex number type and implementations of complex transcendental functions. 主要用來解決復(fù)數(shù)的計算. ?。矗畂rg.apache.commons.math.distribution Implementations of common discrete and continuous distributions. 主要用來解決連續(xù)分布和不連續(xù)分布的計算. ?。担畂rg.apache.commons.math.fraction Fraction number type and fraction number formatting.主要討論分?jǐn)?shù)的格式和類型. 6.org.apache.commons.math.linear Linear algebra support. 線性代數(shù)中矩陣和行列式的算法. 7.org.apache.commons.math.random Random number and random data generators.隨機數(shù)算法 ?。福畂rg.apache.commons.math.special Implementations of special functions such as Beta and Gamma.一些特別的函數(shù)算法. ?。梗畂rg.apache.commons.math.stat Data storage, manipulation and summary routines. ?。保埃畂rg.apache.commons.math.util Convenience routines and common data structures used throughout the commons-math library.
說明:這個包還是很實用的,,封裝了很多網(wǎng)絡(luò)協(xié)議。
1. FTP
使用示例: TelnetClient telnet = new TelnetClient();
說明:用來幫助進行驗證的工具,。比如驗證Email字符串,,日期字符串等是否合法。 DateValidator validator = DateValidator.getInstance();// Get the Date validator Commons Virtual File System 說明:提供對各種資源的訪問接口,。支持的資源類型包括
1. CIFS
這個包的功能很強大,,極大的簡化了程序?qū)Y源的訪問。
1,、一個簡單的文本郵件 我們的第一個例子是利用你本地的郵件服務(wù)器向"John Doe"發(fā)送一個基本郵件信息,。 import org.apache.commons.mail.SimpleEmail; ... SimpleEmail email = new SimpleEmail(); email.setHostName("mail.myserver.com"); email.addTo("[email protected]", "John Doe"); email.setFrom("me@", "Me"); email.setSubject("Test message"); email.setMsg("This is a simple test of commons-email"); email.send(); 調(diào)用setHostName("mail.myserver.com")來設(shè)置發(fā)送信息的SMTP服務(wù)器地址。如果你不設(shè)置,,將會使用系統(tǒng)屬性"mail.host",。 2,、發(fā)送帶附件的郵件 為了向一個郵件添加附件,你需要使用MultiPartEmail這個類,。這個類的工作方式和SimpleEmail類似,,但是其重載了attach()方法使其可以向郵件添加附件。你可以通過附加或者內(nèi)聯(lián)來添加無限數(shù)量的附件,,這些附件將采用MIME編碼,。 最簡單的方式是使用EmailAttachment類引用你得附件來添加附件。 下面的例子我們將創(chuàng)建一個圖片的附件,。把圖片附加在郵件中并發(fā)送它,。 import org.apache.commons.mail.*; ... // Create the attachment EmailAttachment attachment = new EmailAttachment(); attachment.setPath("mypictures/john.jpg"); attachment.setDisposition(EmailAttachment.ATTACHMENT); attachment.setDescription("Picture of John"); attachment.setName("John"); // Create the email message MultiPartEmail email = new MultiPartEmail(); email.setHostName("mail.myserver.com"); email.addTo("[email protected]", "John Doe"); email.setFrom("me@", "Me"); email.setSubject("The picture"); email.setMsg("Here is the picture you wanted"); // add the attachment email.attach(attachment); // send the email email.send(); 你也可以使用EmailAttachment引用一個非本地的URL文件,。當(dāng)發(fā)送郵件時,,URL文件會被自動下載下來附件在郵件中。 下面的例子演示如何把apache的徽標(biāo)附件在郵件中發(fā)送給John ,。 import org.apache.commons.mail.*; ... // Create the attachment EmailAttachment attachment = new EmailAttachment(); attachment.setURL(new URL("http://www./images/asf_logo_wide.gif")); attachment.setDisposition(EmailAttachment.ATTACHMENT); attachment.setDescription("Apache logo"); attachment.setName("Apache logo"); // Create the email message MultiPartEmail email = new MultiPartEmail(); email.setHostName("mail.myserver.com"); email.addTo("[email protected]", "John Doe"); email.setFrom("me@", "Me"); email.setSubject("The logo"); email.setMsg("Here is Apache's logo");
// add the attachment email.attach(attachment); // send the email email.send();
3,、發(fā)送HTML格式的郵件 發(fā)送HTML格式郵件要使用HtmlEmail類。這個類的工作方式很像使用附加方法設(shè)置html內(nèi)容的MultiPartEmail類類似,,如果接收者不支持HTML郵件將替換成普通的文本和內(nèi)聯(lián)圖片,。 在下面例子中,我們使用HTML格式內(nèi)容和以俄國內(nèi)聯(lián)圖像,。 import org.apache.commons.mail.HtmlEmail; ... // Create the email message HtmlEmail email = new HtmlEmail(); email.setHostName("mail.myserver.com"); email.addTo("[email protected]", "John Doe"); email.setFrom("me@", "Me"); email.setSubject("Test email with inline image"); // embed the image and get the content id URL url = new URL("http://www./images/asf_logo_wide.gif"); String cid = email.embed(url, "Apache logo"); // set the html message email.setHtmlMsg("<html>The apache logo - <img src=\"cid:"+cid+"\"></html>"); // set the alternative message email.setTextMsg("Your email client does not support HTML messages"); // send the email email.send(); 首先,,注意,調(diào)用embed函數(shù)返回一個字符串,。這個字符串是一個隨機的標(biāo)識符用來引用一個圖像標(biāo)簽中的圖像,。下一步,在這個例子中我們沒有調(diào)用setMsg()函數(shù),。這個方法在HtmlEmail中仍然可用,,但是如果你使用內(nèi)聯(lián)圖像時就不應(yīng)該使用,應(yīng)該使用setHtmlMsg()函數(shù)和setTextMsg()函數(shù),。 4,、調(diào)試 JavaMail API支持一個調(diào)試選項,如果你遇到了問題這個可能非常有用,。你可以通過調(diào)用setDebug(true)來激活調(diào)試模式,,調(diào)試信息將被輸出到標(biāo)準(zhǔn)輸出中。 5,、驗證 如果SMTP服務(wù)器需要驗證,,你可以在發(fā)送郵件前調(diào)用setAuthentication(userName,password)設(shè)置賬號和密碼。這個將會創(chuàng)建一個DefaultAuthenticator實例,,JavaMail API在發(fā)送郵件時會使用它,。你的服務(wù)器必須支持RFC2554標(biāo)準(zhǔn),。 |
|