返回

BeanUtils组件

发布时间:2023-11-27 00:12:24 195


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.(ConvertUtilsBean.java:157)
at org.apache.commons.beanutils.BeanUtilsBean.(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 userMap = new HashMap();



        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 userMap = new HashMap();
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 parameters2bean(HttpServletRequest request,Class clazz){
try {
//创建对象
T t = clazz.newInstance();

//(注册日期类型转换器)

//获取所有的表单元素的名称
Enumeration 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 parameters2bean_old(HttpServletRequest request,Class clazz){
try {
//创建对象
T t = clazz.newInstance();
Map 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);
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
uniapp如何跳转外部链接例如百度? 2023-11-26 21:11:52