Vincent.Chan‘s Blog

          常用鏈接

          統(tǒng)計

          積分與排名

          網(wǎng)站

          最新評論

          BeanUtils 介紹

           BeanUtils 介紹

          所謂 BeanUtils 為何要開發(fā)呢, 每個工程師或許在寫 JavaBean 的時候, 都會乖乖地去寫 getters 和 setters, 就是 getXXX() 及 setXXX() methods, 但是當(dāng)你的 object 是動態(tài)產(chǎn)生的, 也許是用檔案, 也許是其他原因, 那你該如何去存取資料呢 !!

          幾個例子你可能會用到 BeanUtils, 當(dāng)然, 這是已經(jīng)存在的專案了

          你大可以使用 java api 中的 java.lang.reflect 及 java.beans 來達到這些資料交換 ~~ 不過呢, 難度有點高 ,但是, BeanUtils 將會減低你開發(fā)的時間 !!

          目前最新的 stable 版本為 1.7.0 (2003/2/18 released),
          下載位置為 Binary & Source

           BeanUtils API 介紹

          BeanUtils 的 Java API 主要的 package 總共四項

          1. org.apache.commons.beanutils
          2. org.apache.commons.beanutils.converters
          3. org.apache.commons.beanutils.locale
          4. org.apache.commons.beanutils.locale.converters

          其實除了第一項之外, 其他的都是後來版本才加上去的, converters 就是專門處理不同傳入的 object 該如何轉(zhuǎn)換, locale 呢, 就是為了國際化的處理, 所以重點我都會擺在第一項!!

          而其中最常用到的 class 是 PropertyUtils 及 ConvertUtils 還有 DynaBeans( 有用 struts dynaform 的應(yīng)該不陌生 )

           BeanUtils.PropertyUtils 介紹

          基本上, 我假設(shè)大家對 JavaBean 的開發(fā)都沒有問題, 就是 對 getters 及 setters 都了解是什麼. 先假設(shè),

          Employee.java
          								public class Employee {
          public Address getAddress(String type);
          public void setAddress(String type, Address address);
          public Employee getSubordinate(int index);
          public void setSubordinate(int index, Employee subordinate);
          publicString getFirstName();
          public void setFirstName(String firstName);
          publicString getLastName();
          public void setLastName(String lastName);
          }

          在 PropertyUtils 中會區(qū)分為三種 method 狀態(tài)

          • Simple - 如果你是用到 primitive 語法, 如 int, String 或其他自行開發(fā)的 objects 等等, 只需要單一的物件就可以取得資料
            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);
          • Indexed - 如果你是用到 Collection 或 List 實作出來的 objects , 只需要使用一個 index 數(shù)值就可以取得資料的型態(tài)
            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);
          • Mapped - 如果你是用到 Map 延伸出來的 objects , 只需要使用一個 key 值就可以取得資料
            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);

          但是如果你是巢狀(nested)的資料結(jié)構(gòu), 你該如何取得你要的資料呢

          PropertyUtils.getNestedProperty(Object bean, String name) 
          PropertyUtils.setNestedProperty(Object bean, String name, Object value)

          你只需要簡單地使用 ".", 就可以得到你要的資料了

          								String city = (String)
          PropertyUtils.getNestedProperty(employee, "address(home).city");

          千萬要記住, BeanUtils 是要讓你隨心所欲使用, 所以呢 index , mapped 當(dāng)然都可以這樣使用

          Employee employee = ...;
          String city = (String)
          PropertyUtils.getProperty(employee, "subordinate[3].address(home).city");

           BeanUtils.DynaBean and BeanUtils.DynaClass 介紹

          所有的 Dynamic JavaBean 都是實作 DynaBean 或 DynaClass 這兩個 interface, 也可能會用到 DynaProperty class 來存取 properties . 我們?yōu)楹我玫?Dynamic JavaBean 呢, 例如, 你從資料庫撈出來的資料, 有時候可能是三個欄位, 有時候是四個欄位, 如果我們對於每個 Bean 都要去寫一個 class, 就會很累, 所以對於每一種 javabean 我們就設(shè)定他的屬性有哪些, 接著就可以使用 PropertyUtils 來將他的數(shù)值取出, 如此, 可以減少很多開發(fā)工時. 在 Struts 的課程中, 很多人問到我, 請問每一個 ActionForm 都必須寫成 java 檔嗎, 當(dāng)然, 不需要的, 否則一個網(wǎng)頁一個 ActionForm ( 假設(shè)都不一樣 ), 那麼, 這麼浪費時間的工作, 為何還要使用 Struts 來作為 Framework 呢, 所以我們都是使用 org.apache.struts.action.DynaActionForm!!
          MutableDynaClass 這是一個 DynaClass, 是為了動態(tài)可以調(diào)整 properties !

          • BasicDynaBean and BasicDynaClass - 基本的 Dynamic 型態(tài)
            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 (Wraps ResultSet in DynaBeans) - 使用 ResultSet 的 Dynamic JavaBean
            ResultSetDynaClass(java.sql.ResultSet resultSet)
            ResultSetDynaClass(java.sql.ResultSet resultSet, boolean lowerCase)

            如果 lowerCase 設(shè)為 false , 回傳的資料欄位名將根據(jù) JDBC 回傳的為準. default 為 true.

            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 (Disconnected ResultSet as DynaBeans) - 使用 RowSet 的 Dynamic JavaBean
            RowSetDynaClass(java.sql.ResultSet resultSet)
            RowSetDynaClass(java.sql.ResultSet resultSet, boolean lowerCase)

            如果 lowerCase 設(shè)為 false , 回傳的資料欄位名將根據(jù) JDBC 回傳的為準. default 為 true.

            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
          • WrapDynaBean and WrapDynaClass - 包裝過的 Dynamic JavaBean
            如果你對於 DynaBean 的功能強大, 非常佩服的同時, 手邊的 JavaBean 又不能隨隨便便就不用 那你就把他包裝起來 ....
            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");

             BeanUtils.ConvertUtils 介紹

            在很多情況, 例如 struts framework 中, 就常常用到 request.getParameter 的參數(shù), 需要轉(zhuǎn)換成 正確的資料型態(tài), 所以 ConvertUtils 就是來處理這些動作.

            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

          目前支援的型態(tài)有

          • java.lang.BigDecimal
          • java.lang.BigInteger
          • boolean and java.lang.Boolean
          • byte and java.lang.Byte
          • char and java.lang.Character
          • java.lang.Class
          • double and java.lang.Double
          • float and java.lang.Float
          • int and java.lang.Integer
          • long and java.lang.Long
          • short and java.lang.Short
          • java.lang.String
          • java.sql.Date
          • java.sql.Time
          • java.sql.Timestamp

          也可以建立自己的 converter

          Converter myConverter =
          new org.apache.commons.beanutils.converter.IntegerConverter();
          ConvertUtils.register(myConverter, Integer.TYPE); // Native type
          ConvertUtils.register(myConverter, Integer.class); // Wrapper class

           ps :部分內(nèi)容屬於直接翻譯自 jakarta commons beanutils

          posted on 2006-03-23 00:12 Vincent.Chen 閱讀(659) 評論(0)  編輯  收藏 所屬分類: Java

          主站蜘蛛池模板: 抚松县| 修武县| 隆子县| 福州市| 竹北市| 建瓯市| 卫辉市| 永善县| 福海县| 清原| 巢湖市| 罗源县| 松江区| 巴东县| 青阳县| 清新县| 怀宁县| 莲花县| 彩票| 莎车县| 广安市| 扬州市| 清水县| 南华县| 东海县| 文安县| 固始县| 紫云| 南靖县| 兰州市| 安达市| 盐亭县| 阿拉尔市| 中卫市| 景德镇市| 陕西省| 酒泉市| 宽甸| 乐都县| 舟曲县| 会理县|