设为首页 收藏本站
查看: 1118|回复: 0

[经验分享] Apache Commons BeanUtils包学习(2)-beanutils.PropertyUtils, beanutils.DynaBean

[复制链接]
累计签到:3 天
连续签到:1 天
发表于 2015-11-14 09:44:43 | 显示全部楼层 |阅读模式
  原文: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();
    ...;                   // 处理得到的行

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-139032-1-1.html 上篇帖子: 使用 APACHE COMMON DBCP +COMMON POOL+MYSQL连接无效的问题 下篇帖子: Apache Httpd的mod_proxy模块修改了HTTP的响应吗
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表