posts - 28,  comments - 15,  trackbacks - 0

          DynaBean 的使用

          ?????? 在正常的開發(fā)的過程中,我們時(shí)常會(huì)遇到這樣的問題, JavaBean 的屬性是不確定的、動(dòng)態(tài)的,其屬性的確定是由邏輯控制來處理的。比如這樣的一種情況,有一組基本報(bào)表信息需要 JavaBean 來描述,這組報(bào)表在結(jié)構(gòu)上具有很大的相似性,如果你不想為每一份基本報(bào)表都創(chuàng)建一個(gè) JavaBean ,那么接下來為你介紹一種為 JavaBean 動(dòng)態(tài)創(chuàng)建屬性的方法。

          1.?? DynaBean 的創(chuàng)建

          ?????? 為了描述的便利,我們虛擬一個(gè)簡(jiǎn)單的需求環(huán)境,就以上面提到的描述一組基本報(bào)表信息為例吧,我們假設(shè)基本報(bào)表的名稱為 basicReport ,每一份基本報(bào)表都包含 3 個(gè)屬性 id name 、 rowNo( 行號(hào) ) 。在下面我們將使用 org.apache.commons.beanutils 包提供為我們的一些接口和類來處理上面提到的需求。

          1.1. DynaBean and DynaClass

          DynaBean DynaClass beanutils 包實(shí)現(xiàn) DynaBean 最基本、最常用的接口。對(duì)于 DynaBean DynaClass 你可以這樣理解, DanyBean 提供了可以動(dòng)態(tài)修改實(shí)現(xiàn)他的類的屬性名稱、屬性值、屬性類型的功能;而 DynaClass 負(fù)責(zé)為一個(gè)或者多個(gè)實(shí)現(xiàn)了 DanyBean 接口的對(duì)象提供屬性的功能, DynaClass 提供的屬性正是我們動(dòng)態(tài)創(chuàng)建的那些屬性參考 。如果你不理解,在下一節(jié) BasicDynaBean and BasicDynaClass 我們以實(shí)例展示。

          關(guān)于 DynaBean DynaClass 的詳細(xì)描述,參見 DynaBean DynaClass

          1.2. BasicDynaBean and BasicDynaClass

          BasicDynaBean BasicDynaClass 分別實(shí)現(xiàn)了 DynaBean DynaClass 接口, BasicDynaBean BasicDynaClass 實(shí)現(xiàn)了提供一組基本的屬性的能力,這組屬性是由你動(dòng)態(tài)定義的,而且這組屬性中的成員應(yīng)該是 DynaProperty 類的實(shí)例。首先,你要為 DynaClass 創(chuàng)建你所關(guān)心的一組屬性,代碼如下: ?

          示例代碼:

          ?????? ??? DynaProperty[] props = new DynaProperty[]

          {

          ?????? ??????????? new DynaProperty("id",String.class),

          ?????? ??????????? new DynaProperty("name", String.class),

          ?????? ??????????? new DynaProperty("rowNo", int.class),

          ?????? ??????????? new DynaProperty("c1",? long.class),

          ?????? ??????????? new DynaProperty("c2",long.class),

          ?????? ??????????? new DynaProperty("c3",long.class)

          ?????? ??? };

          BasicDynaClass dynaClass = new BasicDynaClass("basicReport", null, props);

          ?

          ?

          ?

          ??????

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ??????

          說明: ?????????????????????????????????????????????????????????????????

          ?????? BasicDynaClass 一共提供了3個(gè)構(gòu)造函數(shù),我這里強(qiáng)調(diào)的只有一點(diǎn),對(duì)于參數(shù)dynaBeanClass的一個(gè)說明。在上面的代碼中,我們指定要?jiǎng)?chuàng)建一個(gè)名稱為“ basicReport ”的DynaBean,dynaBeanClass參數(shù)說明的是你希望系統(tǒng)為你創(chuàng)建的DynaBean的類型是什么,如果為null的話,系統(tǒng)就認(rèn)為你要?jiǎng)?chuàng)建的是BasicDynaBean類型的DynaBean實(shí)例。如果你希望用其他類型代替null的話,那么指定的類應(yīng)該實(shí)現(xiàn)了DynaClass接口,否則就會(huì)拋出IllegalArgumentException 異常 。 ????????????????????????????????????????????????????????????????????????????????????????????????????????????

          ?

          ?

          ????????????????????

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?


          ?????? 在上面的代碼中,我們假設(shè)為 basicReport 創(chuàng)建了 6 個(gè)屬性,同時(shí)告訴了 BasicDynaClass ,我們需要?jiǎng)?chuàng)建一個(gè)名稱為 basicReport 的報(bào)表, basicReport 的類型我們采用默認(rèn)的 BasicDynaBean 。接下來,我們由 dynaClass 對(duì)象為我們實(shí)例化我們?cè)O(shè)置的這個(gè)動(dòng)態(tài)對(duì)象,參考代碼如下:

          ? ??????

          示例代碼:

          ????????????? DynaBean basicReport = dynaClass.newInstance();

          ?????? ??? basicReport.set("id","124578");

          ?????? ??? basicReport.set("name"," 在校生數(shù) ");

          ?????? ??? basicReport.set("rowNo",new Integer(1));

          ?????? ??? basicReport.set("c1",new Long(125));

          ?????? ??? basicReport.set("c2",new Long(125));

          ?????? ??? basicReport.set("c3",new Long(125));

          ?????????????

          ????????????? String id = (String)basicReport.get(“id”);

          ????????????? String name = (String) basicReport.get("name");

          ?????? ??? int rowNo = ((Integer)basicReport.get("rowNo")).intValue();

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?


          ??????? ?

          在上面的代碼中我們完成了 DynaBean 的實(shí)例化 (basicReport) ,并且對(duì)實(shí)例化的 basicReport 進(jìn)行了設(shè)置和獲取的操作。

          關(guān)于 DynaBean 還有其他形式的應(yīng)用,像 ResultSetDynaClass 、 LazyDynaBean 等分別描述了如何處理數(shù)據(jù)庫(kù)檢索結(jié)果集的 DynaBean 處理、以及簡(jiǎn)略 DynaProperties 處理的 LazyDynaBean 的處理方式,這些都能極大地簡(jiǎn)化開發(fā)過程中 JavaBean 的處理,要了解更多請(qǐng)參考 http://jakarta.apache.org/commons/beanutils/api/index.html

          上面講述的常常是在邏輯處理時(shí)碰到的,那么在 Struts 框架下動(dòng)態(tài)的頁(yè)面的顯示以及提交是否也有這方面的處理呢?答案是肯定的。

          DynaBean 的使用

          ?????? 在正常的開發(fā)的過程中,我們時(shí)常會(huì)遇到這樣的問題, JavaBean 的屬性是不確定的、動(dòng)態(tài)的,其屬性的確定是由邏輯控制來處理的。比如這樣的一種情況,有一組基本報(bào)表信息需要 JavaBean 來描述,這組報(bào)表在結(jié)構(gòu)上具有很大的相似性,如果你不想為每一份基本報(bào)表都創(chuàng)建一個(gè) JavaBean ,那么接下來為你介紹一種為 JavaBean 動(dòng)態(tài)創(chuàng)建屬性的方法。

          1.?? DynaBean 的創(chuàng)建

          ?????? 為了描述的便利,我們虛擬一個(gè)簡(jiǎn)單的需求環(huán)境,就以上面提到的描述一組基本報(bào)表信息為例吧,我們假設(shè)基本報(bào)表的名稱為 basicReport ,每一份基本報(bào)表都包含 3 個(gè)屬性 id 、 name rowNo( 行號(hào) ) 。在下面我們將使用 org.apache.commons.beanutils 包提供為我們的一些接口和類來處理上面提到的需求。

          1.1. DynaBean and DynaClass

          DynaBean DynaClass beanutils 包實(shí)現(xiàn) DynaBean 最基本、最常用的接口。對(duì)于 DynaBean DynaClass 你可以這樣理解, DanyBean 提供了可以動(dòng)態(tài)修改實(shí)現(xiàn)他的類的屬性名稱、屬性值、屬性類型的功能;而 DynaClass 負(fù)責(zé)為一個(gè)或者多個(gè)實(shí)現(xiàn)了 DanyBean 接口的對(duì)象提供屬性的功能, DynaClass 提供的屬性正是我們動(dòng)態(tài)創(chuàng)建的那些屬性參考 。如果你不理解,在下一節(jié) BasicDynaBean and BasicDynaClass 我們以實(shí)例展示。

          關(guān)于 DynaBean DynaClass 的詳細(xì)描述,參見 DynaBean DynaClass

          1.2. BasicDynaBean and BasicDynaClass

          BasicDynaBean BasicDynaClass 分別實(shí)現(xiàn)了 DynaBean DynaClass 接口, BasicDynaBean BasicDynaClass 實(shí)現(xiàn)了提供一組基本的屬性的能力,這組屬性是由你動(dòng)態(tài)定義的,而且這組屬性中的成員應(yīng)該是 DynaProperty 類的實(shí)例。首先,你要為 DynaClass 創(chuàng)建你所關(guān)心的一組屬性,代碼如下:

          ?

          ?

          示例代碼:

          ?????? ??? DynaProperty[] props = new DynaProperty[]

          {

          ?????? ??????????? new DynaProperty("id",String.class),

          ?????? ??????????? new DynaProperty("name", String.class),

          ?????? ??????????? new DynaProperty("rowNo", int.class),

          ?????? ??????????? new DynaProperty("c1",? long.class),

          ?????? ??????????? new DynaProperty("c2",long.class),

          ?????? ??????????? new DynaProperty("c3",long.class)

          ?????? ??? };

          BasicDynaClass dynaClass = new BasicDynaClass("basicReport", null, props);

          ?

          ?

          ?

          ??????

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ??????

          說明: ?????????????????????????????????????????????????????????????????

          ?????? BasicDynaClass 一共提供了3個(gè)構(gòu)造函數(shù),我這里強(qiáng)調(diào)的只有一點(diǎn),對(duì)于參數(shù)dynaBeanClass的一個(gè)說明。在上面的代碼中,我們指定要?jiǎng)?chuàng)建一個(gè)名稱為“ basicReport ”的DynaBean,dynaBeanClass參數(shù)說明的是你希望系統(tǒng)為你創(chuàng)建的DynaBean的類型是什么,如果為null的話,系統(tǒng)就認(rèn)為你要?jiǎng)?chuàng)建的是BasicDynaBean類型的DynaBean實(shí)例。如果你希望用其他類型代替null的話,那么指定的類應(yīng)該實(shí)現(xiàn)了DynaClass接口,否則就會(huì)拋出IllegalArgumentException 異常 。 ????????????????????????????????????????????????????????????????????????????????????????????????????????????

          ?

          ?

          ????????????????????

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?


          ?????? 在上面的代碼中,我們假設(shè)為 basicReport 創(chuàng)建了 6 個(gè)屬性,同時(shí)告訴了 BasicDynaClass ,我們需要?jiǎng)?chuàng)建一個(gè)名稱為 basicReport 的報(bào)表, basicReport 的類型我們采用默認(rèn)的 BasicDynaBean 。接下來,我們由 dynaClass 對(duì)象為我們實(shí)例化我們?cè)O(shè)置的這個(gè)動(dòng)態(tài)對(duì)象,參考代碼如下:

          ? ??????

          示例代碼:

          ????????????? DynaBean basicReport = dynaClass.newInstance();

          ?????? ??? basicReport.set("id","124578");

          ?????? ??? basicReport.set("name"," 在校生數(shù) ");

          ?????? ??? basicReport.set("rowNo",new Integer(1));

          ?????? ??? basicReport.set("c1",new Long(125));

          ?????? ??? basicReport.set("c2",new Long(125));

          ?????? ??? basicReport.set("c3",new Long(125));

          ?????????????

          ????????????? String id = (String)basicReport.get(“id”);

          ????????????? String name = (String) basicReport.get("name");

          ?????? ??? int rowNo = ((Integer)basicReport.get("rowNo")).intValue();

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?


          ??????

          ?

          ?

          ?

          在上面的代碼中我們完成了 DynaBean 的實(shí)例化 (basicReport) ,并且對(duì)實(shí)例化的 basicReport 進(jìn)行了設(shè)置和獲取的操作。

          關(guān)于 DynaBean 還有其他形式的應(yīng)用,像 ResultSetDynaClass 、 LazyDynaBean 等分別描述了如何處理數(shù)據(jù)庫(kù)檢索結(jié)果集的 DynaBean 處理、以及簡(jiǎn)略 DynaProperties 處理的 LazyDynaBean 的處理方式,這些都能極大地簡(jiǎn)化開發(fā)過程中 JavaBean 的處理,要了解更多請(qǐng)參考 http://jakarta.apache.org/commons/beanutils/api/index.html 。

          上面講述的常常是在邏輯處理時(shí)碰到的,那么在 Struts 框架下動(dòng)態(tài)的頁(yè)面的顯示以及提交是否也有這方面的處理呢?答案是肯定的。

          posted on 2006-10-17 18:12 zhangxl 閱讀(449) 評(píng)論(0)  編輯  收藏 所屬分類: common

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(1)

          隨筆分類(17)

          隨筆檔案(28)

          文章分類(30)

          文章檔案(30)

          相冊(cè)

          收藏夾(2)

          hibernate

          java基礎(chǔ)

          mysql

          xml

          關(guān)注

          壓力測(cè)試

          算法

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 96750
          • 排名 - 600

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 宁武县| 九江市| 武山县| 合江县| 洞头县| 吕梁市| 囊谦县| 武宣县| 星座| 桐柏县| 萨嘎县| 屏边| 松溪县| 上虞市| 泸溪县| 武安市| 游戏| 龙陵县| 安仁县| 上栗县| 鄂伦春自治旗| 沙坪坝区| 商河县| 治县。| 铜山县| 肃南| 蓬安县| 盐山县| 高雄县| 靖安县| 南木林县| 罗甸县| 汽车| 泗洪县| 岳池县| 祁连县| 吕梁市| 奈曼旗| 通辽市| 襄垣县| 塔河县|