?在 Strust 中,我們可能經常要在 ActionForm 中使用其他 JavaBean 作為屬性類型,這里就存在著如何使用好這些屬性與 HTML Form 之間的數據交換,下面我們就這些問題做一講解。
如在用戶注冊界面中,我們通常會將用戶的聯系方式形成一個單獨的新的 Class ,如 Contact ,包含以下屬性:電話 (tel) ,手機(cell) , Email(email) , QQ(qq) ,通信地址 (adress) 等等,這樣條理也比較清晰,以下是這個ActionForm 的部分代碼:
public class RegisterForm extends ActionForm
{
private Integer id;
private String logonName;
private String realName;
private Contact contact=new Contact();
………..
}
在這里我們需要將 Contact 實例化(在 reset 函數中需要重新實例化),這主要因為 Struts 的機制:如我們將 HTML 的Form 元素(如 email )值傳給 ActionForm , Struts 需要執行的操作是getContact().setEmail(String email) ,如果這時返回的 contact 對象為空的話,那么賦值如何進行,而且Struts 也不會知道如何去實例化 Contact ,有時這些 JavaBean 的類型有可能是接口,實例化更是未知,所以關于JavaBean 類型在 ActionForm 中的實例化,你需要自行完成,而且必須完成。至于在實際操作中判斷 JavaBean是否被進行過相關操作(不再是初始狀態),你需要自行判斷,其實也很簡單,如可在 Contact 類中編寫一個函數檢驗一下即可。
ActionForm 創建完畢后,我們需要在 Jsp Form 中引用這些 JavaBean 類型的屬性值,那就很簡單啦,只需采用“ Form 的屬性名稱”+“ . ”+“ JavaBean 中的屬性名稱”結構構成的名稱付給相關元素即可。如:
<html:text property="contact.email">
通過這種方式我們就可以處理好 ActionForm 中的 JavaBean 類型的屬性值了。
實際的情況可能更復雜些,我們有時可能要提交多行數據到后退,而且行內的數據是相關的,如我們需要提交多個用戶的聯系方式,這些行內的數據,如email ,電話,手機,這些數據都是和用戶編碼相關的,現在我們修改一下 Contact 類,添加一個用戶編碼 (userId)屬性,這時我們構建的 ActionForm 中可能需要一個列表數據( List )類型來處理這種情況。以下是這個 ActionForm的部分代碼:
public class ModifyBatchContactForm extends ActionForm
{
private List contact =new AutoArrayList (Contact.class);
…..
}
在以上代碼中,我們同樣處理了 List 類型數據的初始化。 Struts 在給 List 中的對象賦值時,當然需要先獲取 List數據,然后在獲取 List 中某一個對象(通過 Index),最后給對象賦值。在這里想我們可以更詳細點分析瀏覽器端傳過來數據,字段值形式如下:contact[0].email= linux_china@hotmail.com , Struts 獲取 ActionForm 中的 List數據后,通過 Index (此時為 0 )來獲取 List 中封裝的 JavaBean 對象,然而此時 List是空的(盡管初始化了,但是沒有數據),是無法取得封裝的對象的,因此我們要在 Struts 獲取 List中封裝的對象的時候給它創建一個,這樣就保證對象的獲取和賦值的成功進行,所有我們新建一個 AutoArrayList 類,繼承ArrayList ,只要重寫 get(int index) 方法即可,其實很簡單,代碼如下:
public class AutoArrayList extends ArrayList {
private Class itemClass;
public AutoArrayList(Class itemClass) {
this.itemClass = itemClass;
}
public Object get(int index) {
try {
while (index >= size()) {
add( itemClass.newInstance());
}
} catch (Exception e) {
e.printStackTrace();
}
return super.get(index);
}
}
這樣我們就完成可以多行數據提交的 ActionForm設計,這里還有點提醒,如果從瀏覽器端傳過來的行索引是跳躍是的,如缺少中間行,而你不想要這些數據的話,且首尾行 index相差很大的話,這種方式可能不太適合。這種多行提交形式比較適合對固定行的數據處理。如果行數不固定的話,你可以參考使用 MapForm 方式實現。
下面我們就看看如何在 Jsp 中使用這個 ActionForm ,其實只需要執行一個循環即可:
<logic:iterate id=" contact " name=" FormName " property=" contact " indexid="index">
<html:text name=" contact " property="userId" indexed="true">
<html:text name=" contact " property="email" indexed="true">
</html:text>
這里我們再講解一下,代碼中出現的“ contact ”(紅色)都是 ActionForm 中的 List數據類型變量名稱,請確保一致,請不要更改名稱,這也是方便提交到后臺的數據接收。“ FormName ”為在 struts-config中聲明的 ActionForm 名稱。 indexed="true" 可以確保生成的 html 元素的名稱唯一,不要缺少這個聲明。以上的Jsp 代碼,你也可以使用 JSTL 來完成,就看你習慣如何了。
通過以上步驟,我們完成了多行數據的提交所有環節,這樣 Struts 就會完成其他所有的事情,我們的代碼邏輯和實現也簡單多了。
總結:通過以上兩個例子,相以信對 ActionForm 中使用 JavaBean 和 List 類型數據不會再陌生,同時使用 Map類型,這樣可創建更好的 ActionForm 設計,關于 MapForm ,請參考http://www.jetmaven.net/documents/j_mapformInStruts.php 。不過引入這種方式后,在Validator 方面你可能要花點腦筋啦(如通過 XDoclet 生成 Validator文件可能功能不全),可能你需要手寫一些代碼來完成相關工作</html:text></logic:iterate></html:text>
如在用戶注冊界面中,我們通常會將用戶的聯系方式形成一個單獨的新的 Class ,如 Contact ,包含以下屬性:電話 (tel) ,手機(cell) , Email(email) , QQ(qq) ,通信地址 (adress) 等等,這樣條理也比較清晰,以下是這個ActionForm 的部分代碼:
public class RegisterForm extends ActionForm
{
private Integer id;
private String logonName;
private String realName;
private Contact contact=new Contact();
………..
}
在這里我們需要將 Contact 實例化(在 reset 函數中需要重新實例化),這主要因為 Struts 的機制:如我們將 HTML 的Form 元素(如 email )值傳給 ActionForm , Struts 需要執行的操作是getContact().setEmail(String email) ,如果這時返回的 contact 對象為空的話,那么賦值如何進行,而且Struts 也不會知道如何去實例化 Contact ,有時這些 JavaBean 的類型有可能是接口,實例化更是未知,所以關于JavaBean 類型在 ActionForm 中的實例化,你需要自行完成,而且必須完成。至于在實際操作中判斷 JavaBean是否被進行過相關操作(不再是初始狀態),你需要自行判斷,其實也很簡單,如可在 Contact 類中編寫一個函數檢驗一下即可。
ActionForm 創建完畢后,我們需要在 Jsp Form 中引用這些 JavaBean 類型的屬性值,那就很簡單啦,只需采用“ Form 的屬性名稱”+“ . ”+“ JavaBean 中的屬性名稱”結構構成的名稱付給相關元素即可。如:
<html:text property="contact.email">
通過這種方式我們就可以處理好 ActionForm 中的 JavaBean 類型的屬性值了。
實際的情況可能更復雜些,我們有時可能要提交多行數據到后退,而且行內的數據是相關的,如我們需要提交多個用戶的聯系方式,這些行內的數據,如email ,電話,手機,這些數據都是和用戶編碼相關的,現在我們修改一下 Contact 類,添加一個用戶編碼 (userId)屬性,這時我們構建的 ActionForm 中可能需要一個列表數據( List )類型來處理這種情況。以下是這個 ActionForm的部分代碼:
public class ModifyBatchContactForm extends ActionForm
{
private List contact =new AutoArrayList (Contact.class);
…..
}
在以上代碼中,我們同樣處理了 List 類型數據的初始化。 Struts 在給 List 中的對象賦值時,當然需要先獲取 List數據,然后在獲取 List 中某一個對象(通過 Index),最后給對象賦值。在這里想我們可以更詳細點分析瀏覽器端傳過來數據,字段值形式如下:contact[0].email= linux_china@hotmail.com , Struts 獲取 ActionForm 中的 List數據后,通過 Index (此時為 0 )來獲取 List 中封裝的 JavaBean 對象,然而此時 List是空的(盡管初始化了,但是沒有數據),是無法取得封裝的對象的,因此我們要在 Struts 獲取 List中封裝的對象的時候給它創建一個,這樣就保證對象的獲取和賦值的成功進行,所有我們新建一個 AutoArrayList 類,繼承ArrayList ,只要重寫 get(int index) 方法即可,其實很簡單,代碼如下:
public class AutoArrayList extends ArrayList {
private Class itemClass;
public AutoArrayList(Class itemClass) {
this.itemClass = itemClass;
}
public Object get(int index) {
try {
while (index >= size()) {
add( itemClass.newInstance());
}
} catch (Exception e) {
e.printStackTrace();
}
return super.get(index);
}
}
這樣我們就完成可以多行數據提交的 ActionForm設計,這里還有點提醒,如果從瀏覽器端傳過來的行索引是跳躍是的,如缺少中間行,而你不想要這些數據的話,且首尾行 index相差很大的話,這種方式可能不太適合。這種多行提交形式比較適合對固定行的數據處理。如果行數不固定的話,你可以參考使用 MapForm 方式實現。
下面我們就看看如何在 Jsp 中使用這個 ActionForm ,其實只需要執行一個循環即可:
<logic:iterate id=" contact " name=" FormName " property=" contact " indexid="index">
<html:text name=" contact " property="userId" indexed="true">
<html:text name=" contact " property="email" indexed="true">
</html:text>
這里我們再講解一下,代碼中出現的“ contact ”(紅色)都是 ActionForm 中的 List數據類型變量名稱,請確保一致,請不要更改名稱,這也是方便提交到后臺的數據接收。“ FormName ”為在 struts-config中聲明的 ActionForm 名稱。 indexed="true" 可以確保生成的 html 元素的名稱唯一,不要缺少這個聲明。以上的Jsp 代碼,你也可以使用 JSTL 來完成,就看你習慣如何了。
通過以上步驟,我們完成了多行數據的提交所有環節,這樣 Struts 就會完成其他所有的事情,我們的代碼邏輯和實現也簡單多了。
總結:通過以上兩個例子,相以信對 ActionForm 中使用 JavaBean 和 List 類型數據不會再陌生,同時使用 Map類型,這樣可創建更好的 ActionForm 設計,關于 MapForm ,請參考http://www.jetmaven.net/documents/j_mapformInStruts.php 。不過引入這種方式后,在Validator 方面你可能要花點腦筋啦(如通過 XDoclet 生成 Validator文件可能功能不全),可能你需要手寫一些代碼來完成相關工作</html:text></logic:iterate></html:text>