随笔 - 312, 文章 - 14, 评论 - 1393, 引用 - 0
数据加载中……

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的代码如下:
<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方法的定义如下:

  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还提供了getStringgetString方法,分别用来读取StringString[]类型的属性值,这两个方法的定义如下:

public String getString(String name) ;  
public String[] getStrings(String name) ;

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

String name = dForm.getString(“name”);  // 相当于String name = (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>元素中加入如下的内容:
<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方法

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



Android开发完全讲义(第2版)(本书版权已输出到台湾)

http://product.dangdang.com/product.aspx?product_id=22741502



Android高薪之路:Android程序员面试宝典 http://book.360buy.com/10970314.html


新浪微博:http://t.sina.com.cn/androidguy   昵称:李宁_Lining

posted on 2009-02-16 17:22 银河使者 阅读(4578) 评论(4)  编辑  收藏 所属分类: javaweb 原创struts1.x

评论

# re: Struts1.x系列教程(14):动态Form  回复  更多评论   

在使用DynaValidatorForm的了类时,要想使用Validator框架的验证机制,需要在DynaValidatorForm子类的validate方法的开始位置使用 super.validate()语句来调用DynaValidatorForm中的validate方法。
DynaValidatorForm子类不用自己写吧,super.validate()是自动调用的吧。请楼主指教!
2009-03-06 14:21 | cyqnba

# re: Struts1.x系列教程(14):动态Form  回复  更多评论   

@cyqnba
需要自己写哦
2009-03-06 14:47 | 银河使者

# re: Struts1.x系列教程(14):动态Form[未登录]  回复  更多评论   

宝藏,楼主,我转了,支持你,太感谢你了
2009-05-01 16:41 | tony

# re: Struts1.x系列教程(14):动态Form  回复  更多评论   

thank you so much
2013-03-27 18:37 | kong_kong_er

只有注册用户登录后才能发表评论。


网站导航: