zhoujun.g 发表于 2015-7-31 12:26:27

Apache Commons 工具类介绍及简单使用

  Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。下面是我这几年做开发过程中自己用过的工具类做简单介绍。
  
组件功能介绍BeanUtils提供了对于JavaBean进行各种操作,克隆对象,属性等等.BetwixtXML与Java对象之间相互转换.Codec处理常用的编码方法的工具类包 例如DES、SHA1、MD5、Base64等.Collectionsjava集合框架操作.Compressjava提供文件打包 压缩类库.Configuration一个java应用程序的配置管理类库.DBCP提供数据库连接池服务.DbUtils提供对jdbc 的操作封装来简化数据查询和记录读取操作.Emailjava发送邮件 对javamail的封装.FileUpload提供文件上传功能.HttpClien提供HTTP客户端与服务器的各种通讯操作. 现在已改成HttpComponentsIOio工具的封装.LangJava基本对象方法的工具类包 如:StringUtils,ArrayUtils等等.Logging提供的是一个Java 的日志接口.Validator提供了客户端和服务器端的数据验证框架.1、BeanUtils
  提供了对于JavaBean进行各种操作, 比如对象,属性复制等等。
  



Java代码
[*]//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对象之间相互转换。
  



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";
[*]      }
[*]    }
[*]      
[*]    //再创建一个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(“\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(
[*]      " 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等等。
  



Java代码
[*]//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系列接口的一组类



Java代码
[*]/**
[*]      * 得到集合里按顺序存放的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 list1 = new ArrayList();
[*]      list1.add("1");
[*]      list1.add("2");
[*]      list1.add("3");
[*]      List list2 = new ArrayList();
[*]      list2.add("2");
[*]      list2.add("3");
[*]      list2.add("5");
[*]      Collection c = CollectionUtils.retainAll(list1, list2);
[*]      System.out.println(c);
  
5、Compress
  commons compress中的打包、压缩类库。
  



Java代码
[*]//创建压缩对象
[*]    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



Java代码
[*]//举一个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。



Java代码
[*]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
页: [1]
查看完整版本: Apache Commons 工具类介绍及简单使用