apache commons工具集代码详解

Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。下面是我这几年做开发过程中自己用过的工具类做简单介绍。

组件 功能介绍
BeanUtils 提供了对于JavaBean进行各种操作,克隆对象,属性等等.
Betwixt XML与Java对象之间相互转换.
Codec 处理常用的编码方法的工具类包 例如DES、SHA1、MD5、Base64等.
Collections java集合框架操作.
Compress java提供文件打包 压缩类库.
Configuration 一个java应用程序的配置管理类库.
DBCP 提供数据库连接池服务.
DbUtils 提供对jdbc 的操作封装来简化数据查询和记录读取操作.
Email java发送邮件 对javamail的封装.
FileUpload 提供文件上传功能.
HttpClien 提供HTTP客户端与服务器的各种通讯操作. 现在已改成HttpComponents
IO io工具的封装.
Lang Java基本对象方法的工具类包 如:StringUtils,ArrayUtils等等.
Logging 提供的是一个Java 的日志接口.
Validator 提供了客户端和服务器端的数据验证框架.

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(“<?xml version='1.0′ encoding='UTF-8′ ?>\n”);
		// 创建一个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(
		    "<?xml version='1.0′ encoding='UTF-8′ ?> <person><age>25</age><name>James Smith</name></person>");
		//创建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等等。

//Base64编解码
private static String encodeTest(String str){
	Base64 base64 = new Base64();
	try {
		str = base64.encodeToString(str.getBytes("UTF-8"));
	}
	catch (UnsupportedEncodingException e) {
		e.printStackTrace();
	}
	System.out.println("Base64 编码后:"+str);
	return str;
}
private static void decodeTest(String str){
	Base64 base64 = new Base64();
	//str = Arrays.toString(Base64.decodeBase64(str));
	str = new String(Base64.decodeBase64(str));
	System.out.println("Base64 解码后:"+str);
}

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.collections.set – 实现Set系列接口的一组类

/**
    * 得到集合里按顺序存放的key之后的某一Key
    */
OrderedMap map = new LinkedMap();
map.put("FIVE", "5");
map.put("SIX", "6");
map.put("SEVEN", "7");
map.firstKey();
// returns "FIVE"
map.nextKey("FIVE");
// returns "SIX"
map.nextKey("SIX");
// returns "SEVEN"
/**
    * 通过key得到value
    * 通过value得到key
    * 将map里的key和value对调
    */
BidiMap bidi = new TreeBidiMap();
bidi.put("SIX", "6");
bidi.get("SIX");
// returns "6"
bidi.getKey("6");
// returns "SIX"
//    bidi.removeValue("6"); // removes the mapping
BidiMap inverse = bidi.inverseBidiMap();
// returns a map with keys and values swapped
System.out.println(inverse);
/**
     * 得到两个集合中相同的元素
     */
List<String> list1 = new ArrayList<String>();
list1.add("1");
list1.add("2");
list1.add("3");
List<String> list2 = new ArrayList<String>();
list2.add("2");
list2.add("3");
list2.add("5");
Collection c = CollectionUtils.retainAll(list1, list2);
System.out.println(c);

5、Compress commons compress中的打包、压缩类库。

//创建压缩对象
ZipArchiveEntry entry = new ZipArchiveEntry("CompressTest");
//要压缩的文件
File f=new File("e:\\test.pdf");
FileInputStream fis=new FileInputStream(f);
//输出的对象 压缩的文件
ZipArchiveOutputStream zipOutput=new ZipArchiveOutputStream(new File("e:\\test.zip"));
zipOutput.putArchiveEntry(entry);
int i=0,j;
while((j=fis.read()) != -1)
   {
	zipOutput.write(j);
	i++;
	System.out.println(i);
}
zipOutput.closeArchiveEntry();
zipOutput.close();
fis.close();

6、Configuration 用来帮助处理配置文件的,支持很多种存储方式。

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

