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

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

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

    Apache Common BeanUtils

    目前 Commons 簡介
         目前已經開發有 release 出來的版本有 BeanUtils, Betwixt, CLI, Collections, DBCP, Digester, Discovery, EL, FileUpload, HttpClient, Jelly, Jexl, JXPath, Lang, Latka, Logging, Modeler, Net, Pool, Validator 等等 

         每個版本都不太一樣, 隨時都有更新的可能, 至于還沒有 release 出來正式的版本, 有一些項目, 可能也正在 使用了 !! 也是有可能因為其他項目做出來的一些元件, 可以抽出來共用的, 例如目前 struts 用的 Resources ( Resource bundle component ) , 也被列入 SandBox 研發中, 準備 release 更符合所有項目的 組件. 

         jakarta 為何要有 commons 這個 project 出現, 就是希望大家不用重復開發一樣的組件, 達到 reusable 的 目的 !! 而且他們都有容易使用的特性, 也是各個 jakarta committer 牛人們的精華杰作, 因此, 絕對不能錯 過這一個 open source project !! 各位親愛的 java 同胞們 .................

    BeanUtils 介紹
         當我在選擇要先介紹哪一個組件, 實在猶豫了很久, 因為每一個實在都是精華, 久久無法做出決定, 所以呢, 只好按照是否 release 再按照字母的先后, 做一個排序, 希望大家明白 ....

    所謂 BeanUtils 為何要開發呢, 每個工程師或許在寫 JavaBean 的時候, 都會乖乖地去寫 getters 和 setters, 就是 getXXX() 及 setXXX() methods, 但是當你的 object 是動態產生的, 也許是用文件, 也許是 其他原因, 那你該如何去存取數據呢 !! 

         幾個例子你可能會用到 BeanUtils, 當然, 這是已經存在的項目了

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

         目前最新的版本為 1.6.1 (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 class 
        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);
            public String getFirstName();
            public void setFirstName(String firstName);
            public String 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 ( since $1.5 ) 這是蠻新的一個 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

     

         目前支持的類型有

    • sjava.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

    posted on 2009-09-19 00:16 張平輝 閱讀(334) 評論(0)  編輯  收藏 所屬分類: JAVA

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    留言簿

    文章分類

    文章檔案

    搜索

    最新評論

    主站蜘蛛池模板: 亚洲网红精品大秀在线观看| 久视频精品免费观看99| 免费一区二区视频| 久久亚洲色WWW成人欧美| 免费激情视频网站| 国产亚洲综合一区二区三区| 免费一级毛片不卡不收费| 五级黄18以上免费看| 亚洲精品无码高潮喷水在线| 精品国产麻豆免费人成网站| 久久亚洲AV午夜福利精品一区| 中文字幕免费在线看电影大全| 一级做a免费视频观看网站| 亚洲第一页综合图片自拍| 国产精品免费视频观看拍拍| 亚洲一本大道无码av天堂| 国产精品视频全国免费观看| 亚洲AV无码久久精品蜜桃| 亚洲黄色免费网址| 亚洲国产无线乱码在线观看 | 最近中文字幕免费mv视频7| 亚洲精品理论电影在线观看| vvvv99日韩精品亚洲| 成人免费av一区二区三区| 久久夜色精品国产噜噜噜亚洲AV | 亚洲精品国产日韩无码AV永久免费网 | 亚洲国产精品成人精品无码区| 亚洲欧洲春色校园另类小说| 亚洲毛片免费观看| 亚洲AV无码XXX麻豆艾秋| 国产亚洲av人片在线观看| 日韩精品久久久久久免费| 亚洲国产精品无码久久九九大片| 久久亚洲免费视频| 亚洲女女女同性video| 亚洲一区二区三区无码中文字幕 | 亚洲AV福利天堂一区二区三| 国产成人涩涩涩视频在线观看免费 | 亚洲不卡av不卡一区二区| 成人浮力影院免费看| 色婷婷亚洲一区二区三区|