一,概述
程序中对JavaBean的操作还是相当频繁的,但是总有那么一些好用到爆炸的开源组件,为无数开发者提供便利.今天就记一下BeanUtils组件的简单用法.BeanUtils是Apache提供的开源组件,主要就是为了简化对JavaBean的操作.
二,使用
开发者去官网下载相应的组件,将commons-beanutils-1.8.3.jar 和commons-logging-1.1.3.jar一起导入到项目中即可使用.需要注意的是,前面那个jar包是依赖后那个日志jar包的,少了日志jar包程序会报错的.
三,基本用法
1)Admin.java是一个标准的JavaBean类,有userName pwd age(类型:String String int) 三个属性如果对JavaBean定义不熟悉的话,参考这篇关于JavaBean的文章.
@Test
public void test1() throws Exception{
Admin ad=new Admin();
//ad.setUserName("erqiu");
//ad.setPwd("123456");
//BeanUtils组件实现对象属性的赋值:下面两者实现的效果是一样的
BeanUtils.copyProperty(ad, "userName", "bighuan");
BeanUtils.setProperty(ad, "age", 21);
//总结:对于基本数据类型,会自动进行类型转换
//拷贝对象
Admin newAdmin=new Admin();
BeanUtils.copyProperties(newAdmin, ad);
//map数据拷贝到对象中
Admin mapAdmin=new Admin();
Map<String , Object> map=new HashMap<String , Object>();
map.put("userName", "ergou");
map.put("age", 32);//map中的key要与javabean一样
BeanUtils.populate(mapAdmin, map);
}
BeanUtils底层就是通过反射来为属性赋值,所以前面才会强调Admin.java是一个标准的javabean类,如果不是javabean的话,是很有可能出错的.在贴的代码中都有注释,就不解释了,有看官看的话,自己运行看看效果即可知道用法.
2)对于某些特殊类型的属性,直接使用BeanUtils对属性赋值是会保错的.这时就需要自定义转换器或者使用BeanUtils提供的转换器了.
在Admin.java中增加一个birth属性,birth是Date(java.util.Date)类型,生成相应的setter和getter方法.
a)自定义日期类型转换器
/**
* 自定义日期类型转换器
* @throws Exception
*/
@Test
public void test2() throws Exception{
//注册日期类型转换器:自定义方式
//static void register(Converter converter, Class clazz)
ConvertUtils.register(new Converter() {
//转换的内部实现方法,需要重写
@Override
public Object convert(Class type, Object value) {
//判断
if(type != Date.class){
return null;
}
if(value == null || "".equals(value.toString().trim())){
return null;
}
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
try {
return sdf.parse(value.toString());
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
}, Date.class);
String userName="bighuan";
int age=21;
String birth="1995-09-23";
//String birth=null;
Admin admin=new Admin();
BeanUtils.copyProperty(admin, "userName", userName);
BeanUtils.copyProperty(admin, "age", age);
BeanUtils.copyProperty(admin, "birth", birth);
System.out.println(admin.toString());
}
看代码,不解释,因为感觉没什么可说的...
b)使用BeanUtils组件提供的转换类
@Test
public void test3() throws Exception {
// 注册日期类型转换器:自定义方式
// static void register(Converter converter, Class clazz)
// 这种方式"" " "不能处理
ConvertUtils.register(new DateLocaleConverter(), Date.class);
String userName = "bighuan";
int age = 21;
String birth = "1995-09-23";
// String birth=" ";
Admin admin = new Admin();
BeanUtils.copyProperty(admin, "userName", userName);
BeanUtils.copyProperty(admin, "age", age);
BeanUtils.copyProperty(admin, "birth", birth);
System.out.println(admin.toString());
}
//DateLocaleConverter()没有对空串""空格" "空等做处理,当这些情况出现时,程序会崩溃掉.自定义的日期类型转换器是做了处理的,看见了吗?
四,应用
在Servlet中接受表单提交过来的数据时,经常需要一个一个拿出来,然后封装到一个javabean中,挺繁琐的.通过BeanUtils,真的简单了许多.为什么?你看一下下面的代码量...
/**
* 处理请求数据的封装
*/
public static <T> T copyToBean(HttpServletRequest request, Class<T> clazz) {
try {
// 创建对象
T t = clazz.newInstance();
BeanUtils.populate(t, request.getParameterMap());
return t;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
解释一下,clazz就是我们javabean的.class,在Servlet中通过request.getParameterMap()将所有数据拿到,返回一个map,然后将map中的数据拷贝到对象中,也就是我们的javabean中.真的是简便了许多操作啊,开源就是厉害啊...
五,总结
我的总结一般都是说再见...再见啦,下篇博客见...