Struts1.x系列教程(14):动态Form

本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇:Struts1.x系列教程(13):国际化

一、动态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的代码如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> < 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-11name属性的默认值为“bill”。

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

四、访问动态Form

我们可以使用DynaActionForm类的getter方法来读取动态Form中的属性值。DynaActionForm类的getter方法有三个重载形式,分别用来读取简单属性、索引属性和映射属性。这三个getter方法的定义如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> public Objectget(Stringname); // 读取简单属性
public Objectget(Stringname, int index); // 读取索引属性
public Objectget(Stringname,Stringkey); // 读取映射属性

下面的代码演示了如何通过getter方法获得动态Form的属性值:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> DynaActionFormdForm = (DynaActionForm)form;
Stringname
= (String)dForm.get( " name " );
String[]hobbies
= (String[])dForm.get(“hobbies”);
Stringvalue1
= (String)dForm.get(“myMap”,“key1”);

除了上述的get方法外,DynaActionForm还提供了getStringgetString方法,分别用来读取StringString[]类型的属性值,这两个方法的定义如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> public StringgetString(Stringname);
public String[]getStrings(Stringname);

下面的代码演示了如何通过getStringgetStrings方法获得动态Form的属性值:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> Stringname = dForm.getString(“name”); // 相当于Stringname=(String)dForm.get("name");
String[]hobbies = dForm.getStrings(“hobbies”); // 相当于String[]hobbies=(String[])dForm.get(“hobbies”);

在使用getStringgetStrings方法时应注意,这两个方法只能读取StringString[]类型的属性,读取其他类型的属性将会抛出异常。

五、一个动态Form的例子

我们在这一部分来实现一个完整的动态Form的例子,在这个例子中的动态Form有四个属性,三个是简单数据类型,一个是数组类型。完成这个例子需要如下四步:

【第1步】配置动态Form
打开struts-config.xml,在<form-beans>元素中加入如下的内容:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> < form-bean name ="dynamicForm" type ="org.apache.struts.action.DynaActionForm" >
< 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 >

【第2步】编写Struts Action类
这个Struts Action类负责从动态Form中获得属性值,并输出到客户端浏览器。在<samples工程目录>"src"action目录中建立一个DynamicAction.java文件,代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> package chapter6.action;

import javax.servlet.http. * ;
import org.apache.struts.action. * ;
import java.io. * ;

public class DynamicAction extends Action
{
public ActionForwardexecute(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)
{
try
{
DynaActionFormdForm
= (DynaActionForm)form;
Stringname
= (String)dForm.get( " name " );
Shortage
= (Short)dForm.get( " age " );
Floatsalary
= (Float)dForm.get( " salary " );
// 获得数组类型字段值的数组长度
int hobbyCount = ((String[])dForm.get( " hobby " )).length;
PrintWriterout
= 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 (Exceptione)
{
}
return null ;
}
}

【第3步】配置Struts Action

打开struts-config.xml文件,在<action-mappings>元素中加入如下的内容:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> < action name ="dynamicForm" path ="/dynamic" scope ="request" type ="action.DynamicAction" />

【第4步】
编写用户录入数据的 JSP 页面

在Web根目录中建立一个dynamic.jsp文件,代码如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> <% @pagepageEncoding = " GBK " %>
<% @tagliburi = " 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" /> &nbsp;&nbsp; < p >
年龄:
< html:text property ="age" /> &nbsp;&nbsp; < p >
工资:
< html:text property ="salary" /> &nbsp;&nbsp; < p >
爱好1:
< html:text property ="hobby" value ="" /> &nbsp;&nbsp; < p >
爱好2:
< html:text property ="hobby" value ="" /> &nbsp;&nbsp; < p >
爱好3:
< html:text property ="hobby" value ="" /> &nbsp;&nbsp; < p >
< html:submit value ="提交" />
</ html:form >
</ body >
</ html >

启动Tomcat后,在IE中输入如下的URL来测试程序:

http://localhost:8080/samples/dynamic.jsp

六、验证动态Form

有两种方法可以验证动态Form

1.DynaActionForm的子类中覆盖validate方法。

2.如果要使用Validator框架来验证动态Form,需要用DynaActionForm的子类org.apache.struts.validator. DynaValidatorForm或其子类来作为动态Form的类型。

在使用DynaValidatorForm的了类时,要想 使用Validator框架的验证机制,需要在DynaValidatorForm子类的validate方法的开始位置使用 super.validate()语句来调用DynaValidatorForm中的validate方法

下一篇: Struts1.x系列教程(15):使用DownloadAction类统计文件下载次数

国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值