Welcome 微信登录

首页 / 软件开发 / JAVA / Struts1.x系列教程(14):动态Form

Struts1.x系列教程(14):动态Form2011-01-10 blogjava 银河使者一、动态Form简介

虽然ActionForm功能强大,但有些时候使用起来有些麻烦。如每建立一个用户录入界面(JSP页面),就得建立一个ActionForm子类来和这个页面对应。当然,我们可以采用嵌套属性从一定程度上弥补这个问题。但是在建立新的用户录入界面时,仍不可避免地要建立新的ActionForm子类。

在Struts1.2.6及以后的Struts版本中提供了一种动态Form的技术。使得不用再建立新的ActionForm就可以封装用户提交的数据。实际上,这种技术将定义ActionForm子类的工作变成了编写XML文件的工作。

每定义一个动态Form,就要在struts-config.xml中加一个<form-bean>元素,并使用<form-property>子元素来定义动态Form的属性。

在本章的最后还会介绍一个LazyValidatorForm类,通过这个类甚至可以不定义动态Form的属性就可以使用动态Form。这将大大简化开发人员的工作量。

二、声明动态Form

声明一个动态Form非常简单,只需要在struts- config.xml的<form-beans>元素中加入一个<form-bean>子元素,并使用<form- property>元素来定义动态Form的属性。我们可以定义的属性类型有简单属性(如String)、索引属性(如数组)、映射属性(如 HashMap)以及嵌套属性(属性类型是另一个类)。

对于动态Form来说,Form的类型必须是org.apache.struts.action.DynaActionForm或其子类。声明一个动态Form的代码如下:

<form-bean name="dynamicForm"type="org.apache.struts.action.DynaActionForm">
<!-- 声明一个简单属性 -->
<form-property name="simpleProp" type="java.lang.String" initial="bill"/>
<!-- 声明一个索引属性 -->
<form-property name="indexedProp" type="java.lang.String[]" />
<!-- 声明一个映射属性 -->
<form-property name="mappedProp" type="java.util.HashMap" />
<!-- 声明一个嵌套属性 -->
<form-property name="nestedProp" type="com.bean.MyBean" />
</form-bean>
三、动态Form的属性类型

下面列出了动态Form支持的简单属性的所有类型:

java.math.BigDecimal

java.math.BigInteger

java.lang.Boolean

java.lang.Byte

java.lang.Character

java.lang.Class

java.lang.Double

java.lang.Float

java.lang.Integer

java.lang.Long

java.lang.Short

java.lang.String

java.sql.Date

java.sql.Time

java.sql.Timestamp

实际上,上面的数据类型就是Java中提供了简单数据类型。它们用在动态Form中和在Java中代表的数据类型是完全一样的。我们还可以使用<form-property>元素的initial属性为动态Form的简单属性指定一个默认值。如在例程6-11中name属性的默认值为“bill”。

对于索引属性的类型来说,可以是数组,也可以是java.util.List接口的类(如ArrayList)。我们还可以为动态Form的属性指定实现java.util.Map接口的类作为数据类型(也就是映射属性)。但遗憾的是,如果使用动态Form,就无法使用泛型进行自动类型转换了。