BeanUtils工具由Apache软件基金组织编写,提供给我们使用,主要解决的问题是:把对象的属性数据封装到对象中。在整个J2EE的编程过程中,我们经常会从各种配置文件中读取相应的数据,需要明白的一点是从配置文件中读取到的数据都是String,但是很显然我们的应用程序中不仅仅有String一种数据类型,比如:基本数据类型(int、double、char、float等),还有自定义数据类型(引用数据类型),那么我们必须面临的一个问题就是讲字符串类型转换为各种具体的数据类型

有两种方法供我们是使用:

  • 首先判断需要的数据类型,然后对字符串类型调用相应的方法,将其转换为我们想要的类型

  • 使用BeanUtils工具

第一种存在的问题是太过于繁琐,每次都要进行大量的类型转换,Apache软件基金会给我们提供了第二种方法,使用其提供的BeanUtils工具,具体的说只需要知道其中的两个方法就能实现类型的转换,很简单,降低了编程的难度。


很明显,要想使用别人开发的工具必须将其jar包导入到程序中,但是BeanUtils包存对另外一个软件包的依赖,下面将具体的显示jar包的名字,其中的版本号不一定与我使用的相同。


Beanutils工具在使用时几乎只用到以下几个方法,其中一个方法通常情况下都是使用匿名内部类。

  • BeanUtils.setProperty(bean, name, value);其中bean是指你将要设置的对象,name指的是将要设置的属性(写成”属性名”),value(从配置文件中读取到到的字符串值)
  • BeanUtils。copyProperties(bean, name, value),和上面的方法是完全一样的。使用哪个都可以
  • ConvertUtils.register(Converter converter , ..),当需要将String数据转换成引用数据类型(自定义数据类型时),需要使用此方法实现转换。
  • BeanUtils.populate(bean,Map),其中Map中的key必须与目标对象中的属性名相同,否则不能实现拷贝。
  • BeanUtils.copyProperties(newObject,oldObject),实现对象的拷贝

自定义数据类型使用BeanUtils工具时必须具备的条件

自定义数据类型使用BeanUtils工具时,本身必须具备getter和setter方法,因为BeanUtils工具本身也是一种内省的实现方法,所以也是借助于底层的getter和setter方法进行转换的。

封装成javabean的对象

 public class Emp {
private int id ;
private String name;
public Emp(int id, String name, double salary, Date date) {
super();
this.id = id;
this.name = name;
this.salary = salary;
this.date = date;
} private double salary;
private Date date; public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Emp() { } public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
} @Override
public String toString() {
// TODO Auto-generated method stub
return "编号:"+this.id+" 姓名:"+this.name+" 工资:"+this.salary+" 生日:"+date;
} }

使用BeanUtils组件进行转换

 /**
* BeanUtils工具的使用
* 功能:BeanUtils主要是用于将对象的属性封装到对象中
* BeanUtils的好处:
* BeanUtils设置属性值的时候,如果属性是基本数据类型,那么BeanUtils会自动帮我们进行数据类型的转换,并且
* BeanUtils设置属性的时候也是依赖于底层的getter和setter方法
*
* 如果设置的属性值是其他的引用数据类型,此时必须要注册一个类型转换器才能实现自动的转换
* */ import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; import javax.xml.crypto.Data; import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter; public class BeanUtils {
public static void main(String[] args) throws IllegalAccessException, InvocationTargetException {
//从文件中读取到的数据都是字符串的数据,或者是表单提交的数据获取到的时候也是字符串数据
//在J2EE的编程中,我们会通过配置文件或者直接从文件获取数据的方式得到我们想要的数据
//那么就存在一个问题,当我们需要的是一个int时,读到的数据确是String,那么我们每次是不是都要先判断实际
//需要的是什么数据类型,然后进行一个强制的类型转换呢?回答是不需要,我们借助Apache软件基金会提供的BeanUtils工具
//根本不用管什么样的数据类型,只需要使用BeanUtils的setProperties方法,该方法有三个参数,对三个参数进行设置便会
//实现自动的数据类型转换 /*ConvertUtils.register(new Converter() { //自定义日期类型转换器
@Override
public Object convert(Class type, Object value) { //type:目前需要转换的数据类型 value:目前参数的值
//目标:将字符串转换为日期 if(type != Date.class) return null; if (value == null || "".equals(value.toString().trim())) {
return null;
}
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
Date date = null;
try {
date = dateFormat.parse((String)value);
} catch (ParseException e) {
throw new RuntimeException(e);
}
return date;
}
}, Date.class); //Date.class表示要转换的成引用类型,Date类型不是基本数据类型,所以需要一个转换器进行相应的转换,同样该功能属于BeanUtils
*/ //使用日起转换器工具类
ConvertUtils.register(new DateLocaleConverter(), Date.class); //不灵活,自己实现最好 String id ="110"; //我们用这个三个String类型的属性代表从配置文件中读取到的数据,实际编程过程中这些数据直接从properties文件中读取
String name = "朱君鹏";
String salary = "1000";
// String birthday = "2015年01月30日"; //如果要使用工具中提供的转换器必须要符合一定的格式,像这种格式就不能实现转换
String birthday = "2015-01-30"; //该格式可以实现使用工具提供的转换器类将字符串正确的转换, Emp p = new Emp(); //读取到数据之后,对该对象的属性进行设置,使用BeanUtils工具可以避免强制类型的转换,但是在Emp类中的每个属性都要有getter和setter方法
//因为BeanUtils工具实际上是对内省的封装,使其更加的好用,所以其底层还是依赖getter和setter方法 BeanUtils.setProperty(p, "id", id); //其中p代表的是要设置的对象 BeanUtils.setProperty(p, "name", name); //中间一个参数代表的是要设置的属性 BeanUtils.setProperty(p, "salary", salary); //第三个参数代表的是第二个属性的值 BeanUtils.setProperty(p, "date", birthday); System.out.println(p);
}
}
BeanUtils.populate(bean,Map)
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map<String, String[]> map = request.getParameterMap();
Map<String, String> output = new HashMap<String, String>();
for(Entry<String, String[]> entry : map.entrySet()) {
output.put(entry.getKey(), entry.getValue()[0]);
}
Domain formDomain = new Domain();
ConvertUtils.register(new DateLocaleConverter(), Date.class);
try {
BeanUtils.populate(formDomain, map);
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
System.out.println(formDomain.toString());
}

  

