3.1 使用ActionForm
ActionFormBean有兩種存在范圍:request和session。如果ActionForm存在于request范圍,它僅在當前的請求/響應(yīng)生命周期中有效。在請求從一個Web組件轉(zhuǎn)發(fā)到另一個Web組件的過程中,ActionForm實例一直有效。當服務(wù)器把響應(yīng)結(jié)果返回給客戶,ActionForm實例及其包含的數(shù)據(jù)就會被銷毀。如果ActionForm存在于session范圍,同一個ActionForm實例在整個HTTP會話中有效。
當控制器接受到請求時,如果請求訪問的Web組件為Action,并且為這個Action配置了和ActionForm的映射,控制器將從request或session范圍中取出ActionForm實例,如果該實例不存在,就會自動創(chuàng)建一個新的實例。當控制器接受到一個新的請求時,ActionForm的生命周期如下:
· 控制器接收到請求
·從request或session范圍中取出ActionForm實例,如果該實例不存在,就自動創(chuàng)建一個新的實例。
· 調(diào)用ActionForm的reset()方法

·把ActionForm實例保存在request或session范圍中
·把用戶輸入的表單數(shù)據(jù)組裝到ActionForm中
·如果<action>的validate屬性為true,則調(diào)用ActionForm的validate()方法。
· (1)如果存在驗證錯誤,把請求轉(zhuǎn)發(fā)給<action>的input屬性指定的Web組件,ActionForm實例依然保持在request或session范圍內(nèi)。
(2)如果無驗證錯誤,調(diào)用Action的execute()方法,把ActionForm實例傳遞給execute()方法。
·把請求轉(zhuǎn)發(fā)給其他Web組件,ActionForm實例依然保存在request或session范圍內(nèi)。
3.2創(chuàng)建ActionForm
Struts框架中定義的ActionForm類時抽象的,必需在應(yīng)用中創(chuàng)建它的子類,來捕獲具體的HTML表單數(shù)據(jù),ActionFormBean中的屬性和HTML表單中的字段一一對應(yīng)。
1 validate()方法
如果Struts的配置文件滿足以下兩個條件,Struts控制器就會調(diào)用ActionForm的validate()方法:
·為ActionForm配置了Action映射,即<form-bean>元素的name屬性和<action>元素的name屬性匹配。
·<action>元素的validate屬性為true。
在ActionForm基類中定義的validate()方法直接返回null,如果創(chuàng)建了擴展ActionForm基類的子類,那么應(yīng)該在子類中覆蓋validate()方法。
validate()方法主要負責檢查數(shù)據(jù)的格式和語法,而不負責檢查數(shù)據(jù)是否符合業(yè)務(wù)邏輯。
2 reset()方法
不管ActionFormj存在于哪個范圍內(nèi),對于每個請求,控制器都會先調(diào)用ActionForm的reset()方法,然后再把用戶輸入的表單數(shù)據(jù)組裝到ActionForm中。reset()方法用于恢復(fù)ActionForm的屬性的默認值,例如把boolean類型屬性設(shè)為true或false,把字符串屬性設(shè)為null或某個初始值。
如果ActionForm在request范圍內(nèi),那么對于每個新的請求都會創(chuàng)建新的ActionForm實例。當新的實例創(chuàng)建后,如果它的屬性已經(jīng)被初始化為默認值,那么接著再在reset()方法中把屬性設(shè)為默認值不是很有必要,因此在這種情況下,可以讓reset()方法為空。
對于session范圍內(nèi)的ActionForm,同一ActionForm實例會被多個請求共享,reset()方法在這種情況下極為有用。
3.3配置ActionForm
Struts配置文件的<form-beans>元素用來配置所有的ActionFormBean。<form-beans>元素可以包含多個<form-bean>子元素,它代表單個的ActionFormBean。
同一個ActionForm可以和多個Action映射。在<action>元素中,name和scope屬性分別指定ActionForm的名字和范圍,validate屬性指定是否執(zhí)行表單驗證。
3.4 訪問ActionForm
ActionForm可以被JSP、Struts標簽、Action和其他Web組件訪問。訪問ActionForm大致有以下一些方法:
1 使用StrutsHTML標簽庫
StrutsHTML標簽庫提供了一組和ActionForm密切關(guān)聯(lián)的標簽,<html:form>標簽生成HTML表單,它包括<html:text>、<html:select>、<html:option>、<html:radio>和<html:submit>等子標簽,這些子標簽構(gòu)成HTML表單的字段或按鈕。<html:form>標簽?zāi)芎虯ctionForm交互,讀取ActionForm的屬性值,把他們賦值給表單中對應(yīng)的字段。
2從request或session范圍內(nèi)取出ActionForm實例
Struts框架把ActionForm實例保存在HttpServletRequest或HttpSession中,保存時采用的屬性key為<form-bean>元素的name屬性。因此,如果ActionForm在request范圍內(nèi),則可以調(diào)用HttpServletRequest的getAttribute()方法讀取ActionForm實例。如果ActionForm在session范圍內(nèi),則可以調(diào)用HttpSession的getAttribute()方法讀取ActionForm實例。
3在Action類的execute()方法中直接訪問ActionForm
如果配置了ActionForm的Action的映射,Struts框架就會把ActionForm作為參數(shù)傳遞給Action的execute()方法,因此在Action類的execute()方法中可以讀取或設(shè)置ActionForm屬性。
愛華網(wǎng)



