BeanUtils拷贝对象(浅拷贝)
拷贝的实现方法是将源bean(也可以是Map)中的每个element在转换器(Converter,官方已经提供一些默认的类型间转换器)
的帮助下实现一些类型的转换
,将转换的结果设置到目标bean对应的属性中,只要属性名相同
就可以从源bean中拷贝值到目标bean中
1. BeanUtils.populate(Object bean,Map properties)
将请求的Map封装为bean对象(JavaBean)
常用在将form表单提交给servlet程序,对数据进行封装,封装到Person对象中
apache的javadoc中,明确指明这个方法是为解析http请求参数特别定义和使用的,在正常的使用中不推荐使用
JSP页面
<body>
<!-- 使用BeanUtils将form参数封装到 JavaBean Person对象中 -->
<!-- "/megustas/demo"为封装数据的Servlet的url -->
<form action="/megustas/demo" method="post">
姓名 <input type="text" name="name" /> <br/>
城市 <input type="text" name="city" /> <br/>
爱好 <input type="text" name="hobby" /> <br/>
年龄 <input type="text" name="age" /><br/>
<input type="submit" value="提交" /><!-- 点击提交,提交的数据即是类中需要的属性 -->
</form>
</body>
JavaBean
public class Person {
private String name;
private String city;
private String hobby;
private int age;
...
}
Servlet
public class DemoServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");// 处理乱码
// 将form参数 自动封装 Person对象
Person person = new Person();
try {
BeanUtils.populate(person, request.getParameterMap());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//检验是否封装到person对象中
System.out.println(person.getName());
System.out.println(person.getCity());
System.out.println(person.getHobby());
System.out.println(person.getAge());
System.out.println(person.getBirthday());
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
2. BeanUtils.copyProperties(Object dest, Object orig)
将orig中的成员变量的值复制给dest
实体间拷贝
User user = new User();
user.setName("张三");
user.setAge(24);
User user2 = new User();
BeanUtils.copyProperties(user2, user);
System.out.println(user2);//User [name=张三, age=24]
map和实体间的拷贝
User user3 = new User();
Map<String,Object> map = new HashMap<String, Object>();
map.put("name", "李四");
map.put("age", 12);
//把map中的元素拷贝到对象中去(不能把对象放到map中去)
BeanUtils.copyProperties(user3, map);
System.out.println(user3);//User [name=李四, age=12]
3.Converter转换器
当有需要自定义或扩展的Converter 的时候可以通过注册自定义的转换器来实现
例如Beanutil自带的DateConverter不支持String到java.util.Date的转换
,通过扩展DateConverter就可以实现支持
注意:
Converter 是注册在classloader一级的,也就是说在一个class loader中同一时间只能有一个转换器起作用
(BeanUtils的copyProperties和populate会依据目标bean属性的类型来决定启用那个转换器)
自定义一个转换器
public class Str2DateConverter implements Converter {
/**
* 将value转换成type类型的值
* @param type 要转换成的类型
* @parem value 被转换的值
* @return 转换以后的结果
*/
public Object convert(Class type, Object value) {
if(value instanceof String){
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = (String) value;
//将String解析为 指定Date格式
Date date = null;
try {
date = dateFormat.parse(dateStr);
} catch (ParseException e) {
throw new RuntimeException("转换失败",e);
}
return date;
}
return null;
}
注册转换器
//ConvertUtils.register(转换器, 目标类型.class),所有目标类型数据都会进行转换
String birthdayStr = "1991-01-01";
Person p = new Person();
ConvertUtils.register(new Str2DateConverter(), Date.class);
BeanUtils.setProperty(p, "birthday", birthdayStr);
System.out.println(p);//birthday = Tue Jan 01 00:00:00 CST 1991
使用默认转换器
package org.apache.commons.beanutils.converters
convertUtils.register(new DateConverter(), Date.class);
convertUtils.register(new BooleanConverter(null), Boolean.class);
convertUtils.register(new LongConverter(null), Long.class);
convertUtils.register(new IntegerConverter(null), Integer.class);
convertUtils.register(new DoubleConverter(null), Double.class);