转载  动态ActionForm的使用 收藏

使用ActionForm可以给开发者在处理HTML表单时带来极大的帮助,它简化了代码的编写,并提供了自动的数据验证。但是,ActionForm也存在几个非常明显的缺点。
 
首先,如果ActionForm对应的HTML表单添加或删除一些属性,ActionForm类就可能需要修改并重新编译;
 
其次,如果HTML表单是动态的,那么ActionForm更是无能为力了;
 
另外,ActionForm增加了项目中类的绝对数量!
 
于是从Struts1.1起,就引入了动态ActionForm(DyanActionForm)概念。动态ActionForm使得用户无须为应用程序的每一个HTML表单创建具体的ActionForm类。Struts框架包中的DyanActionForm类及其子类实现了动态ActionForm.
   DyanActionForm
类扩展了 ActionForm类。用户可以直接使用DyanActionForm
  
类,或者扩展该类以覆盖其validatereset方法!
 
配置动态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中,针对每一个属性都提供了gettersetter方法来读取和设置属性,而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的验证应该使用StrutsValidator验证插件。Validator插件允许采用特定的配置文件为动态的ActionForm配置验证规则,如检查必须的输入域,日期时间等
 
 
 
 
 
Struts框架中,ActionForm对象用来包装HTML表单数据,并能动态返回用于显示给用户的数据,自定义的ActionForm必需符合JavaBean规范,并继承StrutsActionForm类,同时用户可以选择的覆盖两个方法: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">
 

发表于 @ 2007年12月08日 14:49:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:使用 Eclipse 平台共享代码 | 新一篇:所有版本JDK下载

  • 发表评论
  • 评论内容:
  •  
Copyright © michael200801
Powered by CSDN Blog