posts - 73,  comments - 55,  trackbacks - 0
          Struts中ActionForm類型對(duì)象的javaBean屬性何時(shí)初使化?
          Struts中涉及到多行提交問(wèn)題時(shí)如何處理?
          (此方法可以處理多行相同數(shù)據(jù)的提交,但表單驗(yàn)證就需要在formbean中實(shí)現(xiàn),不能用動(dòng)態(tài)form的方法了)


          在Strust 中,我們可能經(jīng)常要在 ActionForm 中使用其他 JavaBean 作為屬性類型,這里就存在著如何使用好這些屬性與 HTML Form 之間的數(shù)據(jù)交換。

          如在注冊(cè)書籍界面中,我們通常會(huì)將書籍的各種信息封裝成一個(gè)單獨(dú)的新的Class ,如BookBean ,包含以下屬性:書籍編號(hào) (bookId) ,書籍名稱(bookName) ,出版社(company) ,作者(author) ,版本(state) 等等,這樣條理也比較清晰,以下是這個(gè) ActionForm 的部分代碼:
          public class RegisterBookForm extends ActionForm {?
          ??????? private?String currentUsrId;?
          ????????private?Date currentDate;?
          ??????? private?BookBean book = new BookBean();

          ?? ??? ?………..
          ??????? public BookBean getBook() {
          ????????????????? return book;
          ??????? }
          }
          其中BookBean為:
          public class BookBean {
          ??????? private String bookId = null;
          ??????? private String bookName = null;
          ??????? private String company = null;
          ??????? private String author = null;
          ??????? private int state;
          ??????? public String getBookId() {
          ?????????????????........
          ??????? }
          ??????? public void?setBookId(String bookId) {
          ???????????????? .........
          ??????? }
          ??????? 。。。。
          }
          在RegisterBookForm中我們需要將BookBean實(shí)例化(在reset 函數(shù)中需要重新實(shí)例化),這主要因?yàn)?Struts 的機(jī)制:如我們將 HTML 的 Form 元素(如?bookId )值傳給 ActionForm ,Struts 需要執(zhí)行的操作是 getBook().setBookId(String bookId) ,如果這時(shí)返回的book 對(duì)象為空的話,那么賦值如何進(jìn)行,而且 Struts 也不會(huì)知道如何去實(shí)例化BookBean 。有時(shí)這些 JavaBean 的類型有可能是接口,實(shí)例化更是未知,所以關(guān)于 JavaBean 類型在 ActionForm 中的實(shí)例化,你需要自行完成,而且必須完成。至于在實(shí)際操作中判斷 JavaBean 是否被進(jìn)行過(guò)相關(guān)操作(不再是初始狀態(tài)),你需要自行判斷,其實(shí)也很簡(jiǎn)單,如可在BooBean 類中編寫一個(gè)函數(shù)檢驗(yàn)一下即可。

          ActionForm 創(chuàng)建完畢后,我們需要在 Jsp Form 中引用這些 JavaBean 類型的屬性值,那就很簡(jiǎn)單啦,只需采用“ Form 的屬性名稱”+“ . ”+“ JavaBean 中的屬性名稱”結(jié)構(gòu)構(gòu)成的名稱付給相關(guān)元素即可。如:
          <html:text property="book.bookId"/>
          通過(guò)這種方式我們就可以處理好 ActionForm 中的 JavaBean 類型的屬性值了。

          實(shí)際的情況可能更復(fù)雜些,我們有時(shí)可能要提交多行數(shù)據(jù)到后臺(tái),而且行內(nèi)的數(shù)據(jù)是相關(guān)的,如我們需要執(zhí)行借書操作,要提交的是多本書的信息,這些行內(nèi)的數(shù)據(jù),如bookId ,bookName,company等都是和bookId相關(guān)的。這時(shí)我們構(gòu)建的 ActionForm 中可能需要一個(gè)列表數(shù)據(jù)(ArrayList )類型來(lái)處理這種情況。以下是這個(gè) ActionForm 的部分代碼:
          public class BorrowBookForm extends ActionForm {??
          ?????????? private ArrayList?books = new BorrowArrayList ();?
          ?????????? …..
          }

          在以上代碼中,我們同樣處理了ArrayList 類型數(shù)據(jù)的初始化。Struts 在給ArrayList 中的對(duì)象賦值時(shí),當(dāng)然需要先獲取ArrayList 數(shù)據(jù),然后在獲取ArrayList 中某一個(gè)對(duì)象(通過(guò) Index ),最后給對(duì)象賦值。在這里想我們可以更詳細(xì)點(diǎn)分析瀏覽器端傳過(guò)來(lái)數(shù)據(jù),字段值形式如下:books[0].bookName= StrutsInAction,Struts 獲取 ActionForm 中的ArrayList 數(shù)據(jù)后,通過(guò)Index(此時(shí)為0)來(lái)獲取ArrayList 中封裝的 JavaBean 對(duì)象,然而此時(shí)ArrayList 是空的(盡管初始化了,但是沒有數(shù)據(jù)),是無(wú)法取得封裝的對(duì)象的,因此我們要在Struts 獲取 ArrayList 中封裝的對(duì)象的時(shí)候給它創(chuàng)建一個(gè),這樣就保證對(duì)象的獲取和賦值的成功進(jìn)行,我們新建一個(gè) BorrowArrayList 類,繼承 ArrayList ,只要重寫 get(int index) 方法即可,其實(shí)很簡(jiǎn)單,代碼如下:
          import java.util.ArrayList;


          /**
          ?* <strong>BorrowArrayList</strong>
          ?* <p>書籍借閱時(shí)所有書籍列表</p>
          ?*?
          ?* @author? RenZW
          ?* @version 1.0 2005.09.2
          ?* @since?? 1.0
          ?*/
          public class BorrowArrayList extends ArrayList {
          ??? /*
          ???? * (non-Javadoc)
          ???? *
          ???? * @see java.util.List#get(int)
          ???? */
          ??? public Object get(int index) {
          ??????? while (index >= size()) {
          ??????????? add(new BookBean());
          ??????? }
          ??????? return super.get(index);
          ??? }
          }這樣我們就完成可以多行數(shù)據(jù)提交的 ActionForm 設(shè)計(jì),這里還有點(diǎn)提醒,如果從瀏覽器端傳過(guò)來(lái)的行索引是跳躍是的,如缺少中間行,且首尾行index 相差很大的話,這種方式可能不太適合。這種多行提交形式比較適合對(duì)固定行的數(shù)據(jù)處理。

          下面我們就看看如何在 Jsp 中使用這個(gè) ActionForm ,其實(shí)只需要執(zhí)行一個(gè)循環(huán)即可:
          <logic:iterate id="books"? name=" BorrowBookForm" ?property="books " indexId="index">
          ????? <html:text name="books" property="bookId" indexed="true" />
          ????? <html:text name="books" property="bookName" indexed="true"/>
          ????? .........
          </logic:iterate>

          這里我們?cè)俜治鲆幌拢a中出現(xiàn)的“books”都是ActionForm 中的ArrayList 數(shù)據(jù)類型變量名稱,請(qǐng)確保一致,這也是方便提交到后臺(tái)的數(shù)據(jù)接收。indexed="true" 可以確保生成的 html 元素的名稱唯一,不要缺少這個(gè)聲明

          通過(guò)以上步驟,我們完成了多行數(shù)據(jù)的提交所有環(huán)節(jié),這樣 Struts 就會(huì)完成其他所有的事情,我們的代碼邏輯和實(shí)現(xiàn)也簡(jiǎn)單多了。

          posted on 2006-07-11 09:34 保爾任 閱讀(413) 評(píng)論(0)  編輯  收藏

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


          網(wǎng)站導(dǎo)航:
           

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

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 永年县| 金华市| 怀来县| 石阡县| 松江区| 汪清县| 嵩明县| 遂平县| 健康| 南开区| 突泉县| 香河县| 富蕴县| 宕昌县| 天祝| 双桥区| 滨州市| 印江| 林芝县| 淮南市| 台湾省| 绥滨县| 桃江县| 涞水县| 上犹县| 且末县| 太湖县| 胶州市| 南充市| 台中县| 金平| 大名县| 称多县| 高碑店市| 大宁县| 南阳市| 许昌市| 谷城县| 宝清县| 阿克陶县| 望城县|