//举一个Properties的简单例子
# usergui.properties
colors.background = #FFFFFF
colors.foreground = #000080
window.width = 500
window.height = 300
PropertiesConfiguration config = new PropertiesConfiguration("usergui.properties");
config.setProperty("colors.background", "#000000);
config.save();
config.save("usergui.backup.properties);
//save a copy
Integer integer = config.getInteger("window.width");

7、DBCP (Database Connection Pool)是一个依赖Jakarta commons-pool对象池机制的数据库连接池,Tomcat的数据源使用的就是DBCP。

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.GenericObjectPool;
import org.apache.commons.dbcp.ConnectionFactory;
import org.apache.commons.dbcp.PoolingDataSource;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.DriverManagerConnectionFactory;
//官方示例
public class PoolingDataSources {
	public static void main(String[] args) {
		System.out.println("加载jdbc驱动");
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		}
		catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		System.out.println("Done.");
		//
		System.out.println("设置数据源");
		DataSource dataSource = setupDataSource("jdbc:oracle:thin:@localhost:1521:test");
		System.out.println("Done.");
		//
		Connection conn = null;
		Statement stmt = null;
		ResultSet rset = null;
		try {
			System.out.println("Creating connection.");
			conn = dataSource.getConnection();
			System.out.println("Creating statement.");
			stmt = conn.createStatement();
			System.out.println("Executing statement.");
			rset = stmt.executeQuery("select * from person");
			System.out.println("Results:");
			int numcols = rset.getMetaData().getColumnCount();
			while(rset.next()) {
				for (int i=0;i<=numcols;i++) {
					System.out.print("\t" + rset.getString(i));
				}
				System.out.println("");
			}
		}
		catch(SQLException e) {
			e.printStackTrace();
		}
		finally {
			try {
				if (rset != null) rset.close();
			}
			catch(Exception e) {
			}
			try {
				if (stmt != null) stmt.close();
			}
			catch(Exception e) {
			}
			try {
				if (conn != null) conn.close();
			}
			catch(Exception e) {
			}
		}
	}
	public static DataSource setupDataSource(String connectURI) {
		//设置连接地址
		ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
		        connectURI, null);
		// 创建连接工厂
		PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(
		        connectionFactory);
		//获取GenericObjectPool 连接的实例
		ObjectPool connectionPool = new GenericObjectPool(
		        poolableConnectionFactory);
		// 创建 PoolingDriver
		PoolingDataSource dataSource = new PoolingDataSource(connectionPool);
		return dataSource;
	}
}

8、DbUtilsApache组织提供的一个资源JDBC工具类库,它是对JDBC的简单封装,对传统操作数据库的类进行二次封装,可以把结果集转化成List。,同时也不影响程序的性能。

DbUtils类:启动类

ResultSetHandler接口:转换类型接口

MapListHandler类:实现类,把记录转化成List

BeanListHandler类:实现类,把记录转化成List,使记录为JavaBean类型的对象

QreryRunner类:执行SQL语句的类

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
//转换成list
public class BeanLists {
	public static void main(String[] args) {
		Connection conn = null;
		String url = "jdbc:mysql://localhost:3306/ptest";
		String jdbcDriver = "com.mysql.jdbc.Driver";
		String user = "root";
		String password = "ptest";
		DbUtils.loadDriver(jdbcDriver);
		try {
			conn = DriverManager.getConnection(url, user, password);
			QueryRunner qr = new QueryRunner();
			List results = (List) qr.query(conn, "select id,name from person", new BeanListHandler(Person.class));
			for (int i = 0; i < results.size(); i++) {
				Person p = (Person) results.get(i);
				System.out.println("id:" + p.getId() + ",name:" + p.getName());
			}
		}
		catch (SQLException e) {
			e.printStackTrace();
		}
		finally {
			DbUtils.closeQuietly(conn);
		}
	}
}
public class Person{
	private Integer id;
	private String name;
	//省略set, get方法
}
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapListHandler;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
//转换成map
public class MapLists {
	public static void main(String[] args) {
		Connection conn = null;
		String url = "jdbc:mysql://localhost:3306/ptest";
		String jdbcDriver = "com.mysql.jdbc.Driver";
		String user = "root";
		String password = "ptest";
		DbUtils.loadDriver(jdbcDriver);
		try {
			conn = DriverManager.getConnection(url, user, password);
			QueryRunner qr = new QueryRunner();
			List results = (List) qr.query(conn, "select id,name from person", new MapListHandler());
			for (int i = 0; i < results.size(); i++) {
				Map map = (Map) results.get(i);
				System.out.println("id:" + map.get("id") + ",name:" + map.get("name"));
			}
		}
		catch (SQLException e) {
			e.printStackTrace();
		}
		finally {
			DbUtils.closeQuietly(conn);
		}
	}
}

9、Email 提供的一个开源的API,是对javamail的封装。

//用commons email发送邮件
public static void main(String args[]){
	Email email = new SimpleEmail();
	email.setHostName("smtp.googlemail.com");
	email.setSmtpPort(465);
	email.setAuthenticator(new DefaultAuthenticator("username", "password"));
	email.setSSLOnConnect(true);
	email.setFrom("user@gmail.com");
	email.setSubject("TestMail");
	email.setMsg("This is a test mail ... :-)");
	email.addTo("foo@bar.com");
	email.send();
}

10、FileUpload java web文件上传功能。

//官方示例:
//* 检查请求是否含有上传文件
// Check that we have a file upload request
Boolean isMultipart = ServletFileUpload.isMultipartContent(request);
//现在我们得到了items的列表
//如果你的应用近于最简单的情况,上面的处理就够了。但我们有时候还是需要更多的控制。
//下面提供了几种控制选择:
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Set factory constraints
factory.setSizeThreshold(yourMaxMemorySize);
factory.setRepository(yourTempDirectory);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置最大上传大小
upload.setSizeMax(yourMaxRequestSize);
// 解析所有请求
List
/* FileItem */
items = upload.parseRequest(request);
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory(
      yourMaxMemorySize, yourTempDirectory);
//一旦解析完成,你需要进一步处理item的列表。
// Process the uploaded items
Iterator iter = items.iterator();
while (iter.hasNext()) {
	FileItem item = (FileItem) iter.next();
	if (item.isFormField()) {
		processFormField(item);
	} else {
		processUploadedFile(item);
	}
}
//区分数据是否为简单的表单数据,如果是简单的数据:
// processFormField
if (item.isFormField()) {
	String name = item.getFieldName();
	String value = item.getString();
	//...省略步骤
}
//如果是提交的文件:
// processUploadedFile
if (!item.isFormField()) {
	String fieldName = item.getFieldName();
	String fileName = item.getName();
	String contentType = item.getContentType();
	Boolean isInMemory = item.isInMemory();
	long sizeInBytes = item.getSize();
	//...省略步骤
}
//对于这些item,我们通常要把它们写入文件,或转为一个流
// Process a file upload
if (writeToFile) {
	File uploadedFile = new File(...);
	item.write(uploadedFile);
} else {
	InputStream uploadedStream = item.getInputStream();
	//...省略步骤
	uploadedStream.close();
}
//或转为字节数组保存在内存中:
// Process a file upload in memory
byte[] data = item.get();
//...省略步骤
//如果这个文件真的很大,你可能会希望向用户报告到底传了多少到服务端,让用户了解上传的过程
//Create a progress listener
ProgressListener progressListener = new ProgressListener(){
	public void update(long pBytesRead, long pContentLength, int pItems) {
		System.out.println("We are currently reading item " + pItems);
		if (pContentLength == -1) {
			System.out.println("So far, " + pBytesRead + " bytes have been read.");
		} else {
			System.out.println("So far, " + pBytesRead + " of " + pContentLength
			                 + " bytes have been read.");
		}
	}
}
;
upload.setProgressListener(progressListener);

11、HttpClien 基于HttpCore实 现的一个HTTP/1.1兼容的HTTP客户端,它提供了一系列可重用的客户端身份验证、HTTP状态保持、HTTP连接管理module。

//GET方法
import java.io.IOException;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
public class GetSample{
	public static void main(String[] args) {
		// 构造HttpClient的实例
		HttpClient httpClient = new HttpClient();
		// 创建GET方法的实例
		GetMethod getMethod = new GetMethod("http://www.ibm.com");
		// 使用系统提供的默认的恢复策略
		getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
		        new DefaultHttpMethodRetryHandler());
		try {
			// 执行getMethod
			int statusCode = httpClient.executeMethod(getMethod);
			if (statusCode != HttpStatus.SC_OK) {
				System.err.println("Method failed: "
				            + getMethod.getStatusLine());
			}
			// 读取内容
			byte[] responseBody = getMethod.getResponseBody();
			// 处理内容
			System.out.println(new String(responseBody));
		}
		catch (HttpException e) {
			// 发生致命的异常,可能是协议不对或者返回的内容有问题
			System.out.println("Please check your provided http address!");
			e.printStackTrace();
		}
		catch (IOException e) {
			// 发生网络异常
			e.printStackTrace();
		}
		finally {
			// 释放连接
			getMethod.releaseConnection();
		}
	}
}
//POST方法
import java.io.IOException;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
public class PostSample{
	public static void main(String[] args) {
		// 构造HttpClient的实例
		HttpClient httpClient = new HttpClient();
		// 创建POST方法的实例
		String url = "http://www.oracle.com/";
		PostMethod postMethod = new PostMethod(url);
		// 填入各个表单域的值
		NameValuePair[] data = { new NameValuePair("id", "youUserName"),
		    new NameValuePair("passwd", "yourPwd")
	}
	;
	// 将表单的值放入postMethod中
	postMethod.setRequestBody(data);
	// 执行postMethod
	int statusCode = httpClient.executeMethod(postMethod);
	// HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发
	// 301或者302
	if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY ||
	    statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {
		// 从头中取出转向的地址
		Header locationHeader = postMethod.getResponseHeader("location");
		String location = null;
		if (locationHeader != null) {
			location = locationHeader.getValue();
			System.out.println("The page was redirected to:" + location);
		} else {
			System.err.println("Location field value is null.");
		}
		return;
	}
}
}

