Jakarta Commons项目提供了相当丰富的API,我们之前了解到的Commons Lang只是众多API的比较核心的一小部分而已。Commons下面还有相当数量的子项目,用于解决各种各样不同方向的实际问题,BeanUtils就是其中的一个,用于处理JavaBeans。它利用Java的反射机制,从动态的生成对bean的getter和setter的调用代码,到模拟创建一个动态的bean,等等。这个包看似简单,却是很多开源项目的基石:如在著名的Struts和Spring Framework中,我们都能找到BeanUtils的影子。大家猜猜看,有哪位名人是BeanUtils的作者之一?没错,就是Struts的创始人Craig McClanahan。

BeanUtils最核心的好处在于:我们在编码时,并不需要知道我们处理的JavaBeans具体是什么类型,有哪些属性,这些信息是可以动态获取的,甚至我们都可以不必去关心事实上是否存在这样一个具体的JavaBean类。我们只需要知道有一个JavaBean的实例,我们需要从中取得某个属性,设定某个属性的值,或者仅仅是需要一个属性表。要做到这些,依靠Sun提供的JavaBean规范似乎找不到一个很直接的方式,除非硬编码,将getXxxx()和setXxxx()直接写进我们的程序。但是这样就大大增加了代码的复杂度、耦合性和维护成本。还好Commons BeanUtils对这个问题提供了一种优雅的解决方案。

我们有两种途径获取Commons BeanUtils的binary:

1- 从Struts、Spring或者任何依赖BeanUtils的开源产品的发行包中找到相应的jar文件;

2- 从http://www.apache.org/dist/jakarta/commons/beanutils/binaries/下载。

Commons BeanUtils的源码下载地址:

http://www.apache.org/dist/jakarta/commons/beanutils/source/

Commons BeanUtils一共包括如下5个包:

org.apache.commons.beanutils – 核心包,定义一组Utils类和需要用到的接口规范

org.apache.commons.beanutils.converters – 转换String到需要类型的类,实现Converter接口

org.apache.commons.beanutils.locale – beanutils的locale敏感版本

org.apache.commons.beanutils.locale.converters – converters的locale敏感版本

org.apache.commons.collections – beanutils使用到的Collection类

