BeanUtils转载精华

/**
 * BeanUtils工具的使用
 * 功能:BeanUtils主要是用于将对象的属性封装到对象中
 * BeanUtils的好处:
 * BeanUtils设置属性值的时候,如果属性是基本数据类型,那么BeanUtils会自动帮我们进行数据类型的转换,并且
 * BeanUtils设置属性的时候也是依赖于底层的getter和setter方法
 * 
 * 如果设置的属性值是其他的引用数据类型,此时必须要注册一个类型转换器才能实现自动的转换
 * */

package com.jpzhutech.beanutils;

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 TestBeanUtils {
    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的好处:
 * BeanUtils设置属性值的时候,如果属性是基本数据类型,那么BeanUtils会自动帮我们进行数据类型的转换,并且
 * BeanUtils设置属性的时候也是依赖于底层的getter和setter方法
 * 
 * 如果设置的属性值是其他的引用数据类型,此时必须要注册一个类型转换器才能实现自动的转换
 * */

package com.jpzhutech.beanutils;

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 TestBeanUtils {
    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);
    }
}


Beanutil 对象转换器

转载别人:    很系统

1.java文件

 

[java] view plain copy

  1. /** 
  2.  * <p>Title:request转化为javaBean工具类</p> 
  3.  * <p>Description:request转化为javaBean工具类</p> 
  4.  */  
  5. import java.lang.reflect.Field;  
  6. import java.lang.reflect.Method;  
  7. import java.sql.Timestamp;  
  8. import java.text.SimpleDateFormat;  
  9. import java.util.Enumeration;  
  10. import java.util.HashMap;  
  11. import java.util.Iterator;  
  12. import java.util.List;  
  13. import java.util.Map;  
  14.   
  15. import javax.servlet.http.HttpServletRequest;  
  16.   
  17. public class RequestBeanUtils {  
  18.   
  19.     final static String PREFFIX = "set";  
  20.       
  21.     /** 
  22.      *  
  23.      * 把request中的值赋给Object对象,也就是把request中的parameter和object属性对应的时候 
  24.      * 把object中的属性赋值,使用标准的bean 
  25.      * @param  request 
  26.      * @param  target 目标bean 
  27.      * @return 封装之后的bean 
  28.      * @throws Exception 
  29.      */  
  30.     @SuppressWarnings("unchecked")  
  31.     public static Object getValuesByRequest(HttpServletRequest request,Object target) throws Exception {  
  32.         Enumeration<String> keys = request.getParameterNames();  
  33.         Map<String, String> valueMap = getValuesMap(request, keys);  
  34.         getObject(valueMap, target, null,null);  
  35.         return target;  
  36.     }  
  37.   
  38.   
  39.     /** 
  40.      *  
  41.      * @see    把request中的值赋给Object对象,也就是把request中的parameter和object属性对应的时候 
  42.      *         把object中的属性赋值,使用标准的bean 
  43.      * @param  request 
  44.      * @param  target 目标bean 
  45.      * @param  unSetProperties 不复制的对象 
  46.      * @return 封装之后的bean 
  47.      * @throws Exception 
  48.      */  
  49.     @SuppressWarnings("unchecked")  
  50.     public static Object getValuesByRequest(HttpServletRequest request,  
  51.             Object object,  String[] unSetProperties)throws Exception {  
  52.         Enumeration<String> keys = request.getParameterNames();  
  53.         Map<String, String> valueMap = getValuesMap(request, keys);  
  54.         getObject(valueMap, object, unSetProperties,null);  
  55.         return object;  
  56.     }  
  57.   
  58.     /** 
  59.      *  
  60.      * @see    把request中的值赋给Object对象,也就是把request中的parameter和object属性对应的时候 
  61.      *         把object中的属性赋值,使用标准的bean 
  62.      * @param  request 
  63.      * @param  target 目标bean 
  64.      * @param  unSetProperties 不复制的对象 
  65.      * @param  proertiesMap 不一致属性匹配 
  66.      * @return 封装之后的bean 
  67.      * @throws Exception 
  68.      */  
  69.     @SuppressWarnings("unchecked")  
  70.     public static Object getValuesByRequest(HttpServletRequest request,  
  71.             Object object,  String[] unSetProperties,Map<String,String> proertiesMap)  
  72.             throws Exception {  
  73.         Enumeration<String> keys = request.getParameterNames();  
  74.         Map<String, String> valueMap = getValuesMap(request, keys);  
  75.         getObject(valueMap, object, unSetProperties,proertiesMap);  
  76.         return object;  
  77.     }  
  78.       
  79.     /** 
  80.      * 获取request参数及值map(键值对) 
  81.      * @param request 
  82.      * @param keys 
  83.      * @return 
  84.      * @throws Exception 
  85.      */  
  86.     protected static Map<String, String> getValuesMap(  
  87.             HttpServletRequest request, Enumeration<String> keys) throws Exception {  
  88.         if (keys == null)  
  89.             return null;  
  90.         Map<String, String> value = new HashMap<String, String>();  
  91.         while (keys.hasMoreElements()) {  
  92.             String element = keys.nextElement();  
  93.             value.put(element, request.getParameter(element));  
  94.         }  
  95.         return value;  
  96.     }  
  97.   
  98.     /** 
  99.      * 转化javaBean 
  100.      * @param valueMap request获取的键值 
  101.      * @param object javaBean对象 
  102.      * @param unSetProperties 不复制的对象 
  103.      * @param proertiesMap 不一致属性匹配 
  104.      * @return 
  105.      * @throws Exception 
  106.      */  
  107.     protected static Object getObject(Map<String, String> valueMap,  
  108.             Object object, String[] unSetProperties,Map<String,String> proertiesMap) throws Exception {  
  109.         List<String> unSet = null;  
  110.         if (unSetProperties != null)  
  111.             unSet=java.util.Arrays.asList(unSetProperties);  
  112.         if (valueMap == null)  
  113.             return null;  
  114.         for (Iterator<String> iter=valueMap.keySet().iterator();iter.hasNext();) {  
  115.             String key = iter.next();  
  116.             if (unSet != null && unSet.contains(key)) {  
  117.                 continue;  
  118.             }  
  119.             String methodValue = valueMap.get(key);  
  120.             if(proertiesMap!=null && proertiesMap.containsKey(key)){  
  121.                 key=proertiesMap.get(key);  
  122.             }  
  123.             if (methodValue != null)  
  124.                 setValue(object, key, methodValue);  
  125.         }  
  126.         return object;  
  127.     }  
  128.   
  129.     /** 
  130.      * 给javaBean中的属性字段赋值 
  131.      * @param obj  javaBean对象 
  132.      * @param name bean属性 
  133.      * @param value 值 
  134.      * @throws Exception 
  135.      */  
  136.     protected static void setValue(Object obj, String name, String value)  
  137.             throws Exception {  
  138.         Field field = null;  
  139.         try {  
  140.             field = obj.getClass().getDeclaredField(name);  
  141.         } catch (Exception e) {  
  142.             return;  
  143.         }  
  144.         if (field == null) {  
  145.             return;  
  146.         }  
  147.         Method method = obj.getClass().getDeclaredMethod(  
  148.                 getSetMethodName(name), field.getType());  
  149.         String type = field.getGenericType().toString();  
  150.         if(type.equals("int") || type.equals("class java.lang.Integer")){  
  151.             if(value!=null && !value.equals("")){  
  152.                 method.invoke(obj, Integer.parseInt(value));  
  153.             }  
  154.         }else if(type.equals("double") || type.equals("class java.lang.Double")){  
  155.             if(value!=null && !value.equals("")){  
  156.                 method.invoke(obj, Double.valueOf(value));  
  157.             }  
  158.         }else if(type.equals("float") || type.equals("class java.lang.Float")){  
  159.             if(value!=null && !value.equals("")){  
  160.                 method.invoke(obj, Float.valueOf(value));  
  161.             }  
  162.         }else if(type.equals("char") || type.equals("class java.lang.Character")){  
  163.             if(value!=null && !value.equals("")){  
  164.                 method.invoke(obj, Character.valueOf(value.charAt(0)));  
  165.             }  
  166.         }else if(type.equals("class java.util.Date")){  
  167.             if(value!=null && !value.equals("")){  
  168.                 String format = value.length()==10?"yyyy-MM-dd":"yyyy-MM-dd HH:mm:ss";  
  169.                 SimpleDateFormat sdf = new SimpleDateFormat(format);  
  170.                 method.invoke(obj, sdf.parse(value));  
  171.             }                  
  172.         }else if(type.equals("class java.sql.Timestamp")){  
  173.             if(value!=null && !value.equals("")){  
  174.                 String format = value.length()==10?"yyyy-MM-dd":"yyyy-MM-dd HH:mm:ss";  
  175.                 SimpleDateFormat sdf = new SimpleDateFormat(format);  
  176.                 method.invoke(obj, new Timestamp(sdf.parse(value).getTime()));  
  177.             }  
  178.         }else{  
  179.             method.invoke(obj, value);  
  180.         }  
  181.     }  
  182.   
  183.     /** 
  184.      * bean属性转化为set方法 
  185.      * @param methodName 
  186.      * @return 
  187.      */  
  188.     protected static String getSetMethodName(String methodName) {  
  189.         String first = methodName.substring(01);  
  190.         String suffex = methodName.substring(1);  
  191.         return (PREFFIX + first.toUpperCase() + suffex).toString();  
  192.     }  
  193. }  

 

