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 }