其中需要我们特别关注的是这个org.apache.commons.beanutils包,其他包都是起辅助作用的。接下来我们就来看看如何使用beanutils包

     1.PropertyUtils

  它支持三种类型的属性值-Simple,Indexed,Mapped
  Simple属性访问方法
  PropertyUtils.getSimpleProperty(Object bean, String name) 
  PropertyUtils.setSimpleProperty(Object bean, String name, Object value)

  实现代码:
   Employee employee = ...;
   String firstName = (String)
   PropertyUtils.getSimpleProperty(employee, "firstName");
   String lastName = (String)
   PropertyUtils.getSimpleProperty(employee, "lastName");
   ... manipulate the values ...
   PropertyUtils.setSimpleProperty(employee, "firstName", firstName);
   PropertyUtils.setSimpleProperty(employee, "lastName", lastName);

  Indexed属性访问方法
  PropertyUtils.getIndexedProperty(Object bean, String name) 
  PropertyUtils.getIndexedProperty(Object bean, String name, int index) 
  PropertyUtils.setIndexedProperty(Object bean, String name, Object value) 
  PropertyUtils.setIndexedProperty(Object bean, String name, int index, Object value)

  实现代码:
  Employee employee = ...;
   int index = ...;
   String name = "subordinate[" + index + "]";
   Employee subordinate = (Employee)
   PropertyUtils.getIndexedProperty(employee, name);//根据value取得属性
   Employee employee = ...;
   int index = ...;
   Employee subordinate = (Employee)
   PropertyUtils.getIndexedProperty(employee, "subordinate", index);//根据索引
  值取的属性值

  Mapped属性访问方法
  PropertyUtils.getMappedProperty(Object bean, String name) 
  PropertyUtils.getMappedProperty(Object bean, String name, String key) 
  PropertyUtils.setMappedProperty(Object bean, String name, Object value) 
  PropertyUtils.setMappedProperty(Object bean, String name, String key, Object value)
  实现代码:
  Employee employee = ...;
   Address address = ...;
   PropertyUtils.setMappedProperty(employee, "address(home)", address);//根据数组
  //内的值来去的相应的属性值
   Employee employee = ...;
   Address address = ...;
   PropertyUtils.setMappedProperty(employee, "address", "home", address);

  Nested属性访问方法//Nested的意思是参数中包含组件
  PropertyUtils.getNestedProperty(Object bean, String name) 
  PropertyUtils.setNestedProperty(Object bean, String name, Object value)
  实现代码:
  String city = (String) PropertyUtils.getNestedProperty(employee, 
  "address(home).city");

  2.BeanUtils.DynaBean and BeanUtils.DynaClass 接口介绍
  DynaBean必须有一个bean来实现这个接口,DynaClass必有一个bean的属性集来实现

  BasicDynaBean and BasicDynaClass - 基本的 Dynamic 类型
  基本的API:
  BasicDynaClass(java.lang.String name, java.lang.Class dynaBeanClass, DynaProperty[] properties) 
  BasicDynaBean(DynaClass dynaClass) 
  我们定义一下基本的代码:
  //定义动态属性集
  DynaProperty[] props = new DynaProperty[]{
   new DynaProperty("address", java.util.Map.class),
   new DynaProperty("subordinate", mypackage.Employee[].class),
   new DynaProperty("firstName", String.class),
   new DynaProperty("lastName", String.class)
   };
  //创建动态类来设定动态属性值
   BasicDynaClass dynaClass = new BasicDynaClass("employee", null, props);
  DynaBean employee = dynaClass.newInstance();
   employee.set("address", new HashMap());
   employee.set("subordinate", new mypackage.Employee[0]);
   employee.set("firstName", "Fred");
   employee.set("lastName", "Flintstone");

  ResultSetDynaClass (Wraps ResultSet in DynaBeans) - 使用 ResultSet 的
  Dynamic JavaBean
  API:
  ResultSetDynaClass(java.sql.ResultSet resultSet)
  ResultSetDynaClass(java.sql.ResultSet resultSet, boolean lowerCase) 
  Connection conn = ...;
   Statement stmt = conn.createStatement();
   ResultSet rs = stmt.executeQuery
   ("select account_id, name from customers");
   Iterator rows = (new ResultSetDynaClass(rs)).iterator();
   while (rows.hasNext()) {
  //利用动态bean进行输出
   DynaBean row = (DynaBean) rows.next();
   System.out.println("Account number is " +
   row.get("account_id") +
   " and name is " + row.get("name"));
   }
   rs.close();
   stmt.close();

  RowSetDynaClass (Disconnected ResultSet as DynaBeans) - 使用 RowSet 的 Dynamic 
  JavaBean
  API:
  RowSetDynaClass(java.sql.ResultSet resultSet)
  RowSetDynaClass(java.sql.ResultSet resultSet, boolean lowerCase) 
   Connection conn = ...; // 从缓冲池取得连接
   Statement stmt = conn.createStatement();
   ResultSet rs = stmt.executeQuery("SELECT ...");
   RowSetDynaClass rsdc = new RowSetDynaClass(rs);
   rs.close();
   stmt.close();
   ...; //关闭连接返回缓冲池
   List rows = rsdc.getRows();
   ...; // 处理得到的行

  3.BeanUtils.ConvertUtils 介绍
  这个包主要用来转换从request传递过来的函数
  主要函数:
  ConvertUtils().convert(java.lang.Object value) 
  ConvertUtils().convert(java.lang.String[] values, java.lang.Class clazz) 
  ConvertUtils().convert(java.lang.String value, java.lang.Class clazz)
  实现例子:
   HttpServletRequest request = ...;
   MyBean bean = ...;
   HashMap map = new HashMap();
   Enumeration names = request.getParameterNames();
   while (names.hasMoreElements()) {
   String name = (String) names.nextElement();
   map.put(name, request.getParameterValues(name));
   }
   BeanUtils.populate(bean, map);//用ConvertUtils进行转换
  目前支持的转换类型:
  sjava.lang.BigDecimal 
  java.lang.BigInteger 
  boolean and java.lang.Boolean 
  byte and java.lang.Byte 
  char and java.lang.Character 
  java.lang.Class 
  double and java.lang.Double 
  float and java.lang.Float 
  int and java.lang.Integer 
  long and java.lang.Long 
  short and java.lang.Short 
  java.lang.String 
  java.sql.Date 
  java.sql.Time 
  java.sql.Timestamp

