一、BeanUtils简介
BeanUtils工具由Apache软件基金组织编写,提供给我们使用
什么是BeanUtils工具
BeanUtils工具是一种方便我们对JavaBean进行操作的工具,是Apache组织下的产品。
二、主要解决的问题是:
把对象的属性数据封装到对象中。
在整个J2EE的编程过程中,我们经常会从各种配置文件中读取相应的数据,需要明白的一点是从配置文件中读取到的数据都是String,但是很显然我们的应用程序中不仅仅有String一种数据类型,比如:基本数据类型(int、double、char、float等),还有自定义数据类型(引用数据类型),那么我们必须面临的一个问题就是将字符串类型转换为各种具体的数据类型,该怎么办呢?有两种方法供我们是使用:
首先判断需要的数据类型,然后对字符串类型调用相应的方法,将其转换为我们想要的类型
使用BeanUtils工具
对于上面提到的两种方法,我们分析第一种存在的问题是太过于繁琐,每次都要进行大量的类型转换,Apache软件基金会给我们提供了第二种方法,使用其提供的BeanUtils工具,具体的说只需要知道其中的两个方法就能实现类型的转换,很简单,降低了编程的难度。
二、BeanUtils工具一般可以方便javaBean的哪些操作
beanUtils 可以便于对javaBean的属性进行赋值。
beanUtils 可以便于对javaBean的对象进行赋值。
beanUtils可以将一个MAP集合的数据拷贝到一个javabean对象中。
三、所需jar包
commons-beanutils-1.9.3.jar
commons-logging.jar
四、BeanUtils主要方法
Beanutils工具在使用时几乎只用到以下几个方法,其中一个方法通常情况下都是使用匿名内部类。
BeanUtils.setProperty(bean, name, value);其中bean是指你将要设置的对象,name指的是将要设置的属性(写成”属性名”),value(从配置文件中读取到到的字符串值)
BeanUtils.copyProperties(bean, name, value),和上面的方法是完全一样的。使用哪个都可以
ConvertUtils.register(Converter converter , ..),当需要将String数据转换成引用数据类型(自定义数据类型时),需要使用此方法实现转换。
BeanUtils.populate(bean,Map),其中Map中的key必须与目标对象中的属性名相同,否则不能实现拷贝。
BeanUtils.copyProperties(newObject,oldObject),实现对象的拷贝
五、使用步骤
1、前提:约定前提: 参数名称 需要和javabean的属性名称保持一致!!!!
2、导包:导入commons-beanutils包与 commons-logging包
3、代码
六、实际应用
1、封装请求参数到JavaBean
约定前提: 请求中的参数名称 需要和javabean的属性名称保持一致!!!!
public static <T>T requestToBean(HttpServletRequest request , Class<T> clazz){
//创建javaBean对象
Object obj=null;
try {
obj=clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
//得到请求中的每个参数
Enumeration<String> enu = request.getParameterNames();
while(enu.hasMoreElements())
{
//获得参数名
String name = enu.nextElement();
//获得参数值
String value = request.getParameter(name);
//然后把参数拷贝到javaBean对象中
try {
BeanUtils.setProperty(obj, name, value);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
return (T)obj;
}
2、把一个javaBean的属性拷贝到另一个javaBean对象中
@Test
public void test2() throws Exception {
// 1.生成对象
Student s1 = new Student();
Student s2 = new Student();
// 2.通过set方法赋值
s1.setId(1);
s1.setName("VN");
// s1.setAge(19);//基本数据类型可以为null,null也能拷贝
s1.setClassID(5);
s1.setBirthday(new Date());// 特殊类型不能为null
// 需求:把s1的属性值拷贝到S2中,注意参数的顺序
BeanUtils.copyProperties(s2, s1);
System.out.println(s1);
System.out.println(s2);
}
3、把一个map集合中的数据拷贝到javaBean中
public static <T> T formToBean(Class<T> clazz , Map formMap ) {
try {
T bean = clazz.newInstance();
BeanUtils.populate(bean, formMap);
return bean;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Test
public void test4() throws Exception {
// 1.生成对象
Map<String, Object> map = new HashMap<String, Object>();
// 2.给一些参数
map.put("id", 2);
map.put("name", "EZ");
map.put("age", 22);
map.put("classID", 3);
map.put("birthday", "1989-01-11");
// 需求:把map的属性值拷贝到S中
ConvertUtils.register(new DateLocaleConverter(), Date.class);
Student formToBean = BeanUtilsTest.formToBean(Student.class, map);
System.out.println(formToBean);
}
4、关于转换器的使用
(1)注册转换器,注册之后BeanUtils会自动进行类型转换
ConvertUtils.register(new DefaultDateConverter(), Date.class);
参数1:XXX转换器
参数2:需要进行转换的类型
(2)自定义转换器
实现org.apache.commons.beanutils.Converter接口的convert方法
例子:将yyyy-MM-dd格式的字符串转换成Date对象的自定义的转换器
class DefaultDateConverter implements Converter {
public Object convert(Class arg0, Object arg1) {
String p = (String) arg1;// 因为已经假定是String类型的日期转成Date对象,因此才直接强制转换了
if (p == null || p.trim().length() == 0) {
return null;
}
try {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
return df.parse(p.trim());
} catch (Exception e) {
return null;
}
}
}