虽然ActionForm功能强大,但有些时候使用起来有些麻烦。如每建立一个用户录入界面(JSP页面),就得建立一个ActionForm子类来和这个页面对应。当然,我们可以采用嵌套属性从一定程度上弥补这个问题。但是在建立新的用户录入界面时,仍不可避免地要建立新的ActionForm子类。
对于动态Form来说,Form的类型必须是org.apache.struts.action.DynaActionForm或其子类。声明一个动态Form的代码如下:
<!-- 声明一个简单属性 -->
<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>
- 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
我们可以使用DynaActionForm类的getter方法来读取动态Form中的属性值。DynaActionForm类的getter方法有三个重载形式,分别用来读取简单属性、索引属性和映射属性。这三个getter方法的定义如下:
public Object get(String name, int index) ; // 读取索引属性
public Object get(String name, String key); // 读取映射属性
下面的代码演示了如何通过getter方法获得动态Form的属性值:
String name = (String)dForm.get("name");
String[] hobbies = (String[])dForm.get(“hobbies”);
String value1 = (String)dForm.get(“myMap”, “key1”);
public String[] getStrings(String name) ;
String[] hobbies = dForm.getStrings(“hobbies”); // 相当于String[] hobbies = (String[])dForm.get(“hobbies”);
【第1步】配置动态Form
打开struts-config.xml,在<form-beans>元素中加入如下的内容:
<form-property name="name" type="java.lang.String" />
<form-property name="age" type="java.lang.Short" />
<form-property name="salary" type="java.lang.Float" />
<form-property name="hobby" type="java.lang.String[]" />
</form-bean>
这个Struts Action类负责从动态Form中获得属性值,并输出到客户端浏览器。在<samples工程目录>"src"action目录中建立一个DynamicAction.java文件,代码如下:
import javax.servlet.http.*;
import org.apache.struts.action.*;
import java.io.*;
public class DynamicAction extends Action
{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{
try
{
DynaActionForm dForm = (DynaActionForm) form;
String name = (String) dForm.get("name");
Short age = (Short) dForm.get("age");
Float salary = (Float) dForm.get("salary");
// 获得数组类型字段值的数组长度
int hobbyCount = ((String[]) dForm.get("hobby")).length;
PrintWriter out = response.getWriter();
out.println("name: " + name + "<p/>");
out.println("age: " + age + "<p/>");
out.println("salary: " + salary + "<p/>");
for (int i = 0; i < hobbyCount; i++)
out.println("hobby" + (i + 1) + ": " + dForm.get("hobby", i) + "<p/>");
}
catch (Exception e)
{
}
return null;
}
}
【第4步】编写用户录入数据的JSP页面
在Web根目录中建立一个dynamic.jsp文件,代码如下:
<%@ taglib uri="http://struts.apache.org/tags-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>
爱好1:<html:text property="hobby" value=""/> <p>
爱好2:<html:text property="hobby" value=""/> <p>
爱好3:<html:text property="hobby" value=""/> <p>
<html:submit value="提交" />
</html:form>
</body>
</html>
启动Tomcat后,在IE中输入如下的URL来测试程序:
http://localhost:8080/samples/dynamic.jsp
















