posts - 18,  comments - 0,  trackbacks - 0
          公告
          這個世界的美麗在于變化
          而一個人的美麗在于奮斗
          ......
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          新聞檔案

          相冊

          JAVA網址

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          轉自:http://blog.csdn.net/fanjun/archive/2005/02/17/291662.aspx

          1.?? 概述

          ?????? 第一次接觸BeanUtils是在學習Struts的過程中,在Struts中它被大量用于處理FormBean

          BeanUtils主要提供了對于JavaBean進行各種操作,

          ?????? BeanUtils一共分4個包:

          ????????? org.apache.commons.beanutils

          ????????? org.apache.commons.beanutils.converters

          ????????? org.apache.commons.beanutils.locale

          ????????? org.apache.commons.beanutils.locale.converters

          其中上面兩個是BeanUtils的默認實現,它沒有針對本地化的任何處理,這個可以提高執行效率。但是若你的程序對于本地化有要求的話,那還是使用下面2個包比較安全。

          ?

          2.?? org.apache.commons.beanutils

          ?????? 這個包主要提供用于操作JavaBean的工具類,Jakarta-Common-BeanUtils的主要功能都在這個包里實現。

          ??? 下面分別介紹幾個主要的工具類:

          2.1.BeanUtil

          1、首先,我先定義一個JavaBean作為之后例子的操作對象。

          ????public class Company

          ????{

          ? ????private String name;

          ? ????private HashMap address = new HashMap();

          ? ????private String[] otherInfo;

          ? ????private ArrayList product;

          ? ????private ArrayList employee;

          ? ????private HashMap telephone;

          ?

          ? ????public Company(){}

          ?

          ????? public String getName()

          ? ????{

          ??? ????return name;

          ? ????}

          ? ????public void setName(String name)

          ? ????{

          ??? ????this.name = name;

          ? ????}

          ?

          ? ????public String getAddress(String type)

          ? ????{

          ??????? return address.get(type).toString();

          ? ????}

          ? ????public void setAddress(String type, String address)

          ? ????{

          ??? ????this.address.put(type,address);

          ? ????}

          ?

          ? ????public String[] getOtherInfo()

          ? ????{

          ??? ????return otherInfo;

          ? ????}

          ? ????public void setOtherInfo(String[] otherInfo)

          ? ????{

          ??? ????this.otherInfo = otherInfo;

          ????? }

          ?

          ? ????public ArrayList getProduct()

          ? ????{

          ??? ????return product;

          ? ????}

          ? ????public void setProduct(ArrayList product)

          ? ????{

          ??? ????this.product = product;

          ????? }

          ?

          ? ????public ArrayList getEmployee()

          ? ????{

          ??? ????return employee;

          ? ????}

          ????? public void setEmployee(ArrayList employee)

          ? ????{

          ??? ????this.employee = employee;

          ? ????}

          ?

          ? ????public HashMap getTelephone()

          ? ????{

          ??? ????return telephone;

          ? ????}

          ? ????public void setTelephone(HashMap telephone)

          ? ????{

          ??? ????this.telephone = telephone;

          ? ????}

          ????}

          2BeanUtils可以直接getset一個屬性的值。它將property分成3種類型:

          ?????? Simple——簡單類型,如StirngInt……

          ?????? Indexed——索引類型,如數組、arrayList……

          ?????? Maped——這個不用說也該知道,就是指Map啦,比如HashMap……

          ?????? 訪問不同類型的數據可以直接調用函數getPropertysetProperty。它們都只有2個參數,第一個是JavaBean對象,第二個是要操作的屬性名。

          Company c = new Company();

          c.setName("Simple");

          ?

          對于Simple類型,參數二直接是屬性名即可

          //Simple

          ??? System.out.println(BeanUtils.getProperty(c, "name"));

          ??? 對于Map類型,則需要以“屬性名(key值)”的形式

          //Map

          ??? System.out.println(BeanUtils.getProperty(c, "address (A2)"));

          ??? HashMap am = new HashMap();

          ??? am.put("1","234-222-1222211");

          ??? am.put("2","021-086-1232323");

          ??? BeanUtils.setProperty(c,"telephone",am);

          ??? System.out.println(BeanUtils.getProperty(c, "telephone (2)"));

          ??? 對于Indexed,則為“屬性名[索引值]”,注意這里對于ArrayList和數組都可以用一樣的方式進行操作。

          //index

          ??? System.out.println(BeanUtils.getProperty(c, "otherInfo[2]"));

          ??? BeanUtils.setProperty(c, "product[1]", "NOTES SERVER");

          ??? System.out.println(BeanUtils.getProperty(c, "product[1]"));

          ?

          ?????? 當然這3種類也可以組合使用啦!

          ??? //nest

          ??? System.out.println(BeanUtils.getProperty(c, "employee[1].name"));

          ?

          3、此外,還有一個很重要的方法copyProperty,可以直接進行Bean之間的clone

          ?????? Company c2 = new Company();

          ??? ????BeanUtils.copyProperties(c2, c);

          ?? ????但是這種copy都是淺拷貝,復制后的2Bean的同一個屬性可能擁有同一個對象的ref,這個在使用時要小心,特別是對于屬性為自定義類的情況。

          4、最后還有populate,它用于將一個map的值填充到一個bean中,其函數原型如下:

          public void populate(java.lang.Object?bean,

          ??????????????? java.util.Map?properties)

          ????????????? throws java.lang.IllegalAccessException,

          ???????????????????? java.lang.reflect.InvocationTargetException

          struts中這個函數被用于從http request中取得參數添加到FormBean,目前好像我也沒有看到這個函數還有什么其他的用途?!以后想到再說吧:P

          ?

          2.2.LazyDynaBean

          ?????? 它實現一個動態的Bean,可以直接往里面加入屬性,作為一個JavaBean一樣使用,也可以用上面的BeanUtilsget/set方法進行操作,而不用事先定義一個標準的JavaBean類啦:)

          記得在J2ee設計模式中有一種Value Object的模式,用于在MVC各層之間傳遞數據,避免直接傳遞大業務對象引起的性能問題,為了避免在項目中出現很多Bean類,在書中提供了一個動態Value Object的實現(通過擴展Map)。這里LazyDynaBean則可以作為一種更加成熟、穩定的實現來使用。呵呵,原來曾打算自己寫一個類似的value object類的,現在看來可以直接用這個啦:P

          ?????? 言歸正傳,LazyBean的確提供了一個很不錯的DynaBean的實現。而且就像它的名字中表述的那樣,它的確是為我這樣的懶人考慮的很周到,用起來幾乎不需要寫什么多余的代碼^_^,下面就看看使用的例子吧!

          ?????? ? //這里使用LazyDynaMap,它是LazyBean的一個輕量級實現

          ????? LazyDynaMap dynaBean1 = new LazyDynaMap();

          ?

          ????? dynaBean1.set("foo", "bar");????????????????? // simple

          ????? dynaBean1.set("customer", "title", "Mr");???? ???// mapped

          ????? dynaBean1.set("address", 0, "address1");????? ???// indexed

          ????? System.out.println(dynaBean1.get("address",0));

          ?

          ????? Map myMap = dynaBean1.getMap();?????????? // retrieve the Map

          ????? System.out.println(myMap.toString());

          ?????? 上面的例子可以看到,它可以在set時自動增加beanproperty(既賦值的同時增加Bean中的property),同時也支持3中類型的property,并且LazyDynaMap還可以導出為map

          ?????? 對于這個類還有兩個重要的Field要注意:

          ?????? returnnull——指定在get方法使用了一個沒有定義過的property時,DynaBean的行為。

          ?????? ? //取的字段的信息

          ????? dynaBean1.setReturnNull(true);//設為ture。若Bean中沒有此字段,返回null

          ??? ????????????????????????????//默認為false。若Bean中沒有此字段,自動增加一個:)

          ????? System.out.println(dynaBean1.get("aaa"));//此時返回null

          ?????? Restricted——指定是否允許改變這個beanproperty

          //MutableDynaClass.setRestricted設為true后,字段不可再增刪和修改.

          ????? //默認為false,允許增刪和修改

          ????? dynaBean1.setRestricted(true);

          ????? dynaBean1.set("test","error");//這里會出錯!

          ?????? 通過設置這兩個屬性,可以防止意外修改DynaBeanproperty。在設計架構時,你可以在后臺從數據表或xml文件自動產生DynaBean,在傳到控制層和表示層之前設置上述屬性使其Bean結構不允許修改,如此就不可能無意中修改Bean包含的屬性……這樣既可以享用它的便利,有可以防止由此引入的錯誤可能,設計者實在深得偷懶的精髓啊!!!!!

          ?

          3.?? 其他

          3.1.BeanUtilsPropertyUtils

          ?????? 這兩個類幾乎有一摸一樣的功能,唯一的區別是:BeanUtils在對Bean賦值是會進行類型轉化。舉例來說也就是在copyProperty時只要屬性名相同,就算類型不同,BeanUtils也可以進行copy;而PropertyBean則可能會報錯!!

          ?????? 針對上面的例子,新建一個Company2的類,其中代碼與Company一樣,只是將otherinfoString[]改為String

          ????? Company c = init();

          ????? Company2 c2 = new Company2();

          ?????

          ????? BeanUtils.copyProperties(c2,c);

          //????? PropertyUtils.copyProperties(c2,c); 這句會報錯!!

          ????? System.out.println(c2.getOtherInfo());

          ??? 當然2Bean之間的同名屬性的類型必須是可以轉化的,否則用BeanUtils一樣會報錯。

          ?????? 若實現了org.apache.commons.beanutils.Converter接口則可以自定義類型之間的轉化。

          由于不做類型轉化,用PropertyUtils在速度上會有很大提高!

          此外,不作類型轉化還有一個好處,如下面的代碼:

          ????? //test data type convert

          //????? ArrayList a1 = BeanUtils.getProperty(c,"product"); //BeanUtils返回的是String

          ????? System.out.println("--" + BeanUtils.getProperty(c,"product")); ????//取出后直接被轉為String

          ????? ArrayList a = (ArrayList)PropertyUtils.getProperty(c,"product");//PropertyUtils返回的是Object

          ????? System.out.println("--" + a.get(1));

          BeanUtils無法返回一個對象(除非自己寫一個Converter),它會自動進行類型轉化,然后返回String。對于想返回java類或自定義類的話,還是不要老它大駕轉化了。

          ?

          3.2.Utils

          ?????? 所有的XXXUtils類都提供的是靜態方法,可以直接調用,其主要實現都在相應的XXXUtilsBean中:

          BeanUtils? ?? ——> BeanUtilsBean

          ?????? ConvertUtils? ——> ConvertUtilsBean

          ??? PropertyUtils ——> PropertyUtilsBean

          ?

          其意思看類名也應該知道的差不多了,我就不再廢話啦!當然你也可以直接調用那些XXXUtilsBean,功能都一樣!

          posted on 2006-05-22 16:29 LORD BLOG 閱讀(222) 評論(0)  編輯  收藏 所屬分類: J2EE
          主站蜘蛛池模板: 读书| 赤壁市| 淮南市| 古蔺县| 望谟县| 巨野县| 杨浦区| 策勒县| 怀安县| 牙克石市| 咸丰县| 凤山市| 沈丘县| 广东省| 潜江市| 邵阳县| 朝阳县| 阿拉尔市| 石棉县| 治县。| 淮安市| 容城县| SHOW| 巴塘县| 克东县| 苗栗县| 庆城县| 宝清县| 泸水县| 洮南市| 布尔津县| 康定县| 隆尧县| 毕节市| 子洲县| 长子县| 英超| 濉溪县| 孝昌县| 汝南县| 邵武市|