全面的Java開源Apache Commons 工具類介紹
前言
Apache Commons 工具類大家都有用過,但是可能缺乏系統(tǒng)學(xué)習(xí),只用到了一小部分功能,無法發(fā)揮極限的價值,大白話說就是,一顆好白菜都讓豬給拱了!
代碼過多,手機觀看效果不佳,建議收藏后在電腦上靜悄悄地看。因內(nèi)容健康,可大膽轉(zhuǎn)發(fā),即使未滿十八歲,在沒有家長陪同下也一樣可以觀看!
1、BeanUtils
提供了對于JavaBean進行各種操作, 比如對象,屬性復(fù)制等等。
- //1、 克隆對象
- // 新創(chuàng)建一個普通Java Bean,用來作為被克隆的對象
- public class Person {
- private String name = "";
- private String email = "";
- private int age;
- //省略 set,get方法
- }
- // 再創(chuàng)建一個Test類,其中在main方法中代碼如下:
- import java.lang.reflect.InvocationTargetException;
- import java.util.HashMap;
- import java.util.Map;
- import org.apache.commons.beanutils.BeanUtils;
- import org.apache.commons.beanutils.ConvertUtils;
- public class Test {
- /**
- * @param args
- */
- public static void main(String[] args) {
- Person person = new Person();
- person.setName("tom");
- person.setAge(21);
- try {
- //克隆
- Person person2 = (Person)BeanUtils.cloneBean(person);
- System.out.println(person2.getName()+">>"+person2.getAge());
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InstantiationException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- }
- }
- }
- // 原理也是通過Java的反射機制來做的。
- // 2、 將一個Map對象轉(zhuǎn)化為一個Bean
- // 這個Map對象的key必須與Bean的屬性相對應(yīng)。
- Map map = new HashMap();
- map.put("name","tom");
- map.put("email","tom@");
- map.put("age","21");
- //將map轉(zhuǎn)化為一個Person對象
- Person person = new Person();
- BeanUtils.populate(person,map);
- // 通過上面的一行代碼,此時person的屬性就已經(jīng)具有了上面所賦的值了。
- // 將一個Bean轉(zhuǎn)化為一個Map對象了,如下:
- Map map = BeanUtils.describe(person)
2.Betwixt
XML與Java對象之間相互轉(zhuǎn)換。
- //1、 將JavaBean轉(zhuǎn)為XML內(nèi)容
- // 新創(chuàng)建一個Person類
- public class Person{
- private String name;
- private int age;
- /** Need to allow bean to be created via reflection */
- public PersonBean() {
- }
- public PersonBean(String name, int age) {
- this.name = name;
- this.age = age;
- }
- //省略set, get方法
- public String toString() {
- return "PersonBean[name='" + name + "',age='" + age + "']";
- }
- }
- //再創(chuàng)建一個WriteApp類:
- import java.io.StringWriter;
- import org.apache.commons.betwixt.io.BeanWriter;
- public class WriteApp {
- /**
- * 創(chuàng)建一個例子Bean,并將它轉(zhuǎn)化為XML.
- */
- public static final void main(String [] args) throws Exception {
- // 先創(chuàng)建一個StringWriter,我們將把它寫入為一個字符串
- StringWriter outputWriter = new StringWriter();
- // Betwixt在這里僅僅是將Bean寫入為一個片斷
- // 所以如果要想完整的XML內(nèi)容,我們應(yīng)該寫入頭格式
- outputWriter.write(“<?xml version=’1.0′ encoding=’UTF-8′ ?>
- ”);
- // 創(chuàng)建一個BeanWriter,其將寫入到我們預(yù)備的stream中
- BeanWriter beanWriter = new BeanWriter(outputWriter);
- // 配置betwixt
- // 更多詳情請參考java docs 或文檔
- beanWriter.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false);
- beanWriter.getBindingConfiguration().setMapIDs(false);
- beanWriter.enablePrettyPrint();
- // 如果這個地方不傳入XML的根節(jié)點名,Betwixt將自己猜測是什么
- // 但是讓我們將例子Bean名作為根節(jié)點吧
- beanWriter.write(“person”, new PersonBean(“John Smith”, 21));
- //輸出結(jié)果
- System.out.println(outputWriter.toString());
- // Betwixt寫的是片斷而不是一個文檔,所以不要自動的關(guān)閉掉writers或者streams,
- //但這里僅僅是一個例子,不會做更多事情,所以可以關(guān)掉
- outputWriter.close();
- }
- }
- //2、 將XML轉(zhuǎn)化為JavaBean
- import java.io.StringReader;
- import org.apache.commons.betwixt.io.BeanReader;
- public class ReadApp {
- public static final void main(String args[]) throws Exception{
- // 先創(chuàng)建一個XML,由于這里僅是作為例子,所以我們硬編碼了一段XML內(nèi)容
- StringReader xmlReader = new StringReader(
- "<?xml version=’1.0′ encoding=’UTF-8′ ?> <person><age>25</age><name>James Smith</name></person>");
- //創(chuàng)建BeanReader
- BeanReader beanReader = new BeanReader();
- //配置reader
- beanReader.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false);
- beanReader.getBindingConfiguration().setMapIDs(false);
- //注冊beans,以便betwixt知道XML將要被轉(zhuǎn)化為一個什么Bean
- beanReader.registerBeanClass("person", PersonBean.class);
- //現(xiàn)在我們對XML進行解析
- PersonBean person = (PersonBean) beanReader.parse(xmlReader);
- //輸出結(jié)果
- System.out.println(person);
- }
- }
為什么某些人會一直比你優(yōu)秀,是因為他本身就很優(yōu)秀還一直在持續(xù)努力變得更優(yōu)秀,而你是不是還在滿足于現(xiàn)狀內(nèi)心在竊喜! 關(guān)注我,私信回復(fù)我“資料”
獲取免費的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)、高性能及分布式、Jvm性能調(diào)優(yōu)、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構(gòu)視頻學(xué)習(xí)資料以及電子書資料)合理利用自己每一分每一秒的時間來學(xué)習(xí)提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!
3.Codec
提供了一些公共的編解碼實現(xiàn),比如Base64, Hex, MD5,Phonetic and URLs等等
4.Collections
- 對java.util的擴展封裝,處理數(shù)據(jù)還是挺靈活的。
- org.apache.commons.collections – Commons Collections自定義的一組公用的接口和工具類
- org.apache.commons.collections.bag – 實現(xiàn)Bag接口的一組類
- org.apache.commons.collections.bidimap – 實現(xiàn)BidiMap系列接口的一組類
- org.apache.commons.collections.buffer – 實現(xiàn)Buffer接口的一組類
- org.apache.commons.collections.collection – 實現(xiàn)java.util.Collection接口的一組類
- org.apache.commons.collections.comparators – 實現(xiàn)java.util.Comparator接口的一組類
- org.apache.commons.collections.functors – Commons Collections自定義的一組功能類
- org.apache.commons.collections.iterators – 實現(xiàn)java.util.Iterator接口的一組類
- org.apache.commons.collections.keyvalue – 實現(xiàn)集合和鍵/值映射相關(guān)的一組類
- org.apache.commons.collections.list – 實現(xiàn)java.util.List接口的一組類
- org.apache.commons.collections.map – 實現(xiàn)Map系列接口的一組類
- org.apache.commons.collections5.Compress.set – 實現(xiàn)Set系列接口的一組類
5.Compress
commons compress中的打包、壓縮類庫。
6.Configuration
用來幫助處理配置文件的,支持很多種存儲方式。
Properties filesXML documentsProperty list files (.plist)JNDIJDBC DatasourceSystem propertiesApplet parametersServlet parameters
7.DBCP
(Database Connection Pool)是一個依賴Jakarta commons-pool對象池機制的數(shù)據(jù)庫連接池,Tomcat的數(shù)據(jù)源使用的就是DBCP。
8.DbUtils
- Apache組織提供的一個資源JDBC工具類庫,它是對JDBC的簡單封裝,對傳統(tǒng)操作數(shù)據(jù)庫的類進行二次封裝,可以把結(jié)果集轉(zhuǎn)化成List。,同時也不影響程序的性能。文章轉(zhuǎn)自肥朝大神
- DbUtils類:啟動類
- ResultSetHandler接口:轉(zhuǎn)換類型接口
- MapListHandler類:實現(xiàn)類,把記錄轉(zhuǎn)化成List
- BeanListHandler類:實現(xiàn)類,把記錄轉(zhuǎn)化成List,使記錄為JavaBean類型的對象
- Qrery Runner類:執(zhí)行SQL語句的類
9.Email
提供的一個開源的API,是對javamail的封裝。
10.FileUpload
java web文件上傳功能。
11.HttpClient
基于HttpCore實 現(xiàn)的一個HTTP/1.1兼容的HTTP客戶端,它提供了一系列可重用的客戶端身份驗證、HTTP狀態(tài)保持、HTTP連接管理module。
12.http://IO
對http://java.io的擴展 操作文件非常方便。
13.Lang
主要是一些公共的工具集合,比如對字符、數(shù)組的操作等等。
14.Logging
提供的是一個Java 的日志接口,同時兼顧輕量級和不依賴于具體的日志實現(xiàn)工具。
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- public class CommonLogTest {
- private static Log log = LogFactory.getLog(CommonLogTest.class);
- //日志打印
- public static void main(String[] args) {
- log.error("ERROR");
- log.debug("DEBUG");
- log.warn("WARN");
- log.info("INFO");
- log.trace("TRACE");
- System.out.println(log.getClass());
- }
- }
15.Validator
通用驗證系統(tǒng),該組件提供了客戶端和服務(wù)器端的數(shù)據(jù)驗證框架。
1.驗證日期
- // 獲取日期驗證
- DateValidator validator = DateValidator.getInstance();
- // 驗證/轉(zhuǎn)換日期
- Date fooDate = validator.validate(fooString, "dd/MM/yyyy");
- if (fooDate == null) {
- // 錯誤 不是日期
- return;
- }
2.表達式驗證
- // 設(shè)置參數(shù)
- boolean caseSensitive = false;
- String regex1 = "^([A-Z]*)(?:\-)([A-Z]*)*$"
- String regex2 = "^([A-Z]*)$";
- String[] regexs = new String[] {regex1, regex1};
- // 創(chuàng)建驗證
- RegexValidator validator = new RegexValidator(regexs, caseSensitive);
- // 驗證返回boolean
- boolean valid = validator.isValid("abc-def");
- // 驗證返回字符串
- String result = validator.validate("abc-def");
- // 驗證返回數(shù)組
- String[] groups = validator.match("abc-def");
3.配置文件中使用驗證
- <form-validation>
- <global>
- <validator name="required"
- classname="org.apache.commons.validator.TestValidator"
- method="validateRequired"
- methodParams="java.lang.Object, org.apache.commons.validator.Field"/>
- </global>
- <formset>
- </formset>
- </form-validation>
- 添加姓名驗證.
- <form-validation>
- <global>
- <validator name="required"
- classname="org.apache.commons.validator.TestValidator"
- method="validateRequired"
- methodParams="java.lang.Object, org.apache.commons.validator.Field"/>
- </global>
- <formset>
- <form name="nameForm">
- <field property="firstName" depends="required">
- <arg0 key="nameForm.firstname.displayname"/>
- </field>
- <field property="lastName" depends="required">
- <arg0 key="nameForm.lastname.displayname"/>
- </field>
- </form>
- </formset>
- </form-validation>
4.驗證類
- Excerpts from org.apache.commons.validator.RequiredNameTest
- //加載驗證配置文件
- InputStream in = this.getClass().getResourceAsStream("validator-name-required.xml");
- ValidatorResources resources = new ValidatorResources(in);
- //這個是自己創(chuàng)建的bean 我這里省略了
- Name name = new Name();
- Validator validator = new Validator(resources, "nameForm");
- //設(shè)置參數(shù)
- validator.setParameter(Validator.BEAN_PARAM, name);
- Map results = null;
- //驗證
- results = validator.validate();
- if (results.get("firstName") == null) {
- //驗證成功
- } else {
- //有錯誤 int errors = ((Integer)results.get("firstName")).intValue();
- }