一动态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的代码如下
<formbeanname=dynamicFormtype=orgapachestrutsactionDynaActionForm>
<!声明一个简单属性>
<formpropertyname=simpleProptype=javalangStringinitial=bill/>
<!声明一个索引属性>
<formpropertyname=indexedProptype=javalangString[]/>
<!声明一个映射属性>
<formpropertyname=mappedProptype=javautilHashMap/>
<!声明一个嵌套属性>
<formpropertyname=nestedProptype=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方法的定义如下
publicObjectget(Stringname);//读取简单属性
publicObjectget(Stringnameintindex);//读取索引属性
publicObjectget(StringnameStringkey);//读取映射属性
下面的代码演示了如何通过getter方法获得动态Form的属性值
DynaActionFormdForm=(DynaActionForm)form;
Stringname=(String)dFormget(name);
String[]hobbies=(String[])dFormget(hobbies);
Stringvalue=(String)dFormget(myMapkey);
除了上述的get方法外DynaActionForm还提供了getString和getString方法分别用来读取String和String[]类型的属性值这两个方法的定义如下
publicStringgetString(Stringname);
publicString[]getStrings(Stringname);
下面的代码演示了如何通过getString和getStrings方法获得动态Form的属性值
Stringname=dFormgetString(name);//相当于Stringname=(String)dFormget(name);
String[]hobbies=dFormgetStrings(hobbies);//相当于String[]hobbies=(String[])dFormget(hobbies);
在使用getString和getStrings方法时应注意这两个方法只能读取String或String[]类型的属性读取其他类型的属性将会抛出异常
五一个动态Form的例子
我们在这一部分来实现一个完整的动态Form的例子在这个例子中的动态Form有四个属性三个是简单数据类型一个是数组类型完成这个例子需要如下四步
【第步】配置动态Form打开strutsconfigxml在<formbeans>元素中加入如下的内容
<formbeanname=dynamicFormtype=orgapachestrutsactionDynaActionForm>
<formpropertyname=nametype=javalangString/>
<formpropertyname=agetype=javalangShort/>
<formpropertyname=salarytype=javalangFloat/>
<formpropertyname=hobbytype=javalangString[]/>
</formbean>
【第步】编写Struts Action类
这个Struts Action类负责从动态Form中获得属性值并输出到客户端浏览器在<samples工程目录>srcaction目录中建立一个DynamicActionjava文件代码如下
packagechapteraction;
importjavaxservlethttp*;
importorgapachestrutsaction*;
importjavaio*;
publicclassDynamicActionextendsAction
{
publicActionForwardexecute(ActionMappingmappingActionFormform
HttpServletRequestrequestHttpServletResponseresponse)
{
try
{
DynaActionFormdForm=(DynaActionForm)form;
Stringname=(String)dFormget(name);
Shortage=(Short)dFormget(age);
Floatsalary=(Float)dFormget(salary);
//获得数组类型字段值的数组长度
inthobbyCount=((String[])dFormget(hobby))length;
PrintWriterout=responsegetWriter();
outprintln(name:+name+<p/>);
outprintln(age:+age+<p/>);
outprintln(salary:+salary+<p/>);
for(inti=;i<hobbyCount;i++)
outprintln(hobby+(i+)+:+dFormget(hobbyi)+<p/>);
}
catch(Exceptione)
{
}
returnnull;
}
}
【第步】配置Struts Action
打开strutsconfigxml文件在<actionmappings>元素中加入如下的内容
<actionname=dynamicFormpath=/dynamicscope=requesttype=actionDynamicAction/>
【第步】编写用户录入数据的JSP页面
在Web根目录中建立一个dynamicjsp文件代码如下
<%@pagepageEncoding=GBK%>
<%@tagliburi=htmlprefix=html%>
<html>
<head>
<title>测试动态Form</title>
<html:base/>
</head>
<body>
<html:formaction=dynamic>
姓名<html:textproperty=name/> <p>
年龄<html:textproperty=age/> <p>
工资<html:textproperty=salary/> <p>
爱好<html:textproperty=hobbyvalue=/> <p>
爱好<html:textproperty=hobbyvalue=/> <p>
爱好<html:textproperty=hobbyvalue=/> <p>
<html:submitvalue=提交/>
</html:form>
</body>
</html>
启动Tomcat后在IE中输入如下的URL来测试程序
六验证动态Form
有两种方法可以验证动态Form
在DynaActionForm的子类中覆盖validate方法
如果要使用Validator框架来验证动态Form需要用DynaActionForm的子类orgapachestrutsvalidator DynaValidatorForm或其子类来作为动态Form的类型
在使用DynaValidatorForm的了类时要想使用Validator框架的验证机制需要在DynaValidatorForm子类的validate方法的开始位置使用 supervalidate()语句来调用DynaValidatorForm中的validate方法