使用ActionForm可以給開發人員在處理HTML表單時帶來極大的協助,它簡化了代碼的編寫,並提供了自動的資料驗證。但是,ActionForm也存在幾個非常明顯的缺點。
首先,如果ActionForm對應的HTML表單添加或刪除一些屬性,ActionForm類就可能需要修改並重新編譯;
其次,如果HTML表單是動態,那麼ActionForm更是無能為力了;
另外,ActionForm增加了項目中類的絕對數量!
於是從Struts1.1起,就引入了動態ActionForm(DyanActionForm)概念。動態ActionForm使得使用者無須為應用程式的每一個HTML表單建立具體的ActionForm類。Struts架構套件中的DyanActionForm類及其子類實現了動態ActionForm.
DyanActionForm類擴充了 ActionForm類。使用者可以直接使用DyanActionForm
類,或者擴充該類以覆蓋其validate和reset方法!
配置動態ActionForm
動態ActionForm支援在Struts設定檔中完成ActionForm的全部配置,無須編寫
任何額外的JAVA代碼。以下為樣本:<!-- 動態FORM示範 -->
<form-bean name="dynaFormForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="userName" type="java.lang.String" />
<form-property name="userPwd" type="java.lang.String" />
</form-bean>
在上述代碼中<form-bean>的type屬性指定了使用Struts架構套件中的DynaActionForm類,使用者也可以擴充這個類,實現自訂的動態ActionForm。
在Action中訪問動態ActionForm
同普通的ActionForm一樣,Action類和JSP都可以訪問動態ActionForm,而訪問方式也基本一致。訪問動態ActionForm與訪問普通的ActionForm的最大區別在於對屬性的訪問方式不同。在標準的ActionForm中,針對每一個屬性都提供了getter和setter方法來讀取和設定屬性,而DynaActionForm把所有的屬性儲存在一個Map 對象中,因此訪問DyanActionForm中的屬性與訪問Map對象中的方法類似:
在這裡我用上面配置的動態ActionForm來樣本如何訪問動態ActionFormDynaActionForm dynaForm =(DynaActionForm)form;
String userName = (String)dynaForm.get("userName");
String userPwd = (String)dynaForm.getString("userPwd");
//dynaForm.set("userName", "fengyan");設定值!
動態ActionForm的表單驗證
DynaActionForm類的validate()方法沒有提供任何預設的驗證行為。可以通過定義擴充DynaActionForm類的子類,然後覆蓋validate()方法,但是以編程方式來驗證動態ActionForm並不是一種理想的辦法。動態ActionForm的驗證應該使用Struts的Validator驗證外掛程式。Validator外掛程式允許採用特定的設定檔為動態ActionForm配置驗證規則,如檢查必須的輸入欄位,日期時間等 。
關於DynaActionForm的驗證以及驗證外掛程式我將 寫在下一筆記中!