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)單多了。