<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Vincent.Chan‘s Blog

    常用鏈接

    統計

    積分與排名

    網站

    最新評論

    BeanUtils 介紹

     BeanUtils 介紹

    所謂 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 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 該如何轉換, locale 呢, 就是為了國際化的處理, 所以重點我都會擺在第一項!!

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

     BeanUtils.PropertyUtils 介紹

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

    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 中會區分為三種 method 狀態

    • Simple - 如果你是用到 primitive 語法, 如 int, String 或其他自行開發的 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 數值就可以取得資料的型態
      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)的資料結構, 你該如何取得你要的資料呢

    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 當然都可以這樣使用

    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 . 我們為何要用到 Dynamic JavaBean 呢, 例如, 你從資料庫撈出來的資料, 有時候可能是三個欄位, 有時候是四個欄位, 如果我們對於每個 Bean 都要去寫一個 class, 就會很累, 所以對於每一種 javabean 我們就設定他的屬性有哪些, 接著就可以使用 PropertyUtils 來將他的數值取出, 如此, 可以減少很多開發工時. 在 Struts 的課程中, 很多人問到我, 請問每一個 ActionForm 都必須寫成 java 檔嗎, 當然, 不需要的, 否則一個網頁一個 ActionForm ( 假設都不一樣 ), 那麼, 這麼浪費時間的工作, 為何還要使用 Struts 來作為 Framework 呢, 所以我們都是使用 org.apache.struts.action.DynaActionForm!!
    MutableDynaClass 這是一個 DynaClass, 是為了動態可以調整 properties !

    • BasicDynaBean and BasicDynaClass - 基本的 Dynamic 型態
      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 設為 false , 回傳的資料欄位名將根據 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 設為 false , 回傳的資料欄位名將根據 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 的參數, 需要轉換成 正確的資料型態, 所以 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

    目前支援的型態有

    • 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 :部分內容屬於直接翻譯自 jakarta commons beanutils

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

    主站蜘蛛池模板: 亚洲精品自产拍在线观看动漫| 亚洲日韩精品无码专区网站| 亚洲人成网站在线播放影院在线 | 亚洲中文字幕无码一区| 亚欧国产一级在线免费| 亚洲成?v人片天堂网无码| 美女羞羞视频免费网站| 亚洲精品tv久久久久久久久久| 国产亚洲综合久久| 亚洲国产精品日韩专区AV| 国产精品hd免费观看| 久久精品国产亚洲Aⅴ香蕉| 中文日本免费高清| 久久亚洲国产精品| 成人浮力影院免费看| 亚洲一本到无码av中文字幕 | 国产va精品免费观看| 亚洲精品无码中文久久字幕| 日本高清免费aaaaa大片视频| 国产成人亚洲精品蜜芽影院| 伊人久久亚洲综合| 69式互添免费视频| 含羞草国产亚洲精品岁国产精品| 亚洲人成无码久久电影网站| 免费在线看黄网站| 亚洲一区欧洲一区| 亚洲一区二区精品视频| 日韩av无码久久精品免费| 久久亚洲国产成人影院| 亚洲av再在线观看| 99久9在线|免费| 色窝窝亚洲av网| 亚洲欧洲在线观看| 精品国产免费一区二区| 国内精品免费久久影院| 亚洲avav天堂av在线网爱情| 亚洲精品麻豆av| 成人免费午夜无码视频 | 久久久久久AV无码免费网站| 亚洲欧美国产欧美色欲| 亚洲国产三级在线观看|