BeanUtils的使用

1.commons-beanutils的介绍

commons-beanutils是Apache组织下的一个基础的开源库,它提供了对Java反射和内省的API的包装,依赖内省,其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致了大量的get/set代码堆积,增加了代码长度和阅读代码的难度,现在有了BeanUtils,我们对JavaBean属性的处理就方便很多。

2.BeanUtils的使用

BeanUtils是commons-beanutils包下的一个工具类,如果想在我们的项目中使用这个类需要导入以下两个jar包:

l commons-beanutils.jar

l commons-logging.jar

下面我们就来练习如何使用BeanUtils,案例详情请参考BeanUtils使用案例详解,点击此处下载案例源代码,具体如下:

(1)创建一个web应用,Example5,将上面说到的两个jar包拷贝的WEB-INF/lib下;

(2)在该应用下的src目录下新建一个Class类,名称为Person,主要代码如例1-1所示:

例1-1 Person.java

public class Person {

private Stringname;

private int age;

private Stringgender;

private boolean bool;

此处省略以上四个属性的get/set方法

@Override

public String toString() {

return "Person [name=" + name + ", age=" + age + ", gender=" + gender

+ "]";

}

}

例1-1中,定义了四个成员变量,并重写了toString()方法。

(3)在src目录下新建一个Class类,名称为Demo,在该类中定义了一个单元测试方法,主要代码如例1-2所示:

例1-2 Demo.java

public class Demo {

@Test

public void fun1() throws Exception{

String className="cn.itcast.domain.Person";

Class clazz=Class.forName(className);

Object bean=clazz.newInstance();

BeanUtils.setProperty(bean, "name", "张三");

BeanUtils.setProperty(bean, "age", "23");

BeanUtils.setProperty(bean, "gender", "男");

BeanUtils.setProperty(bean, "xxx", "XXX");

System.out.println(bean);

}

}

例1-2中,利用反射获得Person类的对象,然后使用BeanUtils类的静态方法setProperty(Object bean,String name,Object value)为指定bean的指定属性赋值。该方法的第一参数是javaBean对象,第二个参数是javaBean的属性,第三个参数是属性的值。

(4)运行Demo类的单元测试方法fun1(),控制台打印结果如图1-1所示:

图1-1 控制台打印结果

图1-1中,Person信息的打印格式是我们再Person类的toString()方法中设置的。

(5)使用BeanUtils的getProperty(Object bean,String name)方法获取指定bean的指定属性值,如例1-3所示:

public class Demo {

@Test

public void fun1() throws Exception{

String className="cn.itcast.domain.Person";

Class clazz=Class.forName(className);

Object bean=clazz.newInstance();

BeanUtils.setProperty(bean, "name", "张三");

BeanUtils.setProperty(bean, "age", "23");

BeanUtils.setProperty(bean, "gender", "男");

BeanUtils.setProperty(bean, "xxx", "XXX");

System.out.println(bean);

String age = BeanUtils.getProperty(bean, "age");

System.out.println(age);

}

}

(6)测试fun1方法,控制台打印结果如图1-2所示:

图1-2 控制台打印结果

以上是通过BeanUtils类的setProperty()和getProperty()方法对javaBean属性的设置和获取;开发中可能会有这样的需求:将表单提交过来的请求参数封装在一个javaBean中,这个时候我们再使用BeanUtils的setProperty()和getProperty()方法就会很麻烦;因此BeanUtils又为我们提供了一个静态方法populate(Object bean,Map properties),其中第二个参数就是封装请求参数的Map,我们可以通过request.getParameterMap()方法获取一个封装了所有请求参数的Map对象。

下面通过一个例子来了解BeanUtils类的populate(Object bean,Map properties)方法,如下所示:

(7)在Example5中创建一个javaBean类,User,主要代码如例1-4所示:

例1-4 User.java

public class User {

private Stringusername;

private String password;

此处省略User类的成员变量的get/set方法

@Override

public String toString() {

return "User [username=" + username + ", password=" + password + "]";

}

}

