Apache Commons BeanUtils包学习(2)-beanutils.PropertyUtils, beanutils.DynaBean

原文:http://space.itpub.net/7191730/viewspace-446960#xspace-tracks

1.简介
在一般的写bean组件的时候,都必须要写setter和getter方法,当然如果我们事先已经知道bean的相关属性和方法,写bean是比较简单的,但是组件太多的时候,重复编写常常是枯燥乏味令人厌烦的。但当有些时候我们需要调用动态对象 的属性的时候,我们应该怎么来设定和获取对象的属性呢?BeanUtils就可以帮助我们来解决这个问题。它需要Collections包和logging包的支持。


2.已经使用BeanUtils的事例
*构建和java 对象模型交互的脚本语言,比如Bean Scripting Framework
*构建web 层显示和相似用途的模板语言处理器,如jsp或者Velocity
*构建适用于jsp和xsp环境的自定义标签库,如Jakarta Taglibs,Struts,Cocoon
*处理基于xml的配置资源文件,如Ant创建脚本,应用程序部署文件和Tomcat的xml配置文件


3.API简介
BeanUtils 的 Java API 主要的 package 总共四个
org.apache.commons.beanutils 这个是BeanUtils最基本的包,提供了处理getter和setter方法属性的类
org.apache.commons.beanutils.converters :Converter接口的标准实现,在启动的时候和ConvertUtils一同注册
org.apache.commons.beanutils.locale :组件的本地化处理包
org.apache.commons.beanutils.locale.converters :LocaleConverter接口的标准实现,启动的时候和LocaleConvertUtils 一同注册


4.org.apache.commons.beanutils介绍
这四个包本专题只介绍这一个,其他的使用的时候请自己参考它的文档,文档内容写得很好.
 1.PropertyUtils (Set时不能自动进行类型转换 )
 它支持三种类型的属性值-Simple(简单属性),Indexed(数组属性),Mapped(Map属性)
 我们先创建一个简单的bean
     public class Employee {

        private Map address;

        Private Employee[] subordinate;

        private String firstName;

        private String lastName;

        public Address getAddress(String type);
        public void setAddress(String type, Address address);
        public Employee getSubordinate(int index);
        public void setSubordinate(int index, Employee subordinate);
        public String getFirstName();
        public void setFirstName(String firstName);
        public String getLastName();
        public void setLastName(String lastName);
    }


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


 2)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);//根据索引 值取的属性值


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


4)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的属性集来实现

 1)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");


 2)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();
 4)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();
    ...;                   // 处理得到的行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值