BeanUtils介绍及其使用的更多相关文章

  1. BeanUtils介绍及使用

    JavaBeans事实上有三层含义.首先,JavaBeans是一种规范,一种在Java(包括JSP)中可重复使用的Java组件的技术规范,也可以说成我们常说的接口.其次,JavaBeans是一个Jav ...

  2. java-自定义标签&&JSTL标签库详解

    自定义标签是Jav aWeb的一部分非常重要的核心功能,我们之前就说过,JSP规范说的很清楚,就是Jsp页面中禁止编写一行Java代码,就是最好不要有Java脚本片段,下面就来看一下自定义标签的简介: ...

  3. Java一些七七八八的配置

    mysql驱动配置连接eclipse和控制台(cmd)(JAVA) https://blog.csdn.net/u013000747/article/details/55510671 BeanUtil ...

  4. 利用Common-BeanUtils封装请求参数

    一.BeanUtils介绍 commons-beanutils是利用反射机制对JavaBean的属性进行处理,提供了对于JavaBean的各种处理方法.众所周知,一个JavaBean通常包含了大量的属 ...

  5. JavaWeb学习篇之----自定义标签&&JSTL标签库详解

    今天来看一下自定义标签的内容,自定义标签是JavaWeb的一部分非常重要的核心功能,我们之前就说过,JSP规范说的很清楚,就是Jsp页面中禁止编写一行Java代码,就是最好不要有Java脚本片段,下面 ...

  6. BeanUtils的介绍使用

    BeanUtils工具 在实际的开发中我们经常需要将用户的录入的数据进行封装为对象,那么如果使用反射和内省技术就会变得吃力.因此本节主要给大家讲解一个开源的操作JavaBean的一个工具即BeanUt ...

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

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

  8. BeanUtils: 威力和代价(转载)

    转自:http://blog.sina.com.cn/s/blog_ab3fbf1b0101jbxz.html Apache Jakarta Commons项目非常有用.我曾在许多不同的项目上或直接或 ...

  9. BeanUtils.copyProperties与PropertyUtils.copyProperties用法及区别

    一.简介: BeanUtils提供对Java反射和自省API的包装.其主要目的是利用反射机制对JavaBean的属性进行处理.我们知道,一个JavaBean 通常包含了大量的属性,很多情况下,对Jav ...

随机推荐

  1. [css 揭秘] :CSS揭秘 技巧(五):条纹背景

    条纹背景 https://github.com/FannieGirl/ifannie/问题:条纹背景 在设觉设计中无处不在,我们真的可以用css 创建图案吗? 这一章相对还是比较复杂的哦!一起get. ...

  2. 探究linux设备驱动模型之——platform虚拟总线(三)最终章

    这篇是最终章了,结束这一章后,对于platform平台总线驱动的使用方法应该是能够无压力掌握.但是这一章涉及的内容会比前面两章多一些. 我们会一步一步地来完善上一章的例子.完善的目的是能够在应用层去控 ...

  3. 博弈论(Game Theory) - 04 - 纳什均衡

    博弈论(Game Theory) - 04 - 纳什均衡 开始 纳什均衡和最大最小定理是博弈论的两大基石. 博弈不仅仅是对抗,也包括合作和迁就,纳什均衡能够解决这些问题,提供了在数学上一个完美的理论. ...

  4. 解决E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

    是不是在使用ubuntu的时候特别是安装或更新的时候会出现下面的情况:  E: Could not get lock /var/lib/dpkg/lock - open (11: Resource t ...

  5. POJ 2251 Dungeon Master (三维BFS)

    题目链接:http://poj.org/problem?id=2251 Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  6. Consul 架构(译)

    Consul 架构 此篇文章主要对consul的相关内部技术细节进行简要概述. »术语 代理 - 代理是指consul集群中运行的consul实例,通过执行 consul agent 命令来启动. 代 ...

  7. Pycharm主菜单学习

    “工欲善其事,必先利其器”,这话我一直是这么坚信的! 找到一款顺手称心的工具,拥有它,熟练地使用它! Pycharm据说就是使用Python的一款最好的工具—— 于是,开始了第一步的学习----先从熟 ...

  8. 如何使用openstack OCL

    本节首先讨论 image 删除操作,然后介绍 OpenStack CLI 的使用方法,最后讨如何 Troubleshoot. Web UI 删除 image admin 登录后,Project -&g ...

  9. Linux下的计算器(bc、expr、dc、echo、awk)知多少?

    linux 其他知识目录 原文链接:http://blog.chinaunix.net/uid-24673811-id-1760837.html linux下的三个命令可以用来作计算,下面一一讲解用法 ...

  10. c# 窗体与窗体外的文件互动(拖拽)

    大部分控件都有此事件drag相关. 以picturebox为例: pictureBox1.AllowDrop = true;//此属性需要全打出来,不会自动识别添加 private void pict ...