史上最全面的Java开源Apache Commons 工具类介绍

前言

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();

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容