动态ActionForm的使用

 
使用 ActionForm 可以给开发者在处理 HTML 表单时带来极大的帮助,它简化了代码的编写,并提供了自动的数据验证。但是, ActionForm 也存在几个非常明显的缺点。
 
首先,如果 ActionForm 对应的 HTML 表单添加或删除一些属性, ActionForm 类就可能需要修改并重新编译 ;
 
其次,如果 HTML 表单是动态的,那么 ActionForm 更是无能为力了 ;
 
另外, ActionForm 增加了项目中类的绝对数量!
 
于是从 Struts1.1 起,就引入了动态 ActionForm(DyanActionForm) 概念。动态 ActionForm 使得用户无须为应用程序的每一个 HTML 表单创建具体的 ActionForm 类。 Struts 框架包中的 DyanActionForm 类及其子类实现了动态 ActionForm.
   DyanActionForm
类扩展了 ActionForm 类。用户可以直接使用 DyanActionForm
  
类,或者扩展该类以覆盖其 validate reset 方法!
 
配置动态 ActionForm
  
动态 ActionForm 支持在 Struts 配置文件中完成 ActionForm 的全部配置,无须编写
  
任何额外的 JAVA 代码。以下为示例:
<!--  动态 FORM 演示                         -->
      
< form-bean  name ="dynaFormForm"  type ="org.apache.struts.action.DynaActionForm">
      
< form-property  name ="userName"  type ="java.lang.String"  />
      
< form-property  name ="userPwd"  type ="java.lang.String"  />
    
</ form-bean >
在上述代码中 <form-bean> type 属性指定了使用 Struts 框架包中的 DynaActionForm 类,用户也可以扩展这个类,实现自定义的动态 ActionForm
Action 中访问动态 ActionForm
同普通的 ActionForm 一样, Action 类和 JSP 都可以访问动态 ActionForm ,而访问方式也基本一致。访问动态 ActionForm 与访问普通的 ActionForm 的最大区别在于对属性的访问方式不同。在标准的 ActionForm 中,针对每一个属性都提供了 getter setter 方法来读取和设置属性,而 DynaActionForm 把所有的属性保存在一个 Map 对象中,因此访问 DyanActionForm 中的属性与访问 Map 对象中的方法类似:
在这里我用上面配置的动态 ActionForm 来示例如何访问动态 ActionForm
DynaActionForm dynaForm =(DynaActionForm)form;
        String userName = (String)dynaForm.get("userName");
        String userPwd = (String)dynaForm.getString("userPwd");
        
//dynaForm.set("userName", "fengyan");
设置值!

动态 ActionForm 的表单验证
DynaActionForm 类的 validate() 方法没有提供任何默认的验证行为。可以通过定义扩展 DynaActionForm 类的子类,然后覆盖 validate() 方法,但是以编程方式来验证动态 ActionForm 并不是一种理想的办法。动态 ActionForm 的验证应该使用 Struts Validator 验证插件。 Validator 插件允许采用特定的配置文件为动态的 ActionForm 配置验证规则,如检查必须的输入域,日期时间等
 
 
 
 
 
Struts 框架中, ActionForm 对象用来包装 HTML 表单数据,并能动态返回用于显示给用户的数据,自定义的 ActionForm 必需符合 JavaBean 规范,并继承 Struts ActionForm 类,同时用户可以选择的覆盖两个方法: reset() validate().
   ActionForm的唯一缺点是对于大型的Struts应用,必需以编程的方式创建大量的ActionForm类,如果HTML表单字段发生变化,就必须修改并编译相关的ActionForm类。Struts1.1对此进行了改进,引入了动态ActionForm类的概念,Struts框架的 DynaActionForm类及其子类实现了动态ActionForm,该类是ActionForm类的子类。同时也提供了Validator验证框架实现动态验证表单( DynaValidatorForm)的功能。
1、配置动态ActionForm
   动态ActionForm支持在Struts配置文件(struts-config.xml)中完成ActionForm的全部配置,没有必要编写额外的程序创建具体的ActionForm类,配置动态ActionForm的方法为:在Struts配置文件中配置一个<form-bean>元素,将type属性设置为DynaActionForm或它的某个子类的全名,例如: 
<form-bean  name="registForm"  type="org.apache.struts.action.DynaActionForm">
   <form-property name="name" type="java.lang.String"/>
   <form-property name="psw1" type="java.lang.String"/>
   <form-property name="psw2" type="java.lang.String"/>
  </form-bean>
<form-bean>的<form-property>子元素用来设置动态ActionForm的属性,<form-property>元素的name属性指定属性名,type指定属性类型,可以把动态的ActionForm的属性设置为以下Java类型:
·       java.lang.BigDecimal
·       java.lang.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基本类型,在配置时应该用相应的包装类型来代替,比如:int类型的包装类型为Integer:
     <form-property
               initial="0"
               name="age"
               type="java.lang.Integer"/>
并在action中设置使用对应动态Action Form:
<action path="/registSubmit" type="classmate.RegistAction" name="registForm" scope="request"  input="/error.jsp"/>
2、动态ActionForm的reset()方法 参考: http://www.56boke.com/user1/yhaiz/archives/2006/1910.html
3、访问动态ActionForm
  Action类和JSP都可以访问动态ActionForm,使用方法与标准ActionForm大致相同,只有一点小差别,如果使用标准的ActionForm对象,在标准的ActionForm中针对每个属性都提供了get/set方法,来读取或设置属性。
 而DynaActionForm把所有的属性保存在一个Map类对象中,并提供了下面的用于访问所有属性的通用方法:
    public Object get(String name);
    public void set(String name,Object value);
   get(String name)方法根据指定的属性名返回属性值;set(String name,Object value)方法用于为给定的属性赋值。例如,如果访问DynaActionForm类中的email属性,可以采用:
   //get email
   String email = (String)form.get("email");
  // set email
  form.set("email", example@example.com);
这里建立Action Bean,要从动态ActionForm中 接收表单数据:
public class RegistAction extends Action {
 public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
  DynaActionForm dyform = (DynaActionForm) form;
  
  //get dynamic action form
   String name = (String)dyform.get("name");
  String psw1 = (String)dyform.get("psw1");
  String psw2 = (String)dyform.get("psw2");   .......................................................
在JSP页面上和使用ActionForm一样:<form action="registSubmit.do" method="post">
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值