資料來源 | java 公開原始碼報-第5期 |
作者 | jini |
所謂 BeanUtils 為何要開發呢, 每個工程師或許在寫 JavaBean 的時候, 都會乖乖地去寫 getters 和 setters, 就是 getXXX() 及 setXXX() methods, 但是當你的 object 是動態產生的, 也許是用檔案, 也許是其他原因, 那你該如何去存取資料呢 !!
幾個例子你可能會用到 BeanUtils, 當然, 這是已經存在的專案了
你大可以使用 java api 中的 java.lang.reflect 及 java.beans 來達到這些資料交換 ~~ 不過呢, 難度有點高 ,但是, BeanUtils 將會減低你開發的時間 !!
目前最新的 stable 版本為 1.7.0 (2003/2/18 released),
下載位置為 Binary & Source
BeanUtils 的 Java API 主要的 package 總共四項
其實除了第一項之外, 其他的都是後來版本才加上去的, converters 就是專門處理不同傳入的 object 該如何轉換, locale 呢, 就是為了國際化的處理, 所以重點我都會擺在第一項!!
而其中最常用到的 class 是 PropertyUtils 及 ConvertUtils 還有 DynaBeans( 有用 struts dynaform 的應該不陌生 )
基本上, 我假設大家對 JavaBean 的開發都沒有問題, 就是 對 getters 及 setters 都了解是什麼. 先假設,
Employee.java
PropertyUtils.getSimpleProperty(Object bean, String name) PropertyUtils.setSimpleProperty(Object bean, String name, Object value)
Employee employee = ...; String firstName = (String) PropertyUtils.getSimpleProperty(employee, "firstName"); String lastName = (String) PropertyUtils.getSimpleProperty(employee, "lastName"); ............. PropertyUtils.setSimpleProperty(employee, "firstName", firstName); PropertyUtils.setSimpleProperty(employee, "lastName", lastName);
PropertyUtils.getIndexedProperty(Object bean, String name) PropertyUtils.getIndexedProperty(Object bean, String name, int index) PropertyUtils.setIndexedProperty(Object bean, String name, Object value) PropertyUtils.setIndexedProperty(Object bean, String name, int index, Object value)
Employee employee = ...; int index = ...; String name = "subordinate[" + index + "]"; Employee subordinate = (Employee) PropertyUtils.getIndexedProperty(employee, name); Employee employee = ...; int index = ...; Employee subordinate = (Employee) PropertyUtils.getIndexedProperty(employee, "subordinate", index);
PropertyUtils.getMappedProperty(Object bean, String name) PropertyUtils.getMappedProperty(Object bean, String name, String key) PropertyUtils.setMappedProperty(Object bean, String name, Object value) PropertyUtils.setMappedProperty(Object bean, String name, String key, Object value)
Employee employee = ...; Address address = ...; PropertyUtils.setMappedProperty(employee, "address(home)", address); Employee employee = ...; Address address = ...; PropertyUtils.setMappedProperty(employee, "address", "home", address);
PropertyUtils.getNestedProperty(Object bean, String name) PropertyUtils.setNestedProperty(Object bean, String name, Object value)
String city = (String) PropertyUtils.getNestedProperty(employee, "address(home).city");
Employee employee = ...; String city = (String) PropertyUtils.getProperty(employee, "subordinate[3].address(home).city");
BasicDynaClass(java.lang.String name, java.lang.Class dynaBeanClass, DynaProperty[] properties) BasicDynaBean(DynaClass dynaClass)
DynaProperty[] props = new DynaProperty[]{ new DynaProperty("address", java.util.Map.class), new DynaProperty("subordinate", mypackage.Employee[].class), new DynaProperty("firstName", String.class), new DynaProperty("lastName", String.class) }; BasicDynaClass dynaClass = new BasicDynaClass("employee", null, props); DynaBean employee = dynaClass.newInstance(); employee.set("address", new HashMap()); employee.set("subordinate", new mypackage.Employee[0]); employee.set("firstName", "Fred"); employee.set("lastName", "Flintstone");
ResultSetDynaClass(java.sql.ResultSet resultSet) ResultSetDynaClass(java.sql.ResultSet resultSet, boolean lowerCase)
Connection conn = ...; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery ("select account_id, name from customers"); Iterator rows = (new ResultSetDynaClass(rs)).iterator(); while (rows.hasNext()) { DynaBean row = (DynaBean) rows.next(); System.out.println("Account number is " + row.get("account_id") + " and name is " + row.get("name")); } rs.close(); stmt.close();
RowSetDynaClass(java.sql.ResultSet resultSet) RowSetDynaClass(java.sql.ResultSet resultSet, boolean lowerCase)
Connection conn = ...; // Acquire connection from pool Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT ..."); RowSetDynaClass rsdc = new RowSetDynaClass(rs); rs.close(); stmt.close(); ...; // Return connection to pool List rows = rsdc.getRows(); ...; // Process the rows as desired
WrapDynaClass(java.lang.Class beanClass) WrapDynaBean(java.lang.Object instance) ConvertingWrapDynaBean(java.lang.Object instance)
MyBean bean = ...; DynaBean wrapper = new WrapDynaBean(bean); String firstName = wrapper.get("firstName");
ConvertUtils().convert(java.lang.Object value) ConvertUtils().convert(java.lang.String[] values, java.lang.Class clazz) ConvertUtils().convert(java.lang.String value, java.lang.Class clazz)
HttpServletRequest request = ...;
MyBean bean = ...;
HashMap map = new HashMap();
Enumeration names = request.getParameterNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
map.put(name, request.getParameterValues(name));
}
BeanUtils.populate(bean, map);// it will use ConvertUtils for convertings
Converter myConverter =
new org.apache.commons.beanutils.converter.IntegerConverter();
ConvertUtils.register(myConverter, Integer.TYPE); // Native type
ConvertUtils.register(myConverter, Integer.class); // Wrapper class