beanUtils操作bean的屬性


beanUtils操縱bean屬性:

    需要jar包commons-beanutils-x.x.x.jar
    同時commons-beanutils-x.x.x.jar需要commons-logging.jar日志記錄器來支持
    所以用beanUtils的時候需要導入兩個jar包
例:

javaBean:

 1 import java.util.Date;
 2 
 3 /**
 4  * 
 5  * @功能:javaBean
 6  * 
 7  * @日期:2013-10-24
 8  * 
 9  */
10 public class Person {
11 
12     private String name;
13     private int age;
14     private Date birthday;
15     
16     public Date getBirthday() {
17         return birthday;
18     }
19 
20     public void setBirthday(Date birthday) {
21         this.birthday = birthday;
22     }
23     
24     public String getName() {
25         return name;
26     }
27     public void setName(String name) {
28         this.name = name;
29     }
30     public int getAge() {
31         return age;
32     }
33     public void setAge(int age) {
34         this.age = age;
35     }
36     
37 }

測試類:

  1 import java.lang.reflect.InvocationTargetException;
  2 import java.text.ParseException;
  3 import java.text.SimpleDateFormat;
  4 import java.util.Date;
  5 import java.util.HashMap;
  6 import java.util.Map;
  7 
  8 import org.apache.commons.beanutils.BeanUtils;
  9 import org.apache.commons.beanutils.ConversionException;
 10 import org.apache.commons.beanutils.ConvertUtils;
 11 import org.apache.commons.beanutils.Converter;
 12 import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
 13 import org.junit.Test;
 14 
 15 /**
 16  * 
 17  * @功能:BeanUtils
 18  * 
 19  * @日期:2013-10-24
 20  */
 21 public class BeanUtilsTest {
 22 
 23     @Test
 24     public void test1() throws IllegalAccessException, InvocationTargetException{
 25         Person p = new Person();
 26         
 27         String name = "張三";
 28         String age = "25";
 29         String date = "1988-01-04";
 30         /*
 31          * beanutils操縱bean的屬性如下,
 32          * 第一參數傳一個對象,第二個參數為所操作屬性的名稱,第三個參數為操作的屬性的值
 33          * beanutils可以將屬性類型自動轉換成javaBean里的屬性類型(只限於8種基本數據類型)
 34          * 想要將復雜類型的屬性轉換成其他型則需要注冊一個轉換器來實現
 35          * test2()為實現String轉換為Date的測試過程
 36          */
 37         BeanUtils.setProperty(p, "name", name);
 38         BeanUtils.setProperty(p, "age", age);
 39         //如果將String類型的日期用如下方式來設置bean的屬性,不會轉換成功,會報出如下錯誤
 40         //BeanUtils.setProperty(p, "birthday", date);
 41         /*
 42          * 2013-10-24 14:48:34 org.apache.commons.beanutils.converters.DateConverter toDate
 43          *警告:     DateConverter does not support default String to 'Date' conversion.
 44          *2013-10-24 14:48:34 org.apache.commons.beanutils.converters.DateConverter toDate
 45          *警告:     (N.B. Re-configure Converter or use alternative implementation)
 46          */
 47         System.out.println(p.getName());
 48         System.out.println(p.getAge());
 49 //        System.out.println(p.getBirthday());
 50     }
 51     
 52     /**
 53      * 
 54      * @功能:在沒有相應自動轉換的時候需要注冊一個轉換器來轉換想要的類型
 55      *             test2()為一個自定義的轉換器,作為例子來寫
 56      *             注:Apache已經寫好了一些轉換器,需要的時候看看文檔converter下有沒有想要的轉換器
 57      *                 test3()介紹了date轉換的轉換器,只需要注冊一下即可
 58      * @throws IllegalAccessException
 59      * @throws InvocationTargetException
 60      * @日期:2013-10-24
 61      */
 62     @Test
 63     public void test2() throws IllegalAccessException, InvocationTargetException{
 64         //注冊一個String類型到Date類型的轉換器
 65         //通過查看API文檔,可知Converter是一個接口,需要實現其方法,第二個參數為想要轉換成的數據類型
 66         ConvertUtils.register(new Converter() {
 67             
 68             public Object convert(Class type, Object value) {
 69                 
 70                 //判斷是不是String類型的數據,不是則拋出異常
 71                 if(!(value instanceof String)){
 72                     throw new ConversionException("不是String數據類型!");
 73                 }
 74                 //是String的話,把Object的value強轉成String
 75                 String strValue = (String) value;
 76                 //判斷是不是一個空字符串
 77                 if(strValue.trim().equals("")){
 78                     return null;
 79                 }
 80                 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 81                 try {
 82                     return sdf.parse(strValue);
 83                 } catch (ParseException e) {
 84                     throw new RuntimeException(e);
 85                 }
 86             }
 87         }, Date.class);
 88         
 89         Person p = new Person();
 90         String date = "1988-09-23";
 91         BeanUtils.setProperty(p, "birthday", date);
 92         System.out.println(p.getBirthday());
 93     }
 94     
 95     /**
 96      * 使用框架里已定義好的轉換器
 97      * @throws InvocationTargetException 
 98      * @throws IllegalAccessException 
 99      * 
100      */
101     @Test
102     public void test3() throws IllegalAccessException, InvocationTargetException{
103         Person p = new Person();
104         String date = "1980-03-04";
105         //注冊一個轉換器,將String類型的date轉為Date型
106         ConvertUtils.register(new DateLocaleConverter(), Date.class);
107         BeanUtils.setProperty(p, "birthday", date);
108         //.toLocaleString()轉為需要的日期格式
109         System.out.println(p.getBirthday().toLocaleString());
110     }
111     /*
112      * 注:雖然,可以用已經寫好的轉換器,但是這個寫好的轉換器存在一個問題,就是date為空的時候,
113      * 它檢測不到,運行時會拋出異常,所以最好自己學會去寫一個轉換器
114      */
115     
116     
117     /**
118      * 用map集合中的值,填充bean的屬性值
119      * @throws Exception 
120      * @throws IllegalAccessException 
121      */
122     @Test
123     public void test4() throws IllegalAccessException, Exception{
124         Person p = new Person();
125         Map map = new HashMap();
126         map.put("name", "張三");
127         map.put("age", "24");
128         map.put("birthday", "1978-09-27");
129         //注冊一個日期轉換器
130         ConvertUtils.register(new DateLocaleConverter(), Date.class);
131         //將map集合中的值填充到bean的屬性,map的key值必須要與bean的屬性相同才能填充進去
132         BeanUtils.populate(p, map);
133         System.out.println("name:" + p.getName() + "\r\n" + "age:" + p.getAge() + "\r\n" + "birthday:" + p.getBirthday().toLocaleString().substring(0,10));
134     }
135 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM