BeanUtils的使用

转载自:https://blog.csdn.net/xxf159797/article/details/53645722

1.commons-beanutils的介绍

commons-beanutils是Apache组织下的一个基础的开源库,它提供了对Java反射和内省的API的包装,依赖内省,其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道一个JavaBean通常包含了大量的属性,

很多情况下,对JavaBean的处理导致了大量的get/set代码堆积,增加了代码长度和阅读代码的难度,现在有了BeanUtils,我们对JavaBean属性的处理就方便很多。

2.BeanUtils的使用

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

commons-beanutils.jar

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

       + "]";

   }

 }

Person.java

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

   }

 }

Demo.java

例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 + "]";

   }

 }

User.java

(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的某个属性赋值,该方法不会抛出异常。

将form封装到bean

导入架包

commons-beanutils-1.8.3.jar

创建一个油条类(工具类)

 import javax.servlet.http.HttpServletRequest;

 import org.apache.commons.beanutils.BeanUtils;

 public class WebUtil {
public static <T>T fillBean(HttpServletRequest request,Class<T> clazz){
try {
T bean = clazz.newInstance();
BeanUtils.populate(bean, request.getParameterMap());//POST方式
return bean;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("封装JavaBean失败");
}
}
}

WebUti.java

直接使用

 ClassA ClassName = WebUtil.fillBean(request, ClassA.class);

TestServlet

[转]BeanUtil使用的更多相关文章

  1. BeanUtil体会

    把字符串(非纯数字组成的字符串,带有字符的那种)拷贝到int属性中,int属性值设为0 把字符串(纯数字组成的),赋值给double类型,可以直接转换,int类型也可以直接转换成double类型 但是 ...

  2. BEANUTIL 对象转JSON

    package cn.com.softmap.cache.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutp ...

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

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

  4. BeanUtil拷贝

    拷贝vo对象 一些查询到的数据很多是不需要的,可以创建vo对象,对需要的对象属性进行拷贝 maven依赖 <dependency> <groupId>org.projectlo ...

  5. 比beanutil更加灵活的dto转换工具dozer

    准确的说,是因为pojo无法一招走天下或者说内外部隔离的原因,所以有些时候,不得不在两个bean之间做copy或者转换映射.对于直接性的属性拷贝beanutil以及能够满足大部分要求,但是如果遇到字段 ...

  6. C#反射——模仿BeanUtil属性复制

    反射工具类请参见:https://www.cnblogs.com/threadj/p/10535796.html using System; using System.Collections.Gene ...

  7. BeanUtil的使用

    融合相同属性的对象 FaultItemDto item = new FaultItemDto(); BeanUtil.copyNotNullProperties(item, detail);

  8. beanUtil

    mvc中,页面传值进来,struts2框架是用modeldriven spingmvc是model 不用框架的话,要手动一个一个的设置,然后在用dao方法与数据库联系 servlet框架有BeanUt ...

  9. (转)beanUtil接口和类(有空的时候去看,到时候删除这个说明)

    Jakarta Commons项目提供了相当丰富的API,我们之前了解到的Commons Lang只是众多API的比较核心的一小部分而已.Commons下面还有相当数量的子项目,用于解决各种各样不同方 ...

  10. 反射 内省 BeanUtil 综合使用

    package com.zsphp.domain; public class User { private String userId; private String userName; privat ...

随机推荐

  1. DFS(深度优先搜索)

    基本概念 深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法. 沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过或者在搜 ...

  2. mybatis用mysql数据库自增主键,插入一条记录返回新增记录的自增主键ID

    今天在敲代码的时候遇到一个问题,就是往数据库里插入一条记录后需要返回这个新增记录的ID(自增主键), 公司框架用的是mybatis的通用Mapper接口,里面的插入方法貌似是不能把新纪录的ID回填到对 ...

  3. react脚手架和深入理解jsx语法

    react的mvc和vue的mvvm vue的mvvm属于双向绑定,view层,model数据层,vm实现双向绑定的控制层 此种模式,再某一类项目种很有优势:管理系统 ( OA, ERP , CRM ...

  4. docker镜像拉取速度过慢的解决

    前提是我们在linux环境下安装好了docker,并且可以正常启动关闭. 当我们对镜像进行拉取的时候,会发现速度非常的慢,停在下面这个界面很久也不动. 解决方法 进入阿里云官网,进入后搜索docker ...

  5. Spring5 of WebClient(转载)

    前言 Spring5带来了新的响应式web开发框架WebFlux,同时,也引入了新的HttpClient框架WebClient.WebClient是Spring5中引入的执行 HTTP 请求的非阻塞. ...

  6. 2016 Google code jam 大赛

    二,RoundC import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundE ...

  7. animate使用方法

    链接:https://www.cnblogs.com/xiaohuochai/p/7372665.html

  8. P1426

    和上次的小鱼题差不多,但多了一些条件. 先把游到 $ s - x $ 米是第 $ a_i $ 秒求出来,然后判断之后在第 $ a_{i + 1} $ 秒内游的距离是否 $ \geq 2x $ ,大于就 ...

  9. Centos610安装MVN

    1.下载mav安装 下载免安装版上传linux cd /opt/maven mkdir repository cd apche-maven-3.3.9/conf vi settings.xml  设置 ...

  10. U2000解决备份:服务器不可达、FTP/TFTP/SFTP IP地址与网管地址不一致

    只需要将一下几点设置到位这些问题基本解决: 设置->网元软件管理->FTP设置 如果你的U2000服务器和OLT都在一个内网,那么就IP1和IP2就都输入U2000服务器的内网IP,否则按 ...