ActionForm
ActionForm 表示 HTTP窗體中的數(shù)據(jù),可以將其看作是模型和視圖的中介,它負責保存視圖中的數(shù)據(jù)供模型或者視圖使用。ActionForm還具有的過濾保護的作用,只有通過ActionForm 驗證的數(shù)據(jù)才能夠發(fā)送到 Action 處理。
ActionForm Bean從應(yīng)用和配置的角度分為兩類:動態(tài)ActionForm和靜態(tài)ActionForm和LazyForm。作用一樣,只是實現(xiàn)不一樣。
一.靜態(tài)Form
由程序員手工編寫Form
1.ActionForm
提交表單的字段名和form中的屬性名一致。
2.ValidatorForm
用于驗證框架的Form,在請求參數(shù)前,先使用驗證框架驗證。
在struts-config中對應(yīng)的action標簽的validate值為true。
3.ValidatorActionForm
二.動態(tài)ActionForm
通過配置文件完成ActionForm配置
1.DynaActionForm
Java代碼
2.DynaValidatorForm
和ValidatorForm一樣在使用驗證框架時使用。配置和DynaActionForm類似。
type="org.apache.struts.validator.DynaValidatorForm"
3.DynaValidatorActionForm
ValidatorActionForm和DynaValidatorActionForm也都是在使用驗證框架時使用,和DynaValidatorForm及ValidatorForm不同的是,在配置validtion.xml中<formname=path> name使用的是action的path屬性值。以此來區(qū)分不同請求的驗證規(guī)則。
三.還有一種特殊的Form:LazyValidatorForm。
<form-beanname="loginForm"type="org.apache.struts.validator.LazyValidatorForm"></form-bean>
我們沒有配置form的屬性。所以在jsp頁面中必須使用struts標簽。
Jsp代碼
這樣就可以直接進行驗證框架和action中的取值。
Java代碼
四、ActionForm賦值原理
我們?nèi)绻懒?/span>Struts的流程,那么理解起ActionForm的賦值過程來就簡單了很多,大家都知道,點擊提交后,會先初始化ActionServlet類,當接收到請求時,會調(diào)用service對象檢查HTTP請求類型,通過doGet()或doPost()方法調(diào)用process()方法。在ActionServlet中會調(diào)用RequestProcessor的process()方法進行處理,該方法負責創(chuàng)建ActionForm對象,創(chuàng)建成功之后,首先執(zhí)行ActionForm中的reset()方法進行重置,然后得到表單中所有輸入域的name名稱,再調(diào)用request.getParameterValues(),根據(jù)name名稱得到相應(yīng)的值,最后將表單中的數(shù)據(jù)全部放到map中,map的key為表單輸入域的名稱,map的value為表單輸入域的值,接下來調(diào)用一個第三方組件BeanUtils,將Map中的值,根據(jù)ActionForm中的類型先轉(zhuǎn)換好,再調(diào)用ActionForm中的setter方法設(shè)置到ActionForm上。
reset()方法:
賦值流程:
簡單順序:先調(diào)用構(gòu)造方法(判斷是否存在)――reset(重置)――setter(設(shè)定值)
五、總結(jié)
ActionForm是在Struts1中存在的一個常用類,ActionForm幫助我們實現(xiàn)了自動設(shè)置數(shù)據(jù),使得程序員的使用變得簡單,不用關(guān)心賦值之類的事情而專注于業(yè)務(wù)。Struts2出現(xiàn)后,不用人們手動寫ActionForm了,但是這種思想我們需要了解。