热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Apache的BeanUtils组件学习

1、注意点1.1、使用BeanUtils组件必须引入BeanUtils核心包,还需要引入日志支持包1.2、BeanUtils的copyProperty与setProperty的实现原理-反射1.3、对

1、注意点

1.1、使用BeanUtils组件必须引入BeanUtils核心包,还需要引入日志支持包

1.2、BeanUtils的copyProperty与setProperty的实现原理-反射

1.3、对于基本基本数据类型,会自动进行类型转换

1.4、BeanUtils的populate拷贝map数据到对象中时,map中的key要与javabean的属 性名称一致

1.5、可以与servelt混用,request.getParameterMap()方法会的map集合,再用BeanUtils 的组件直接将map对象保存到javabean中

 

2、BeanUtils组件

2.1、简介

程序中对javabean的操作很频繁, 所以apache提供了一套开源的api,方便对javabean的操作!即BeanUtils组件。

2.2、BeanUtils组件作用

简化javabean的操作!

用户可以从www.apache.org下载BeanUtils组件,然后再在项目中引入jar文件!

 

 

2.3、使用BenUtils组件:

1. 引入commons-beanutils-1.8.3.jar核心包

2. 引入日志支持包: commons-logging-1.1.3.jar

 

2.4、如果缺少日志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)

at

 

3、实例, 基本用法

方法1: 对象属性的拷贝

BeanUtils.copyProperty(admin, "userName", "jack");

BeanUtils.setProperty(admin, "age", 18);

方法2: 对象的拷贝

BeanUtils.copyProperties(newAdmin, admin);

方法3: map数据拷贝到javabean中  

【注意:map中的key要与javabean的属性名称一致】

BeanUtils.populate(adminMap, map);


//1. 对javabean的基本操作
@Test
public void test1() throws Exception {
// a. 基本操作
Admin admin = new Admin();
//admin.setUserName("Jack");
//admin.setPwd("999");
// b. BeanUtils组件实现对象属性的拷贝
BeanUtils.copyProperty(admin, "userName", "jack");
BeanUtils.setProperty(admin, "age", 18);
// 总结1: 对于基本数据类型,会自动进行类型转换!
// c. 对象的拷贝
Admin newAdmin = new Admin();
BeanUtils.copyProperties(newAdmin, admin);
// d. map数据,拷贝到对象中
Admin adminMap = new Admin();
Map map = new HashMap();
map.put("userName", "Jerry");
map.put("age", 29);
// 注意:map中的key要与javabean的属性名称一致
BeanUtils.populate(adminMap, map);
// 测试
System.out.println(adminMap.getUserName());
System.out.println(adminMap.getAge());
}

  

 

4、实例, 日期类型的拷贝

需要注册日期类型转换器,2种方式参见下面代码:

public class App {

//1. 对javabean的基本操作
@Test
public void test1() throws Exception {
// a. 基本操作
Admin admin = new Admin();
//admin.setUserName("Jack");
//admin.setPwd("999");
// b. BeanUtils组件实现对象属性的拷贝
BeanUtils.copyProperty(admin, "userName", "jack");
BeanUtils.setProperty(admin, "age", 18);
// 总结1: 对于基本数据类型,会自动进行类型转换!
// c. 对象的拷贝
Admin newAdmin = new Admin();
BeanUtils.copyProperties(newAdmin, admin);
// d. map数据,拷贝到对象中
Admin adminMap = new Admin();
Map map = new HashMap();
map.put("userName", "Jerry");
map.put("age", 29);
// 注意:map中的key要与javabean的属性名称一致
BeanUtils.populate(adminMap, map);
// 测试
System.out.println(adminMap.getUserName());
System.out.println(adminMap.getAge());
}
//2. 自定义日期类型转换器
@Test
public void test2() throws Exception {
// 模拟表单数据
String name = "jack";
String age = "20";
String birth = " ";
// 对象
Admin admin = new Admin();
// 注册日期类型转换器: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(admin, "userName", name);
BeanUtils.copyProperty(admin, "age", age);
BeanUtils.copyProperty(admin, "birth", birth);
//------ 测试------
System.out.println(admin);
}
//2. 使用提供的日期类型转换器工具类
@Test
public void test3() throws Exception {
// 模拟表单数据
String name = "jack";
String age = "20";
String birth = null;
// 对象
Admin admin = new Admin();
// 注册日期类型转换器:2, 使用组件提供的转换器工具类
ConvertUtils.register(new DateLocaleConverter(), Date.class);
// 把表单提交的数据,封装到对象中
BeanUtils.copyProperty(admin, "userName", name);
BeanUtils.copyProperty(admin, "age", age);
BeanUtils.copyProperty(admin, "birth", birth);
//------ 测试------
System.out.println(admin);
}
}

  

5、应用

public class WebUtils {

@Deprecated
public static T copyToBean_old(HttpServletRequest request, Class clazz) {
try {
// 创建对象
T t = clazz.newInstance();
// 获取所有的表单元素的名称
Enumeration enums = request.getParameterNames();
// 遍历
while (enums.hasMoreElements()) {
// 获取表单元素的名称:
String name = enums.nextElement(); // pwd
// 获取名称对应的值
String value = request.getParameter(name);
// 把指定属性名称对应的值进行拷贝
BeanUtils.copyProperty(t, name, value);
}
return t;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 处理请求数据的封装
*/
public static T copyToBean(HttpServletRequest request, Class clazz) {
try {
// (注册日期类型转换器)
// 创建对象
T t = clazz.newInstance();
BeanUtils.populate(t, request.getParameterMap());
return t;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}


 
推荐阅读
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
author-avatar
尚艺李波_387
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有