(8)在Demo类中再定义一个单元测试方法fun2,主要代码如例1-5所示:

例1-5 fun2()方法

@Test

public void fun2() throws Exception {

Map<String,String> map = new HashMap<String,String>();

map.put("username", "zhangSan");

map.put("password", "123");

User user = new User();

BeanUtils.populate(user, map);

System.out.println(user);

}

例1-5中,将map里面的数据封装到javaBean中,这里有一个要求:Map中的key值要与JavaBean中的属性名称保持一致,否则封装不进去。

(9)测试fun2方法,控制台打印结果如图1-3所示:

图1-3 控制台打印结果

现在我们再对BeanUtils进行封装,封装成一个工具类,我们之前也封装过类似的一个工具类,该工具类中提供了一个方法用来获取不重复的32位长度的大写字符串,如下所示:

(10)在Example5中创建一个工具类,名称为CommonUtils,在该类中定义一个方法,用来将map中的数据封装到javaBean中,主要代码如例1-6所示:

例1-6 CommonUtils.java

public class CommonUtils {

/**

* 生成不重复的32位长的大写字符串

@return

*/

public static String uuid() {

return UUID.randomUUID().toString().replace("-","").toUpperCase();

}

/**

* 把map转换成指定类型的javaBean对象

@param map

@param clazz

@return

*/

public static <T> T toBean(Map map, Class<T> clazz) {

try {

/*

* 1. 创建指定类型的javabean对象

*/

T bean = clazz.newInstance();

/*

* 2. 把数据封装到javabean中

*/

BeanUtils.populate(bean, map);

/*

* 返回javabean对象

*/

return bean;

catch(Exception e) {

throw new RuntimeException(e);

}

}

}

例1-6中,CommonUtils定义了一个静态的泛型方法:toBean(Map map,Class<T> clazz),根据传递的参数来判断将map中的数据封装到哪个javaBean中。当中来利用了反射获得指定类型的javaBean对象,然后再调用BeanUtils类的populate()方法。

(11)在Demo类中再定义一个单元测试方法fun3,主要代码如例1-7所示:

例1-7 fun3()方法

@Test

public void fun3() {

Map<String,String> map = new HashMap<String,String>();

map.put("username", "lisi");

map.put("password", "123");

/*

* request.getParameterMap();

*/

User user = CommonUtils.toBean(map, User.class);

System.out.println(user);

}

例1-7中,将map中的数据使用CommonUtils类的toBean()方法封装到user中,然后返回一个user对象。

(12)运行fun3()方法,控制台打印结果如图1-4所示:

图1-4 控制台打印结果

需要注意的是,在使用BeanUtils类的setProperty()、getProperty()和populate()方法时都抛出了异常,我们制作的帮助类需要对异常进行处理,这样在调用这个帮助类的这个方法时就不用再对异常进行处理。另外,在调用BeanUtils的setProperty()方法时,如果设置的属性不存在或者没有给javaBean的某个属性赋值,该方法不会抛出异常。

BeanUtil工具类的使用的更多相关文章

  1. JavaWeb基础Day17 (JSP EL表达式 jstl标签库 beanutil工具类)

    JSP jsp的实质就是指在html界面中嵌入Java代码 jsp脚本 <%  Java代码  %>  相当于写在service方法中. <%=java 变量或者表达式 %> ...

  2. 03-封装BeanUtil工具类(javabean转map和map转javabean对象)

    package com.oa.test; import java.beans.BeanInfo; import java.beans.IntrospectionException; import ja ...

  3. apache-beanutil工具类的使用

    BeanUtil工具类是apache commons中的项目 使用BeanUtil除了需要 commons-beanutils-1.8.3.jar 外,可能需要记录错误日志信息,再加入 commons ...

  4. JSON转换的原创工具类

    进来在项目中总是遇到ArrayList线性表需要转化成JSONArray的场景,或者Java对象和JSON字符串之间的转化问题,于是乎自己写了一个粗糙的工具类,经过初步的测试,暂时还未发现什么bug, ...