commons-beanutils使用的更多相关文章

  1. Apache Commons BeanUtils

    http://commons.apache.org/proper/commons-beanutils/javadocs/v1.9.2/apidocs/org/apache/commons/beanut ...

  2. myeclipse的项目导入到eclipse下,com.sun.org.apache.commons.beanutils.BeanUtils不能导入

    com.sun.org.apache.commons.beanutils.BeanUtils这个包不能引入了怎么办自己下了个org.apache.commons的jar包了之后,改成import or ...

  3. 关闭log4j 输出 DEBUG org.apache.commons.beanutils.*

    2016-03-23 10:52:26,860 DEBUG org.apache.commons.beanutils.MethodUtils - Matching name=getEPort on c ...

  4. Apache Commons Beanutils对象属性批量复制(pseudo-singleton)

    Apache Commons Beanutils为开源软件,可在Apache官网http://commons.apache.org/proper/commons-beanutils/download_ ...

  5. Commons Beanutils使用setProperty() - 就是爱Java

    有时不能只依靠getter/setter操作bean,如:需要名字动态取得的,或是访问bean内的field,甚至是集合或数组内bean的field,利用反射机制对bean的field进行处理,这时候 ...

  6. org.apache.commons.beanutils.BeanMap简单使用例子

    一.org.apache.commons.beanutils.BeanMap; 将一个java bean允许通过map的api进行调用, 几个支持的操作接口: Object get(Object ke ...

  7. 对于Java Bean的类型转换问题()使用 org.apache.commons.beanutils.ConvertUtils)

    在进行与数据库的交互过程中,由数据库查询到的数据放在 map 中,由 map 到 JavaBean 的过程中可以使用 BeanUtils.populate(map,bean)来进行转换 这里要处理的问 ...

  8. Apache Commons Beanutils 三 (BeanUtils、ConvertUtils、CollectionUtils...)

    前言 前面已经学习了Apache Commons Beanutils包里的PropertyUtils和动态bean,接下来将学习剩下的几个工具类,个人觉得还是非常实用的,特别是CollectionUt ...

  9. Apache Commons Beanutils 二 (动态Bean - DynaBeans)

    相关背景 上一篇介绍了PropertyUtils的用法,PropertyUtils主要是在不修改bean结构的前提下,动态访问bean的属性: 但是有时候,我们会经常希望能够在不定义一个Java类的前 ...

  10. Apache Commons Beanutils 一 (使用PropertyUtils访问Bean属性)

    BeanUtils简要描述 beanutils,顾名思义,是java bean的一个工具类,可以帮助我们方便的读取(get)和设置(set)bean属性值.动态定义和访问bean属性: 细心的话,会发 ...

随机推荐

  1. 游览器保存密码和自动填充密码的困惑 (browser save password and auto fill password )

    原文 refer : http://www.cnblogs.com/happyfreelife/p/4240100.html 当一个带有username and password 的表单被提交, 游览 ...

  2. ~/.bashrc的常用alias设置

    centos6.5系统中,alias定义在/etc/bashrc,分别写在/etc/profile.d/*.sh中,可以在此目录添加my.sh, alias attrib='chmod'alias c ...

  3. 【转】C++读写二进制文件

    原文网址:http://blog.csdn.net/lightlater/article/details/6364931 摘要: 使用C++读写二进制文件,在开发中操作的比较频繁,今天有幸找到一篇文章 ...

  4. HDU_1230——火星A+B,加法进制问题

    Problem Description 读入两个不超过25位的火星正整数A和B,计算A+B.需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数.例如:地球上的10进制数2,在火星上 ...

  5. 大型分布式C++框架《二:大包处理过程》

    本来这一篇是打算写包头在分布式平台中的具体变换过程的.其实文章已经写好了.但是想了这个应该是不能随便发表的.毕竟如果知道了一个包的具体每个字节的意义.能伪造包来攻击系统.其次来介绍一个包的具体变换过程 ...

  6. 创建第一个freemarker

    1.创建java项目TestFreeMarker 2.导入包freemarker.jar,添加依赖 3.在根目录下创建一个文件夹templates 4.在文件夹templates下创建文件a.ftl ...

  7. yii 笔记

    Yii1.1: $_GET 可以表示为 Yii::app()->request->getQuery() $_POST 可以表示为 Yii::app()->request->po ...

  8. SD卡中FAT32文件格式高速入门(图文具体介绍)

    说明: MBR :Master Boot Record ( 主引导记录) DBR :DOS Boot Record ( 引导扇区) FAT :File Allocation Table ( 文件分配表 ...

  9. 计算机网络VLAN学习

    首先要搞明白VLAN的由来,为什么会产生这样一种技术.这得从计算机网络的数据交换说起,最开始,我们的网络处于蛮荒时代,数据是怎么交换的,就是简单的介质共享,大家都接到一条线路上,然后互相发数据,这个必 ...

  10. Ubuntu 14.04 下手动安装Firefox的Flash插件

    有时候我们不得不採用手动安装一些软件. Ubuntu 14.04 下手动安装Firefox的Flash插件有下面几步 1. 下载Flash插件 下载地址为http://get.adobe.com/cn ...