分享
 
 
 

Jakarta Commons BeanUtils(转)

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

1.简介

在一般的写bean组件的时候,都必须要写setter和getter方法,当然假如我们事先已经知道bean的相关属性和

方法,写bean是比较简单的,但是组件太多的时候,重复编写经常是枯燥乏味令人厌烦的。但当有些时候我么需

要调用动态对象的属性的时候,我们应该怎么来设定和获取对象的属性呢?BeanUtils就可以帮助我们来解决这

个问题。它需要Collections包和logging包的支持。最新版本1.7,文档还是1.6.1的.

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

它支持三种类型的属性值-Simple,Indexed,Mapped

我们先创建一个简单的bean

public class Employee {

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

}

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

...; // 处理得到的行

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

5.参考资料或文章:

*http://jakarta.apache.org/commons/beanutils/api/index.Html

*http://jakarta.apache.org/commons/beanutils/index.html

*http://apache.Linuxforum.net/dist/jakarta/commons/beanutils/binaries/commons-beanutils-1.6.1.zip

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有