前言
Apache Commons 工具類大家都有用過,但是可能缺乏系統學習,只用到了一小部分功能,無法發揮極限的價值,大白話說就是,一顆好白菜都讓豬給拱了!
代碼過多,手機觀看效果不佳,建議收藏后在電腦上靜悄悄地看。因內容健康,可大膽轉發,即使未滿十八歲,在沒有家長陪同下也一樣可以觀看!
1、BeanUtils
提供了對于JavaBean進行各種操作, 比如對象,屬性復制等等。
//1、 克隆對象
// 新創建一個普通Java Bean,用來作為被克隆的對象
public class Person {
private String name = "";
private String email = "";
private int age;
//省略 set,get方法
}
// 再創建一個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對象轉化為一個Bean
// 這個Map對象的key必須與Bean的屬性相對應。
Map map = new HashMap();
map.put("name","tom");
map.put("email","tom@");
map.put("age","21");
//將map轉化為一個Person對象
Person person = new Person();
BeanUtils.populate(person,map);
// 通過上面的一行代碼,此時person的屬性就已經具有了上面所賦的值了。
// 將一個Bean轉化為一個Map對象了,如下:
Map map = BeanUtils.describe(person)
2.Betwixt
XML與Java對象之間相互轉換。
//1、 將JavaBean轉為XML內容
// 新創建一個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 + "']";
}
}
//再創建一個WriteApp類:
import java.io.StringWriter;
import org.apache.commons.betwixt.io.BeanWriter;
public class WriteApp {
/**
* 創建一個例子Bean,并將它轉化為XML.
*/
public static final void main(String [] args) throws Exception {
// 先創建一個StringWriter,我們將把它寫入為一個字符串
StringWriter outputWriter = new StringWriter();
// Betwixt在這里僅僅是將Bean寫入為一個片斷
// 所以如果要想完整的XML內容,我們應該寫入頭格式
outputWriter.write(“”);
// 創建一個BeanWriter,其將寫入到我們預備的stream中
BeanWriter beanWriter = new BeanWriter(outputWriter);
// 配置betwixt
// 更多詳情請參考java docs 或最新的文檔
beanWriter.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false);
beanWriter.getBindingConfiguration().setMapIDs(false);
beanWriter.enablePrettyPrint();
// 如果這個地方不傳入XML的根節點名,Betwixt將自己猜測是什么
// 但是讓我們將例子Bean名作為根節點吧
beanWriter.write(“person”, new PersonBean(“John Smith”, 21));
//輸出結果
System.out.println(outputWriter.toString());
// Betwixt寫的是片斷而不是一個文檔,所以不要自動的關閉掉writers或者streams,
//但這里僅僅是一個例子,不會做更多事情,所以可以關掉
outputWriter.close();
}
}
//2、 將XML轉化為JavaBean
import java.io.StringReader;
import org.apache.commons.betwixt.io.BeanReader;
public class ReadApp {
public static final void main(String args[]) throws Exception{
// 先創建一個XML,由于這里僅是作為例子,所以我們硬編碼了一段XML內容
StringReader xmlReader = new StringReader(
" 25James Smith");
//創建BeanReader
BeanReader beanReader = new BeanReader();
//配置reader
beanReader.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false);
beanReader.getBindingConfiguration().setMapIDs(false);
//注冊beans,以便betwixt知道XML將要被轉化為一個什么Bean
beanReader.registerBeanClass("person", PersonBean.class);
//現在我們對XML進行解析
PersonBean person = (PersonBean) beanReader.parse(xmlReader);
//輸出結果
System.out.println(person);
}
}
3.Codec
提供了一些公共的編解碼實現,比如Base64, Hex, MD5,Phonetic and URLs等等
4.Collections
對java.util的擴展封裝,處理數據還是挺靈活的。
org.apache.commons.collections – Commons Collections自定義的一組公用的接口和工具類
org.apache.commons.collections.bag – 實現Bag接口的一組類
org.apache.commons.collections.bidimap – 實現BidiMap系列接口的一組類
org.apache.commons.collections.buffer – 實現Buffer接口的一組類
org.apache.commons.collections.collection – 實現java.util.Collection接口的一組類
org.apache.commons.collections.comparators – 實現java.util.Comparator接口的一組類
org.apache.commons.collections.functors – Commons Collections自定義的一組功能類
org.apache.commons.collections.iterators – 實現java.util.Iterator接口的一組類
org.apache.commons.collections.keyvalue – 實現集合和鍵/值映射相關的一組類
org.apache.commons.collections.list – 實現java.util.List接口的一組類
org.apache.commons.collections.map – 實現Map系列接口的一組類
org.apache.commons.collections5.Compress.set – 實現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對象池機制的數據庫連接池,Tomcat的數據源使用的就是DBCP。
8.DbUtils
Apache組織提供的一個資源JDBC工具類庫,它是對JDBC的簡單封裝,對傳統操作數據庫的類進行二次封裝,可以把結果集轉化成List。,同時也不影響程序的性能。文章轉自肥朝大神
DbUtils類:啟動類
ResultSetHandler接口:轉換類型接口
MapListHandler類:實現類,把記錄轉化成List
BeanListHandler類:實現類,把記錄轉化成List,使記錄為JavaBean類型的對象
Qrery Runner類:執行SQL語句的類
9.Email
提供的一個開源的API,是對javamail的封裝。
10.FileUpload
java web文件上傳功能。
11.HttpClient
基于HttpCore實 現的一個HTTP/1.1兼容的HTTP客戶端,它提供了一系列可重用的客戶端身份驗證、HTTP狀態保持、HTTP連接管理module。
12.http://IO
對http://java.io的擴展 操作文件非常方便。
13.Lang
主要是一些公共的工具集合,比如對字符、數組的操作等等。
14.Logging
提供的是一個Java 的日志接口,同時兼顧輕量級和不依賴于具體的日志實現工具。
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
通用驗證系統,該組件提供了客戶端和服務器端的數據驗證框架。
1.驗證日期
// 獲取日期驗證
DateValidator validator = DateValidator.getInstance();
// 驗證/轉換日期
Date fooDate = validator.validate(fooString, "dd/MM/yyyy");
if (fooDate == null) {
// 錯誤 不是日期
return;
}
2.表達式驗證
// 設置參數
boolean caseSensitive = false;
String regex1 = "^([A-Z]*)(?:\-)([A-Z]*)*$"
String regex2 = "^([A-Z]*)$";
String[] regexs = new String[] {regex1, regex1};
// 創建驗證
RegexValidator validator = new RegexValidator(regexs, caseSensitive);
// 驗證返回boolean
boolean valid = validator.isValid("abc-def");
// 驗證返回字符串
String result = validator.validate("abc-def");
// 驗證返回數組
String[] groups = validator.match("abc-def");
3.配置文件中使用驗證
classname="org.apache.commons.validator.TestValidator"
method="validateRequired"
methodParams="java.lang.Object, org.apache.commons.validator.Field"/>
添加姓名驗證.
classname="org.apache.commons.validator.TestValidator"
method="validateRequired"
methodParams="java.lang.Object, org.apache.commons.validator.Field"/>
4.驗證類
Excerpts from org.apache.commons.validator.RequiredNameTest
//加載驗證配置文件
InputStream in = this.getClass().getResourceAsStream("validator-name-required.xml");
ValidatorResources resources = new ValidatorResources(in);
//這個是自己創建的bean 我這里省略了
Name name = new Name();
Validator validator = new Validator(resources, "nameForm");
//設置參數
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();
}