一動態Form簡介
雖然ActionForm功能強大但有些時候使用起來有些麻煩如每建立一個用戶錄入界面(JSP頁面)就得建立一個ActionForm子類來和這個頁面對應當然我們可以采用嵌套屬性從一定程度上彌補這個問題但是在建立新的用戶錄入界面時仍不可避免地要建立新的ActionForm子類
在Struts及以後的Struts版本中提供了一種動態Form的技術使得不用再建立新的ActionForm就可以封裝用戶提交的數據實際上這種技術將定義ActionForm子類的工作變成了編寫XML文件的工作
每定義一個動態Form就要在strutsconfigxml中加一個<formbean>元素並使用<formproperty>子元素來定義動態Form的屬性
在本章的最後還會介紹一個LazyValidatorForm類通過這個類甚至可以不定義動態Form的屬性就可以使用動態Form這將大大簡化開發人員的工作量
二聲明動態Form
聲明一個動態Form非常簡單只需要在struts configxml的<formbeans>元素中加入一個<formbean>子元素並使用<form property>元素來定義動態Form的屬性我們可以定義的屬性類型有簡單屬性(如String)索引屬性(如數組)映射屬性(如 HashMap)以及嵌套屬性(屬性類型是另一個類)
對於動態Form來說Form的類型必須是orgapachestrutsactionDynaActionForm或其子類聲明一個動態Form的代碼如下
<formbean name=dynamicForm type=orgapachestrutsactionDynaActionForm>
<! 聲明一個簡單屬性 >
<formproperty name=simpleProp type=javalangString initial=bill/>
<! 聲明一個索引屬性 >
<formproperty name=indexedProp type=javalangString[] />
<! 聲明一個映射屬性 >
<formproperty name=mappedProp type=javautilHashMap />
<! 聲明一個嵌套屬性 >
<formproperty name=nestedProp type=combeanMyBean />
</formbean>
三動態Form的屬性類型
下面列出了動態Form支持的簡單屬性的所有類型
javamathBigDecimal
javamathBigInteger
javalangBoolean
javalangByte
javalangCharacter
javalangClass
javalangDouble
javalangFloat
javalangInteger
javalangLong
javalangShort
javalangString
javasqlDate
javasqlTime
javasqlTimestamp
實際上上面的數據類型就是Java中提供了簡單數據類型它們用在動態Form中和在Java中代表的數據類型是完全一樣的我們還可以使用<formproperty>元素的initial屬性為動態Form的簡單屬性指定一個默認值如在例程中name屬性的默認值為bill
對於索引屬性的類型來說可以是數組也可以是javautilList接口的類(如ArrayList)我們還可以為動態Form的屬性指定實現javautilMap接口的類作為數據類型(也就是映射屬性)但遺憾的是如果使用動態Form就無法使用泛型進行自動類型轉換了
四訪問動態Form
我們可以使用DynaActionForm類的getter方法來讀取動態Form中的屬性值DynaActionForm類的getter方法有三個重載形式分別用來讀取簡單屬性索引屬性和映射屬性這三個getter方法的定義如下
public Object get(String name) ; // 讀取簡單屬性
public Object get(String name int index) ; // 讀取索引屬性
public Object get(String name String key); // 讀取映射屬性
下面的代碼演示了如何通過getter方法獲得動態Form的屬性值
DynaActionForm dForm = (DynaActionForm)form;
String name = (String)dFormget(name);
String[] hobbies = (String[])dFormget(hobbies);
String value = (String)dFormget(myMap key);
除了上述的get方法外DynaActionForm還提供了getString和getString方法分別用來讀取String和String[]類型的屬性值這兩個方法的定義如下
public String getString(String name) ;
public String[] getStrings(String name) ;
下面的代碼演示了如何通過getString和getStrings方法獲得動態Form的屬性值
String name = dFormgetString(name); // 相當於String name = (String)dFormget(name);
String[] hobbies = dFormgetStrings(hobbies); // 相當於String[] hobbies = (String[])dFormget(hobbies);
在使用getString和getStrings方法時應注意這兩個方法只能讀取String或String[]類型的屬性讀取其他類型的屬性將會拋出異常
五一個動態Form的例子
我們在這一部分來實現一個完整的動態Form的例子在這個例子中的動態Form有四個屬性三個是簡單數據類型一個是數組類型完成這個例子需要如下四步
【第步】配置動態Form打開strutsconfigxml在<formbeans>元素中加入如下的內容
<formbean name=dynamicForm type=orgapachestrutsactionDynaActionForm>
<formproperty name=name type=javalangString />
<formproperty name=age type=javalangShort />
<formproperty name=salary type=javalangFloat />
<formproperty name=hobby type=javalangString[] />
</formbean>
【第步】編寫Struts Action類
這個Struts Action類負責從動態Form中獲得屬性值並輸出到客戶端浏覽器在<samples工程目錄>srcaction目錄中建立一個DynamicActionjava文件代碼如下
package chapteraction;
import javaxservlethttp*;
import orgapachestrutsaction*;
import javaio*;
public class DynamicAction extends Action
{
public ActionForward execute(ActionMapping mapping ActionForm form
HttpServletRequest request HttpServletResponse response)
{
try
{
DynaActionForm dForm = (DynaActionForm) form;
String name = (String) dFormget(name);
Short age = (Short) dFormget(age);
Float salary = (Float) dFormget(salary);
// 獲得數組類型字段值的數組長度
int hobbyCount = ((String[]) dFormget(hobby))length;
PrintWriter out = responsegetWriter();
outprintln(name: + name + <p/>);
outprintln(age: + age + <p/>);
outprintln(salary: + salary + <p/>);
for (int i = ; i < hobbyCount; i++)
outprintln(hobby + (i + ) + : + dFormget(hobby i) + <p/>);
}
catch (Exception e)
{
}
return null;
}
}
【第步】配置Struts Action
打開strutsconfigxml文件在<actionmappings>元素中加入如下的內容
<action name=dynamicForm path=/dynamic scope=request type=actionDynamicAction />
【第步】編寫用戶錄入數據的JSP頁面
在Web根目錄中建立一個dynamicjsp文件代碼如下
<%@ page pageEncoding=GBK%>
<%@ taglib uri=html prefix=html%>
<html>
<head>
<title>測試動態Form</title>
<html:base/>
</head>
<body>
<html:form action=dynamic >
姓 名<html:text property=name /> <p>
年 齡<html:text property=age /> <p>
工 資<html:text property=salary /> <p>
愛好<html:text property=hobby value=/> <p>
愛好<html:text property=hobby value=/> <p>
愛好<html:text property=hobby value=/> <p>
<html:submit value=提交 />
</html:form>
</body>
</html>
啟動Tomcat後在IE中輸入如下的URL來測試程序
六驗證動態Form
有兩種方法可以驗證動態Form
在DynaActionForm的子類中覆蓋validate方法
如果要使用Validator框架來驗證動態Form需要用DynaActionForm的子類orgapachestrutsvalidator DynaValidatorForm或其子類來作為動態Form的類型
在使用DynaValidatorForm的了類時要想使用Validator框架的驗證機制需要在DynaValidatorForm子類的validate方法的開始位置使用 supervalidate()語句來調用DynaValidatorForm中的validate方法
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28114.html