Beanutils个人见解
1.简单制作自动封装数据的工具类
需求:使用一个类的setXXX方法封装数据,有多少个成员变量,就需要调用多少次方法,操作繁琐。
希望:可以通过一个工具类,将我要封装的数据,通过一次代码书写,就封装好。
分析实现的步骤:
1 需要一个容器,保存数据(集合 map){name=张三,age=18},因为存入map集合中的数据,有关联关系。
2 准备一个Person对象,用来封装数据
3 制作一个工具类,帮助我么自动封装数据(BeanUtils)
测试方法代码:
工具类的实现思路:
A 获取对象的Class
B 根据Class获取所有的成员变量
C 循环字段和集合,判断当前字段名称和map集合key值是否一致
D 如果一致,取现java语言访问检查,然后封装数据
工具类
package cn.itcast.utils;
import java.lang.reflect.Field;
import java.util.Map;
import org.junit.Test;
/**
* @author DELL
* 自制工具类:
* 功能要求:能够将用户数据一次性封装,不用通过set方法将每一个字段都设置一遍
* 如何实现:通过反射,可以得到所有的字段,得到所有就可以遍历,遍历的时候就可以依次添加字段
*/
public class BeanUtils {
/**该工具类需要的参数:
* 已经封装了参数的Map集合
* 需要被封装数据的对象Person
*
*/
@Test
public void pupulate(Map
map,Object o){
Class
clazz = o.getClass();
Field[] fields = clazz.getDeclaredFields();
for(Field field:fields){
//将map集合中的数据取出封装到对象p中
for(String key:map.keySet()){
if(field.getName().equals(key)){
//修改字段的访问权限
field.setAccessible(true);
try {
//给字段赋值
field.set(o,map.get(key));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
package cn.itcast.test;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
import org.junit.Test;
import cn.itcast.domin.Person;
import cn.itcast.utils.BeanUtils;
import cn.itcast.utils.MyConverter;
/**
* @author DELL
*
*/
public class Exercise {
//回顾反射的功能,获取类中的成员变量
@Test
public void test1(){
//通过getClass方法获取person类中的成员变量
Class clazz=Person.class;
Field[] fields = clazz.getDeclaredFields();
for(Field field:fields){
System.out.println(field.getName());
}
}
/** 测试自制工具类:
* 功能要求:能够将用户数据一次性封装,不用通过set方法将每一个字段都设置一边
* 如何实现:通过反射,可以得到所有的字段,得到所有就可以遍历,遍历的时候就可以依次添加字段
*/
@Test
public void test2(){
/*注册的时候从页面获取的数据,有一个得到所有参数的map集合的方法Map
parameterMap
= request.getParameterMap();可以通过该方法获取参数,在遍历反射得到的字段的时候,将map集合中的
数据遍历添加到字段中*/
HashMap map = new HashMap();
map.put("name","小明");
map.put("age","18");
//通过反射添加获取字段
Person p = new Person();
Class
clazz = p.getClass();
Field[] fields = clazz.getDeclaredFields();
for(Field field:fields){
//将map集合中的数据取出封装到对象p中
for(Object key:map.keySet()){
if(field.getName().equals(key)){
//修改字段的访问权限
field.setAccessible(true);
try {
//给字段赋值
field.set(p,map.get(key));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
System.out.println(p);
}
/**
* @throws
* 测试BeanUtils的功能
* 发现功能和自定义工具类功能是一样的,都能实现一步到位的数据封装
* 大概通俗的说法就是:
* 页面提交上来的数据可以利用request.getParameterMap方法
* 将数据封装到一个map集合中,我就能一步到位,通过调用一次BeanUtils工具类方法
* 实现从map集合中获取数据封装到指定的对象中(指定的对象符合字段属性名称和数量与
* 页面name值一致就能完成)
*/
@Test
public void test3() throws IllegalAccessException, InvocationTargetException{
HashMap map = new HashMap();
map.put("name","小明");
map.put("age",18);
map.put("birthday","2014-05-08");
//通过反射添加获取字段
Person p = new Person();
org.apache.commons.beanutils.BeanUtils beanUtils = new org.apache.commons.beanutils.BeanUtils();
beanUtils.populate(p, map);
System.out.println(p);
}
/**
* 通过自定义转化器,重写了convert方法,将指定将正则类型(yyyy-MM-dd)String数据转换成日期类型的数据
* 注意:test4方法和test5方法区别是:
* test4()是Person对象中的Date字段导入的是import java.util.Date;
* test5()是Person对象中的Date字段导入的是import java.sql.Date;
* 导入了import java.sql.Date,在从map中将数据取出来封装到Person中
* 时,能够自动将String类型(格式:(yyyy-MM-dd))转换为date类型,所以也就
* test5()不需要转化器了.
*/
@Test
public void test4() throws Exception{
HashMap
map = new HashMap
();
map.put("name","小明");
map.put("age",18);
map.put("birthday","2014-05-08");
Person p = new Person();
//存数据前对数据类型转换进行注册
//第一个参数,要注册的自定义转换器,
//第二个参数,Date.class,要转换的数据类型
ConvertUtils.register(new MyConverter(),Date.class);
org.apache.commons.beanutils.BeanUtils.populate(p,map);
System.out.println(p);
}
@Test
public void test5() throws Exception{
Map
map = new HashMap
(); map.put("name", "张三"); map.put("age", 18); map.put("birthday", "2000-01-01"); Person p = new Person(); System.out.println(p); /** * 1 编写一个类,它实现了 Converter 接口。 * 2 在封装数据之前,将自定义的转化器, 调用 ConvertUtils.register()方法注册,后期封装数据的时候,会自动调用 * * */ //第一个参数,要注册的自定义转换器, //第二个参数,Date.class,要转换的数据类型 //ConvertUtils.register(new MyConverter(), Date.class); org.apache.commons.beanutils.BeanUtils.populate(p, map); System.out.println(p); } }
工具类写完了,这个工具类,有什么用?
2、BeanUtils第三方工具的使用(重点:必须掌握)(Apache公司提供)
1 百度新技术获取官网
2 下载资料(jar包 API文档)
3 创建工程,测试新技术,需要查找到官网的用户指南(user guide,quick start)
4 根据用户指南测试技术
5 笔记,后期,在使用这个技术的是,可以看自己的笔记,效率更高,面试的时候,可以将笔记,作为一个加分项。
作用:帮助程序员更便捷的封装数据到对象中。
2.1 BeanUtils的使用总结
2、使用BeanUtils类里面的populate方法
第一参数:数据要封装到的对象(Person)
第二个参数:要被封装数据,这个数据存放在一个map集合中
最后就会把map中的数据,封装到bean(此处例子为person)对象中。
BeanUtils作用在web层,能够简化程序员的向对象模型中封装数据的方式
一个第三方函数轻松实现,非常方便,后期会有针对与dao层,service层的简化代码书写的第三方接口及实现类让程序员变化使用
使用自定义转换器注意:
1)必须实现Converter接口,复写其中Converter方法
2)在封装数据之前,注册自己的转换器
3)转换器在需要转换的时候使用,有些转换是可以自动发生的可能是导入了可以自动转换类型的数据类型包
等等情况下不需要使用也会自动执行
注意:注册的时候必须使用日期格式—— yyyy-MM-dd(BeanUtils默认支持的日期转换格式)