12、IO 对java.io的扩展 操作文件非常方便。

//1.读取Stream
//标准代码:
InputStream in = new URL( "http://jakarta.apache.org" ).openStream();
try {
	InputStreamReader inR = new InputStreamReader( in );
	BufferedReader buf = new BufferedReader( inR );
	String line;
	while ( ( line = buf.readLine() ) != null ) {
		System.out.println( line );
	}
}
finally {
	in.close();
}
//使用IOUtils
InputStream in = new URL( "http://jakarta.apache.org" ).openStream();
try {
	System.out.println( IOUtils.toString( in ) );
}
finally {
	IOUtils.closeQuietly(in);
}
//2.读取文件
File file = new File("/commons/io/project.properties");
List lines = FileUtils.readLines(file, "UTF-8");
//3.察看剩余空间
long freeSpace = FileSystemUtils.freeSpace("C:/");

13、Lang 主要是一些公共的工具集合,比如对字符、数组的操作等等。

// 1 合并两个数组: org.apache.commons.lang. ArrayUtils
// 有时我们需要将两个数组合并为一个数组,用ArrayUtils就非常方便,示例如下:
private static void testArr() {
	String[] s1 = new String[] { "1", "2", "3" };
	String[] s2 = new String[] { "a", "b", "c" };
	String[] s = (String[]) ArrayUtils.addAll(s1, s2);
	for (int i = 0; i < s.length; i++) {
		System.out.println(s[i]);
	}
	String str = ArrayUtils.toString(s);
	str = str.substring(1, str.length() - 1);
	System.out.println(str + ">>" + str.length());
}
//2 截取从from开始字符串
StringUtils.substringAfter("SELECT * FROM PERSON ", "from");
//3 判断该字符串是不是为数字(0~9)组成,如果是,返回true 但该方法不识别有小数点和 请注意
StringUtils.isNumeric("454534");
//返回true
//4.取得类名
System.out.println(ClassUtils.getShortClassName(Test.class));
//取得其包名
System.out.println(ClassUtils.getPackageName(Test.class));
//5.NumberUtils
System.out.println(NumberUtils.stringToint("6"));
//6.五位的随机字母和数字
System.out.println(RandomStringUtils.randomAlphanumeric(5));
//7.StringEscapeUtils
System.out.println(StringEscapeUtils.escapeHtml("<html>"));
//输出结果为<html>
System.out.println(StringEscapeUtils.escapeJava("String"));
//8.StringUtils,判断是否是空格字符
System.out.println(StringUtils.isBlank("  "));
//将数组中的内容以,分隔
System.out.println(StringUtils.join(test,","));
//在右边加下字符,使之总长度为6
System.out.println(StringUtils.rightPad("abc", 6, 'T'));
//首字母大写
System.out.println(StringUtils.capitalize("abc"));
//Deletes all whitespaces from a String 删除所有空格
System.out.println( StringUtils.deleteWhitespace("  ab c "));
//判断是否包含这个字符
System.out.println( StringUtils.contains("abc", "ba"));
//表示左边两个字符
System.out.println( StringUtils.left("abc", 2));
System.out.println(NumberUtils.stringToint("33"));

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 通用验证系统,该组件提供了客户端和服务器端的数据验证框架。

验证日期

// 获取日期验证
DateValidator validator = DateValidator.getInstance();
// 验证/转换日期
Date fooDate = validator.validate(fooString, "dd/MM/yyyy");
if (fooDate == null) {
	// 错误 不是日期
	return;
}