  5. Java工具类之Apache的Commons Lang和BeanUtils

    Apache Commons包估计是Java中使用最广发的工具包了,很多框架都依赖于这组工具包中的一部分,它提供了我们常用的一些编程需要,但是JDK没能提供的机能,最大化的减少重复代码的编写. htt ...

  6. spring工具类获取bean

    import org.springframework.web.context.ContextLoader; import org.springframework.web.context.WebAppl ...

  7. BeanUtils工具类copyProperties方法缺点及解决

    使用类为spring-beans:4.3.13release包中的 org.springframework.beans.BeanUtils BeanUtils.copyProperties(Objec ...

  8. hutoolJava工具类的使用

    前言 安装 友情开源项目 Hutool相关博客(软文) 捐赠使用公开 核心(Hutool-core) 克隆 支持泛型的克隆接口和克隆类 类型转换 类型转换工具类-Convert 自定义类型转换-Con ...

  9. Maven基础&&Spring框架阶段常用工具类整理

    常用工具类 1.密码加密工具类: package com.itheima.utils; import java.security.MessageDigest; import sun.misc.BASE ...

随机推荐

  1. C语言——常用标准输入输出函数 scanf(), printf(), gets(), puts(), getchar(), putchar(); 字符串拷贝函数 strcpy(), strncpy(), strchr(), strstr()函数用法特点

    1 首先介绍几个常用到的转义符 (1)     换行符“\n”, ASCII值为10: (2)     回车符“\r”, ASCII值为13: (3)     水平制表符“\t”, ASCII值为 9 ...

  2. LaTeX自定义宏包、类文件的默认搜索路径设置方法

      对于自定义的LaTeX宏包与类,在调用时可以通过在命令\documentclass{}与\usepackage{}命令中指定完整路径或者相对路径,这样确实可以调用,但是编译时总是有烦人的警告信息, ...

  3. updated stream stash changes

    处理的方式非常简单,主要是使用git stash命令进行处理,分成以下几个步骤进行处理. 1.先将本地修改存储起来 $ git stash 这样本地的所有修改就都被暂时存储起来 .是用git stas ...

  4. [2016北京集训试题6]mushroom-[bitset]

    Description Solution bitset是个好东西啊..强行压位什么的真是够orz. 由于所有的蘑菇上房间的长相是一样的,我们针对每个房间,算出它到根节点的bitset和以它为根的子树的 ...

  5. 【HNOI2015】落忆枫音

    题面 题解 求一个有特殊性质的有向图的生成树的个数. 首先,有向图的生成树的个数可以用矩阵树定理,能够得到\(40\)分. 但是如果它是一个\(\mathrm{DAG}\)就很好做,枚举每一个点的父亲 ...

  6. 4513: [Sdoi2016]储能表

    4513: [Sdoi2016]储能表 链接 分析: 数位dp. 横坐标和纵坐标一起数位dp,分别记录当前横纵坐标中这一位是否受n或m的限制,在记录一维表示当前是否已经大于k了. 然后需要两个数组记录 ...

  7. python安装mysql

    一.MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性. 二.最近在学习python语言,总体上面来说还是接触的挺快 ...

  8. 【译】2017年要学习的三个CSS新特性

    这是翻译的一篇文章,原文是:3 New CSS Features to Learn in 2017,翻译的不是很好,如有疑问欢迎指出. 新的一年,我们有一系列新的东西要学习.尽管CSS有很多新的特性, ...

  9. Magic Trackpad 2 on win10 x64

    可以使用操作: 触击 触击拖拽 双击 支手滚动:上下,左右 右键配置:左下角,右下角点击实现 可以试用28天,收费 $9.5 官方地址:http://www.trackpadmagic.com/mag ...

  10. [PLC]ST语言六:DI/EI/FEND/WDT/FOR/NEXT

    一:DI/EI/FEND/WDT/FOR/NEXT 说明:简单的顺控指令不做其他说明. 控制要求:无 编程梯形图: 结构化编程ST语言: