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);

BeanUtils拷贝对象相关推荐

  1. BeanUtils只拷贝对象中属性值不为null的属性

    文章目录 问题 解决方法1(引入hutool包) 解决方法2新增方法 问题 在使用beanutils的copyProperties时候想如果参数为null的就不进行复制; 解决方法1(引入hutool ...

  2. 50 jQuery拷贝对象与多库共存

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.jQuery拷贝对象 如果想要把某个对象拷贝(合并)给另外一个对象使用,此时使用$.e ...

  3. 利用BeanUtils在对象间复制属性

    commons-beanutils是jakarta commons子项目中的一个软件包,其主要目的是利用反射机制对JavaBean的属性进行处理.我们知道,一个JavaBean通常包含了大量的属性,很 ...

  4. Python天天美味(22) - 拷贝对象(深拷贝deepcopy与浅拷贝copy)

    Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...

  5. Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)

    http://www.jb51.net/article/15714.htm 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝 ...

  6. jQuery学习笔记系列(三)——事件注册、事件处理、事件对象、拷贝对象、多库共存、jQuery插件、toDoList综合案例

    day03 - jQuery 学习目标: 能够说出4种常见的注册事件 能够说出 on 绑定事件的优势 能够说出 jQuery 事件委派的优点以及方式 能够说出绑定事件与解绑事件 能够说出 jQuery ...

  7. BeanUtils.copyProperties(对象A,对象B)

    对于两个实例的复制,如果属性名字相同,则可以通过这个方法来操作,但是在使用的时候,一定要注意BeanUtils用的是哪个包的,因为常用的两个包,都有这个类和对应的方法,而复制方向却相反,所以一定要注意 ...

  8. 对BeanCopier拷贝对象中List类型属性的思考

    背景 最近开发接口过程中,使用BeanCopier拷贝对象,当对象中嵌套自定义对象类型属性的时候, 如果对象名称一致,但是对象类型不一致,拷贝的时候,该属性是会被忽略的,但是当对象中嵌套List集合类 ...

  9. beanutils copyproperties_你还在用BeanUtils进行对象属性拷贝?

    作者:Van_Fan 在做业务的时候,为了隔离变化,我们会将DAO查询出来的DO和对前端提供的DTO隔离开来.大概90%的时候,它们的结构都是类似的:但是我们很不喜欢写很多冗长的b.setF1(a.g ...

最新文章

  1. LSTM模型与前向反向传播算法
  2. 成功案例_网络营销成功案例分析
  3. C# 对轻量级(IoC Container)依赖注入Unity的使用
  4. 织梦cms仿知名吧站长导航网站模板
  5. jQuery 的一个自动向上翻页的效果
  6. 无法设置或未定义null引用的属性innerHTML
  7. Java 获取指定日期的方法汇总
  8. docker视频教程 假装听听 应该还行
  9. RHEL7CentOS7 (精简操作指令)
  10. 2.3.1 TextView(文本框)详解
  11. debian8.4安装sqliteman总结
  12. kubernetesv1.17集群生态搭建笔记
  13. 配置fly.js请求
  14. ISE中FIFO IP核的Standard FIFO和First-word-Fall-Through模式的仿真比较
  15. 计算机 黑屏 显示桌面,电脑开机后显示桌面黑屏了怎么处理啊?
  16. 微信小程序中用户登录和登录态维护
  17. .NET Core中Expression<Func<T,bool>>简洁明了
  18. Rocky——CentOS的延续(原版开发人员)安装与安装后必要操作(个人版)
  19. 傲娇亚马逊AWS与特色中国的四年大博弈
  20. 解决欠拟合和过拟合的几种方法

热门文章

  1. IEC61850概述 (摘抄)
  2. 2021全球人才竞争力指数排名:瑞士居首,中国跻身前40;德科集团与北京外企成立合资公司LHH FESCO | 美通社头条...
  3. error#10052:could not checkout FLEXlm license
  4. 使用Druid,C3P0连接池连接达梦主备集群
  5. AllWinner T113 ddr测试
  6. I/O 虚拟化技术 — IOMMU
  7. 下一次我还来,三星新品发布从未让人失望!
  8. 陶哲轩实分析:数学家对于R和Q集可数性的探究
  9. 数据库如何防范隐私数据被泄漏
  10. Linux系统安装Hexo