表达式验证

// 设置参数
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");

配置文件中使用验证

<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>  

验证类

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

总结

以上就是本文关于apache commons工具集代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

您可能感兴趣的文章:

  • java利用Apache commons codec进行MD5加密,BASE64加密解密,执行系统命令
  • Apache Commons Math3探索之快速傅立叶变换代码示例
  • Apache Commons Math3探索之多项式曲线拟合实现代码
  • Apache Commons Math3学习之数值积分实例代码
  • Apache commons fileupload文件上传实例讲解
  • Apache Commons fileUpload文件上传多个示例分享
  • Apache Commons fileUpload实现文件上传之一
  • Apache Commons DbUtils工具包使用介绍
(0)

相关推荐

  • Apache commons fileupload文件上传实例讲解

    文件上传的方法主要目前有两个常用的,一个是SmartUpload,一个是Apache的Commons fileupload. 我们这里主要介绍下第二个的用法,首先要上传文件,注意几个问题: 1 form表单内,要添加空间<input type="file" name="myfile"> 2 form表单的内容格式要定义成multipart/form-data格式 3 需要类库:1 commons-io.jar 2commons-fileupload-1.

  • Apache Commons DbUtils工具包使用介绍

    一.介绍 DBUtils是个小巧的JDBC轻量级封装的工具包,其最核心的特性是在JDBC的基础上做了一层封装,主要是对结果集的封装,可以直接将查询出来的结果集封装成JavaBean,旨在简化JDBC代码混乱与重复. JDBC代码开发,存在很多难点: 1)操作过程复杂,代码操作一个模式,大量的重复. 2)结果集难以处理. 3)到处都强制检查SQLException,影响代码的美观和可读性. 二.熟悉DBUtils 在使用DBUtils之前,应该注意一些问题: 1)DBUtils是JDBC的简单封装

  • Apache Commons Math3学习之数值积分实例代码

    Apache.Commons.Math3里面的数值积分支持类采用的是"逼近法",即,先对大区间做一次积分,再对小区间做一次积分,若两次积分结果的差值小于某一设定的误差值,则认为积分完成.否则,将区间再次细分,对细分后的区间进行积分,与前一次积分相比较,如此反复迭代,直至最近的两次积分差值足够小.这样的结果,有可能会导致无法收敛. 为了使用org.apache.commons.math3.analysis.integration包中的积分器类,需要先实现UnivariateFunctio

  • java利用Apache commons codec进行MD5加密,BASE64加密解密,执行系统命令

    编写代码之前先来介绍一下我们要用到的两个包; commons-codec-1.10.jar Commons项目中用来处理常用的编码方法的工具类包,例如DES.SHA1.MD5.Base64,URL,Soundx等等. commons-exec-1.3.jar Apache Commons Exec 是 Apache 上的一个 Java 项目,提供一些常用的方法用来执行外部进程 你可以到本站直接下载 Apache Commons 官方包 下面看一下代码结构: import org.apache.c

  • Apache Commons Math3探索之快速傅立叶变换代码示例

    上一篇文章中我们了解了Apache Commons Math3探索之多项式曲线拟合实现代码,今天我们就来看看如何通过apache commons math3实现快速傅里叶变换,下面是具体内容. 傅立叶变换:org.apache.commons.math3.transform.FastFourierTransformer类. 用法示例代码: double inputData = new double[arrayLength]; // ... 给inputData赋值 FastFourierTran

  • Apache Commons Math3探索之多项式曲线拟合实现代码

    上一篇文章我们介绍了Apache Commons Math3学习之数值积分实例代码,这里给大家分享math3多项式曲线拟合的相关内容,具体如下. 多项式曲线拟合:org.apache.commons.math3.fitting.PolynomialCurveFitter类. 用法示例代码: // ... 创建并初始化输入数据: double[] x = new double[...]; double[] y = new double[...]; 将原始的x-y数据序列合成带权重的观察点数据序列:

  • Apache Commons fileUpload实现文件上传之一

    废话不多说了,直奔主题了. 需要两个jar包: commons-fileupload.jar Commons IO的jar包(本文使用commons-io-2.4.jar) 利用Servlet来实现文件上传. package web.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.

  • Apache Commons fileUpload文件上传多个示例分享

    本文通过实例来介绍如何使用commons-fileupload.jar,Apache的commons-fileupload.jar可方便的实现文件的上传功能,具体内容如下 将Apache的commons-fileupload.jar放在应用程序的WEB-INF\lib下,即可使用.下面举例介绍如何使用它的文件上传功能. 所使用的fileUpload版本为1.2,环境为Eclipse3.3+MyEclipse6.0.FileUpload 是基于 Commons IO的,所以在进入项目前先确定Com

  • apache commons工具集代码详解

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于JavaBean进行各种操作,克隆对象,属性等等. Betwixt XML与Java对象之间相互转换. Codec 处理常用的编码方法的工具类包 例如DES.SHA1.MD5.Base64等. Collections java集合框架操作. Compress java提供文件打包 压缩类库. Con

  • apache性能测试工具ab使用详解

    网站性能压力测试是服务器网站性能调优过程中必不可缺少的一环.只有让服务器处在高压情况下,才能真正体现出软件.硬件等各种设置不当所暴露出的问题. 性能测试工具目前最常见的有以下几种:ab.http_load.webbench.siege.今天我们专门来介绍ab. ab是apache自带的压力测试工具.ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试.比如nginx.tomcat.IIS等. 下面我们开始介绍有关ab命令的使用: 1.ab的原理

  • java使用Apache工具集实现ftp文件传输代码详解

    本文主要介绍如何使用Apache工具集commons-net提供的ftp工具实现向ftp服务器上传和下载文件. 一.准备 需要引用commons-net-3.5.jar包. 使用maven导入: <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.5</version> </depend

  • Java常用类库Apache Commons工具类说明及使用实例详解

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于JavaBean进行各种操作,克隆对象,属性等等. Betwixt XML与Java对象之间相互转换. Codec 处理常用的编码方法的工具类包 例如DES.SHA1.MD5.Base64等. Collections java集合框架操作. Compress java提供文件打包 压缩类库. Con

  • java编程实现并查集的路径压缩代码详解

    首先看两张路径压缩的图片: 并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题.一些常见的用途有求连通子图.求最小生成树的 Kruskal 算法和求最近公共祖先(Least Common Ancestors, LCA)等. 使用并查集时,首先会存在一组不相交的动态集合 S={S 1 ,S 2 ,⋯,S k } ,一般都会使用一个整数表示集合中的一个元素. 每个集合可能包含一个或多个元素,并选出集合中的某个元素作为代表.每个集合中具体包含

  • C# 数据库链接字符串加密解密工具代码详解

    有些项目尤其是WinForm或者是WPF项目,针对一些工具形式的小项目,不想软件流出去之后,懂程序的的拿到手之后一看配置文件就知道了我们数据库的用户名和密码,如果外网能访问的话,那就麻烦大了.所以这里为了防止项目外泄之后这些信息不被别人看到,我们就需要对链接字符串或者其他重要信息进行加密,用的时候在解密. 思路:使用两个数对连接字符串进行加密,再用这两个数进行解密. <add key="ConfigString" value="4HsXBRNXTkeN0ZoKdEwFE

  • Android快速开发系列 10个常用工具类实例代码详解

    打开大家手上的项目,基本都会有一大批的辅助类,今天特此整理出10个基本每个项目中都会使用的工具类,用于快速开发~~在此感谢群里给我发项目中工具类的兄弟/姐妹~ 1.日志工具类L.java package com.zhy.utils; import android.util.Log; /** * Log统一管理类 * * * */ public class L { private L() { /* cannot be instantiated */ throw new UnsupportedOpe

  • Go代码检查的推荐工具及使用详解

    目录 1. Golint 2. Golangci-lint 3. Go-reporter 1. Golint (1)安装golint git clone https://github.com/golang/lint.git cd lint/golint go install (2)使用方式 # 检查单个文件 golint service.go # 检查当前目录所有.go文件,不会递归查找 golint (3)golint校验规则 不能使用下划线命名法,使用驼峰命名法 外部可见程序结构体.变量.函

  • Java 从网上下载文件的几种方式实例代码详解

    废话不多说了,直接给大家贴代码了,具体代码如下所示: package com.github.pandafang.tool; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.nio.chan

  • springboot整合websocket实现群聊思路代码详解

    实现思路 发送者向服务器发送大家早上好.其它客户端可以收到对应消息. 项目展示 通过springboot引入websocket,实现群聊,通过在线websocket测试进行展示. 核心代码 pom引入jar <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2

随机推荐