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

一、动态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 ,就无法使用泛型进行自动类型转换了。
四、访问动态 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)dForm.get( " name " );
String[] hobbies 
=  (String[])dForm.get(“hobbies”);
String value1 
=  (String)dForm.get(“myMap”, “key1”);
    除了上述的 get 方法外, DynaActionForm 还提供了 getString getString 方法,分别用来读取 String String[] 类型的属性值,这两个方法的定义如下:
public  String getString(String name) ;  
public  String[] getStrings(String name) ;
    下面的代码演示了如何通过 getString getStrings 方法获得动态 Form 的属性值:
String name  =  dForm.getString(“name”);   //  相当于String name = (String)dForm.get("name");
String[] hobbies  =  dForm.getStrings(“hobbies”);   //  相当于String[] hobbies = (String[])dForm.get(“hobbies”);
    在使用 getString getStrings 方法时应注意,这两个方法只能读取 String String[] 类型的属性,读取其他类型的属性将会抛出异常。  
五、一个动态 Form 的例子
    我们在这一部分来实现一个完整的动态Form的例子,在这个例子中的动态Form有四个属性,三个是简单数据类型,一个是数组类型。完成这个例子需要如下四步:

【第1步】配置动态Form
    打开struts-config.xml,在<form-beans>元素中加入如下的内容:
< 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 文件,代码如下:
   package  chapter6.action;
  
  
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 ;
      }
  }

【第 3 步】 配置 Struts Action     
    打开struts-config.xml文件,在<action-mappings>元素中加入如下的内容:
   < action  name ="dynamicForm"  path ="/dynamic"  scope ="request"  type ="action.DynamicAction"   />

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

    在Web根目录中建立一个dynamic.jsp文件,代码如下:
   <% @ page pageEncoding = " GBK " %>
  
<% @ 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"   /> &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方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值