Struts中ActionForm類型對象的javaBean屬性何時初使化?
Struts中涉及到多行提交問題時如何處理?
(此方法可以處理多行相同數據的提交,但表單驗證就需要在formbean中實現,不能用動態form的方法了)
在Strust 中,我們可能經常要在 ActionForm 中使用其他 JavaBean 作為屬性類型,這里就存在著如何使用好這些屬性與 HTML Form 之間的數據交換。
如在注冊書籍界面中,我們通常會將書籍的各種信息封裝成一個單獨的新的Class ,如BookBean ,包含以下屬性:書籍編號 (bookId) ,書籍名稱(bookName) ,出版社(company) ,作者(author) ,版本(state) 等等,這樣條理也比較清晰,以下是這個 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實例化(在reset 函數中需要重新實例化),這主要因為 Struts 的機制:如我們將 HTML 的 Form 元素(如?bookId )值傳給 ActionForm ,Struts 需要執行的操作是 getBook().setBookId(String bookId) ,如果這時返回的book 對象為空的話,那么賦值如何進行,而且 Struts 也不會知道如何去實例化BookBean 。有時這些 JavaBean 的類型有可能是接口,實例化更是未知,所以關于 JavaBean 類型在 ActionForm 中的實例化,你需要自行完成,而且必須完成。至于在實際操作中判斷 JavaBean 是否被進行過相關操作(不再是初始狀態),你需要自行判斷,其實也很簡單,如可在BooBean 類中編寫一個函數檢驗一下即可。
ActionForm 創建完畢后,我們需要在 Jsp Form 中引用這些 JavaBean 類型的屬性值,那就很簡單啦,只需采用“ Form 的屬性名稱”+“ . ”+“ JavaBean 中的屬性名稱”結構構成的名稱付給相關元素即可。如:
<html:text property="book.bookId"/>
通過這種方式我們就可以處理好 ActionForm 中的 JavaBean 類型的屬性值了。
實際的情況可能更復雜些,我們有時可能要提交多行數據到后臺,而且行內的數據是相關的,如我們需要執行借書操作,要提交的是多本書的信息,這些行內的數據,如bookId ,bookName,company等都是和bookId相關的。這時我們構建的 ActionForm 中可能需要一個列表數據(ArrayList )類型來處理這種情況。以下是這個 ActionForm 的部分代碼:
public class BorrowBookForm extends ActionForm {??
?????????? private ArrayList?books = new BorrowArrayList ();?
?????????? …..
}
在以上代碼中,我們同樣處理了ArrayList 類型數據的初始化。Struts 在給ArrayList 中的對象賦值時,當然需要先獲取ArrayList 數據,然后在獲取ArrayList 中某一個對象(通過 Index ),最后給對象賦值。在這里想我們可以更詳細點分析瀏覽器端傳過來數據,字段值形式如下:books[0].bookName= StrutsInAction,Struts 獲取 ActionForm 中的ArrayList 數據后,通過Index(此時為0)來獲取ArrayList 中封裝的 JavaBean 對象,然而此時ArrayList 是空的(盡管初始化了,但是沒有數據),是無法取得封裝的對象的,因此我們要在Struts 獲取 ArrayList 中封裝的對象的時候給它創建一個,這樣就保證對象的獲取和賦值的成功進行,我們新建一個 BorrowArrayList 類,繼承 ArrayList ,只要重寫 get(int index) 方法即可,其實很簡單,代碼如下:
import java.util.ArrayList;
/**
?* <strong>BorrowArrayList</strong>
?* <p>書籍借閱時所有書籍列表</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);
??? }
}這樣我們就完成可以多行數據提交的 ActionForm 設計,這里還有點提醒,如果從瀏覽器端傳過來的行索引是跳躍是的,如缺少中間行,且首尾行index 相差很大的話,這種方式可能不太適合。這種多行提交形式比較適合對固定行的數據處理。
下面我們就看看如何在 Jsp 中使用這個 ActionForm ,其實只需要執行一個循環即可:
<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>
這里我們再分析一下,代碼中出現的“books”都是ActionForm 中的ArrayList 數據類型變量名稱,請確保一致,這也是方便提交到后臺的數據接收。indexed="true" 可以確保生成的 html 元素的名稱唯一,不要缺少這個聲明。
通過以上步驟,我們完成了多行數據的提交所有環節,這樣 Struts 就會完成其他所有的事情,我們的代碼邏輯和實現也簡單多了。
posted on 2006-07-11 09:34
保爾任 閱讀(412)
評論(0) 編輯 收藏