BeanUtils组件
简介
程序中对javabean的操作很频繁,所有Apache提供了一套开源的api,方便对javabean的操作,即BeanUtils组件,作用是简化javabean的操作。可以从 http://www.apache.org/ 下载组件,然后在项目中引入jar文件。
使用BeanUtils组件的步骤
1.引入BeanUtils包commons-beanutils-1.8.3.jar 点击打开链接
2.引入日志支持包commons-logging-1.1.3.jar 点击打开链接
如果缺少日志jar包,则报错:
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at org.apache.commons.beanutils.ConvertUtilsBean.<init>(ConvertUtilsBean.java:157)
at org.apache.commons.beanutils.BeanUtilsBean.<init>(BeanUtilsBean.java:117)
at org.apache.commons.beanutils.BeanUtilsBean$1.initialValue(BeanUtilsBean.java:68)
基本用法
1.对象属性的拷贝
User user2 = new User();
BeanUtils.copyProperty(user2, "userName", "mary");//注意这里的userName是setXXXX()方法后面的xXXX,而不是属性名称
2.对象的拷贝
User newUser = new User();
BeanUtils.copyProperties(newUser, user2);
3.map数据拷贝到JavaBean中
Map<String, Object> userMap = new HashMap<String, Object>();
userMap.put("userName", "hello");// 注意这里的key值必须是setXXXX()方法后面的xXXX,而不是属性名称
userMap.put("pwd", "wwww");
userMap.put("age", 56);
User user3 = new User();
@Test
public void test1() throws Exception {
//1.基本操作
User user = new User();
user.setUserName("jack");
user.setPwd("888888");
user.setAge(24);
User user2 = new User();
//2.BeanUtils组件实现对象属性的拷贝
BeanUtils.copyProperty(user2, "userName", "mary");//注意这里的userName是setXXXX()方法后面的xXXX,而不是属性名称
BeanUtils.setProperty(user2, "pwd", "666666");
BeanUtils.copyProperty(user2, "age", 25);
BeanUtils.copyProperty(user2, "birthday", new Date());
//总结1:对于基本数据类型,会自动进行数据类型转换
//3.对象的拷贝
User newUser = new User();
BeanUtils.copyProperties(newUser, user2);
//4.map数据,拷贝到对象中
Map<String, Object> userMap = new HashMap<String, Object>();
userMap.put("userName", "hello");// 注意这里的key值必须是setXXXX()方法后面的xXXX,而不是属性名称
userMap.put("pwd", "wwww");
userMap.put("age", 56);
User user3 = new User();
BeanUtils.populate(user3, userMap);
//测试
System.out.println(user3.getUserName());
System.out.println(user3.getPwd());
System.out.println(user3.getAge());
}
日期类型的拷贝(类型转换器)
注意:表单数据提交过来的数据一般都是字符串,当需要拷贝到的对象是日期类型时,直接拷贝会出错,需要注册日期类型转换器。
1.自定义日期类型转换器(推荐)
2.使用提供的日期类型转换器工具类(对""等不能做出判断,会报错,如果传入的字符串有特殊情况,须用自定义日期类型转换器 )
/**
* 日起类型转换器
* @throws Exception
*/
@Test
public void test2() throws Exception {
//模拟表单数据
String userName = "jack";
String pwd = "2222";
String age = "33";
String birthday = " 2017-3-30 08:20:38 ";
//对象
User user = new User();
//注册日期类型转换器
//1.自定义日期类型转换器
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;
try {
//字符串转换为日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.parse(value.toString());
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}, Date.class);
//把表单提交的数据,封装到对象中
BeanUtils.copyProperty(user, "userName", userName);
BeanUtils.copyProperty(user, "pwd", pwd);
BeanUtils.copyProperty(user, "age", age);
BeanUtils.copyProperty(user, "birthday", birthday);
System.out.println(user);
}
/**
* 使用提供的日期类型转换器工具类
* 缺点:对""等不能做出判断,会报错,如果传入的字符串有特殊情况,须用自定义日期类型转换器
* @throws Exception
*/
@Test
public void test3() throws Exception {
//模拟表单数据
String userName = "jack";
String pwd = "2222";
String age = "33";
String birthday = "2017-3-30";
//对象
User user = new User();
//使用组件提供的转换器工具类
ConvertUtils.register(new DateLocaleConverter(), Date.class);
//把表单提交的数据,封装到对象中
BeanUtils.copyProperty(user, "userName", userName);
BeanUtils.copyProperty(user, "pwd", pwd);
BeanUtils.copyProperty(user, "age", age);
BeanUtils.copyProperty(user, "birthday", birthday);
System.out.println(user);
}
BeanUtils组件封装表单请求数据
抽出封装数据的工具类
package com.cn.Util;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.beanutils.BeanUtils;
public class WebUtils {
/**
* 处理请求数据的封装,方式1
* @param request
* @param clazz
* @return
*/
public static <T> T parameters2bean(HttpServletRequest request,Class<T> clazz){
try {
//创建对象
T t = clazz.newInstance();
//(注册日期类型转换器)
//获取所有的表单元素的名称
Enumeration<String> parameterNames = request.getParameterNames();
//遍历
while(parameterNames.hasMoreElements()){
//获取表单元素的名称
String name = parameterNames.nextElement();
//获取表单元素名称对应的值
String value = request.getParameter(name);
//把指定属性名称对应的值进行拷贝
BeanUtils.copyProperty(t, name, value);
}
return t;
}catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 处理请求数据的封装,方式2
* @param request
* @param clazz
* @return
*/
@Deprecated
public static <T> T parameters2bean_old(HttpServletRequest request,Class<T> clazz){
try {
//创建对象
T t = clazz.newInstance();
Map<String, String[]> map = request.getParameterMap();
BeanUtils.populate(t, map);
return t;
}catch (Exception e) {
throw new RuntimeException(e);
}
}
}
调用工具类封装数据
//封装数据
User user = WebUtils.parameters2bean(request, User.class);
User user = WebUtils.parameters2bean_old(request, User.class);