2.调用方法

 

 

[java] view plain copy

  1. User user = new User();  
  2. RequestBeanUtils.getValuesByRequest(request,user);  

 

最后在博客园贴一下最常用的方法

 

beanutil常用的方法

Apache Common BeanUtil是一个常用的在对象之间复制数据的工具类,著名的web开发框架struts就是依赖于它进行ActionForm的创建。

    BeanUtil最常用的类是org.apache.commons.beanutils.BeanUtils。
    BeanUtils最常用的方法为:
    1.   public void copyProperties(java.lang.Object dest, java.lang.Object orig) 把orig中的值copy到dest中.
    2.   public java.util.Map describe(java.lang.Object bean)
 把Bean的属性值放入到一个Map里面。
    3.   public void populate(java.lang.Object bean, java.util.Map properties) 把properties里面的值放入bean中。
    4.   public void setProperty(java.lang.Object bean, java.lang.String name, java.lang.Object value)
 设置Bean对象的名称为name的property的值为value.
    5.   public String getProperty(java.lang.Object bean, java.lang.String name)
           取得bean对象中名为name的属性的值。
    详细的使用方法可以参见官方网站:
    http://jakarta.apache.org/commons/beanutils/
 

Apache Common BeanUtil的常见使用场景

<!--[if !supportLists]-->1.     <!--[endif]-->同类之间不同对象要求进行数据复制。

User user1 = …;
User user2 = …;
BeanUtils. copyProperties(user2,user1);

<!--[if !supportLists]-->2.     <!--[endif]-->不同类不同对象之间的数据复制。

UserForm userForm = …;
User user = …;
BeanUtils. copyProperties(user, userForm);

相信经常使用struts的人,一定会很熟悉上面的代码。
这是一个典型把页面的value object数据复制到domain object的例子。
<!--[if !supportLists]-->3.     <!--[endif]-->对象数据和Map之间互相转化。

User user …;
Map userMap BeanUtils.describe(user);
Map userMap …;
User user …;
BeanUtils.populate(user,userMap);   值对象

     Map可以看成一个动态数据容器,作为VO很适合在不同层之间传播数据,作为PO也可以动态存储字段信息,
合理运用可以减少程序很多修改和维护工作。所以让bean和map之间方便的进行数据填充,非常必要。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值