`

使用动态ActionForm(转)

阅读更多
在Struts框架中,ActionForm对象用来包装HTML表单数据,并能动态返回用于显示给用户的数据,自定义的ActionForm必需符合 JavaBean规范,并继承Struts的ActionForm类,同时用户可以选择的覆盖两个方法:reset()和validate().
    ActionForm的唯一缺点是对于大型的Struts应用,必需以编程的方式创建大量的ActionForm类,如果HTML表单字段发生变化,就必 须修改并编译相关的ActionForm类。Struts1.1对此进行了改进,引入了动态ActionForm类的概念,Struts框架的 DynaActionForm类及其子类实现了动态ActionForm,该类是ActionForm类的子类。
1、配置动态ActionForm
    动态ActionForm支持在Struts配置文件中完成ActionForm的全部配置,没有必要编写额外的程序创建具体的ActionForm类, 配置动态ActionForm的方法为:在Struts配置文件中配置一个<form-bean>元素,将type属性设置为 DynaActionForm或它的某个子类的全名,例如:
     <form-beans>
        <form-bean
            name="loginForm"
            type="org.apache.struts.action.DynaActionForm">
           <form-property
              name = "email"
              type="java.lang.String"/>
            <form-property
              name = "password"
              type="java.lang.String"/>
             <form-property
              initial="false"      //设置初始值
              name = "rememberMe"
              type="java.lang.Boolean"/>
        </form-bean>
    </form-beans>
   <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"/>
2、动态ActionForm的reset()方法
     DynaActionForm基类提供了initialize()方法,它把表单的所有属性恢复为默认值。表单属性默认值由<form- bean>的<form-property>子元素的initial属性来决定。如果没设置initial属性,则表单属性的默认值由 其java类型来自动决定。
   DynaActionForm基类的initialize()方法如下:
     public void initialize(ActionMapping mapping){
                   String name = mapping.getName();
                   if(name==null){
                         return;
                   }
                  FormBeanConfig config =
                          mapping.getModuleConfig().findFormBeanConfig(name);
                  if(config==null){
                       return;
                  }
                  FormPropertyConfig props[] = config.findFormPropertyConfigs();
                 for (int i = 0;i<props.length;i++){
                          set(props[i].getName(),props[i].initial());
                  }
        }
   DynaActionForm基类的reset()方法不执行任何操作,代码如下:
     public void reset(ActionMapping mapping,HttpServletRequest request){
    }
   如果希望Struts框架在每次把表单数据组装到动态ActionForm中之前,先把所有的属性恢复为默认值,可以定义一个扩展DynaActionForm类的子类,然后覆盖其reset()方法,在reset方法中只要调用initialize()方法即可。
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);
4、动态ActionForm的表单验证
   DynaActionForm基类的validate()方法没有提供任何默认的验证行为,可以定义扩展的DynaActionForm的子类,然后覆盖 validate()方法,但是以编程的方式来验证动态ActionForm违背了Struts框架提供动态ActionForm的初衷,即以配置来代替 编程,可以采用另一种验证机制,即Validator框架来完成验证,该框架允许采用特定的配置文件来为动态的ActionForm配置验证规则。
5、在应用中使用动态ActionForm
   在应用中定义了名为"itemDetailForm"的动态ActionForm,它包含了一个ItemDetailView类型的属性view,
<form-bean
       name="itemDetailForm"
      dynamic="true"
       type="org.apache.struts.action.DynaActionForm">
       <form-property name="view" type="netstore.catalog.view.ItemDetailView"/>       
   </form-bean>
在JSP页面上,如果选择了某个商品,该请求将转发给GetItemDetailAction来处理,配置如下:
<action
     path="/viewitemdetail"
     name="itemDetailForm"
     input="/index.jsp"
     type="netstore.catalog.GetItemDetailAction"  
     scope="request"     
     validate="false">
     <exception
         key="global.error.invalidlogin"
         path="/index.jsp"
         scope="request"
     type="netstore.framework.exceptions.DatastoreException"/>
   
     <forward name="Success" path="/catalog/itemdetail.jsp"/>
</action>
GetItemDetailAction根据用户选择商品的ID调用模型的业务方法,并检索出该商品的详细信息,把它存放在ItemDetailView 对象中,再把ItemDetailView对象赋值给动态itemDetailForm的view属性,GetItemDetailAction的 execute()方法的代码如下:
     public ActionForward execute( ActionMapping mapping,
                                 ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response )
    throws Exception {
     // Get the primary key of the item from the request
     String itemId = request.getParameter( IConstants.ID_KEY );
     // Call the netstore service and ask it for an ItemView for the item
     INetstoreService serviceImpl = getNetstoreService();
     ItemDetailView itemDetailView = serviceImpl.getItemDetailView( itemId );
     // Set the returned ItemView into the Dynamic Action Form
     // The parameter name 'view' is what is defined in the struts-config
     ((DynaActionForm)form).set("view", itemDetailView);
     //String userName = ((DynaActionForm)form).get( "username" );
     //((DynaActionForm)form).set( "password", password );

     // Return the ActionForward that is defined for the success condition
     return mapping.findForward( IConstants.SUCCESS_KEY );
   }
GetItemDetailAction最后把请求转发给itemdetail.jsp,它通过<bean:write>标签把动态itemDetailForm的view属性包含的数据输出到网页上,
<bean:write name="itemDetailForm" property="view.name"/><BR>
</B></font><font   size=2>
   <!-- PRODUCT MODEL --><bean:message key="itemdetail.model"/><bean:write name="itemDetailForm" property="view.modelNumber"/><BR><BR><!-- /PRODUCT MODEL --></font>
   <font   size=2>
<!-- PRODUCT DESCRIPTION -->
<bean:write name="itemDetailForm" property="view.description"/>
分享到:
评论
1 楼 yulongxiang 2010-11-09  
非常感谢!!!!!!!

相关推荐

    Struts高级开发_动态ActionForm.avi

    动态ActionForm则旨在解决这个问题,它允许我们在运行时动态地创建和绑定ActionForm,而不是预先定义固定的ActionForm类。 在讲解动态ActionForm的过程中,通常会涵盖以下几个关键点: 1. **ActionForm接口**:...

    ActionForm里的get和set方法

    随着技术的发展,很多现代Web框架,如Spring MVC,已经不再直接使用ActionForm,而是推荐使用模型驱动(Model Driven)或命令对象(Command Object)模式。这些模式同样利用get和set方法来绑定表单数据,但提供了更...

    提交多行数据到Struts的ActionForm的List属性中

    这里,我们为每个表单字段定义了一个动态的属性名,如`items[0].name`和`items[1].description`,这使得Struts在处理POST请求时能够将这些值映射到一个List类型的属性上。假设我们有一个名为Item的类,它有name和...

    整合Struts_Hibernate_Spring应用开发详解

    - **使用动态ActionForm:** 动态ActionForm可以根据用户请求动态生成表单字段。 - **Struts的数据校验** - **ActionForm的代码校验:** 通过重写`validate()`方法实现。 - **Action的代码校验:** 直接在Action...

    HTML标签转STRUTS标签

    STRUTS标签通常与ActionForm、ModelDriven等概念结合,可以更方便地处理表单提交、数据验证、国际化等功能。常见的STRUTS标签有`&lt;s:form&gt;`、`&lt;s:textfield&gt;`、`&lt;s:textarea&gt;`、`&lt;s:submit&gt;`等。 在VS2005中进行HTML...

    webwork 中table动态增加行列

    1. `&lt;s:form&gt;`: 使用Struts2(WebWork的后续版本)的表单标签来收集用户输入,并提交到对应的Action。 2. `&lt;s:iterator&gt;`: 迭代模型中的数据,生成表格的行。每行可以包含`s:textfield`或其他输入控件,用于编辑...

    跃达创新struts 笔记

    2. 动态ActionForm:在Struts中,ActionForm对象用于封装HTTP请求中的参数,动态ActionForm可以根据不同的请求创建不同的表单类。 3. ActionServlet:作为Struts的核心,ActionServlet负责拦截所有请求,解析请求...

    使用反射自动装填前台数据和struts自动装填很像

    它通过`RequestProcessor`类处理HTTP请求,然后使用`PropertyUtils`或`BeanUtils`类将请求参数与ActionForm对象的属性进行匹配和赋值。这些工具类利用了JavaBean规范,即对象的公共setter方法,来设置属性值。因此,...

    Struts学习笔记

    在本学习笔记中,我们将深入探讨Struts的核心特性、国际化、类型转换以及JFreeChart的使用。 一、Struts框架基础 Struts 1是一个经典的Web MVC框架,它为开发者提供了强大的请求处理、页面导航、业务逻辑组织等功能...

    struts课件3

    本文档深入探讨了Struts中的Validator框架及其配置方法,并介绍了国际化、动态ActionForm以及如何防止重复提交等问题。通过学习这些内容,开发者可以更好地理解和应用Struts框架,构建出功能强大且用户友好的Web应用...

    [新闻文章]Struts文章系统_strutsarticle_release.rar

    4. **JSP和TagLib**:视图层通常使用JSP(JavaServer Pages)技术,通过使用Struts提供的TagLib库,如servlet标签库和struts-bean标签库,可以方便地在JSP页面中操作和显示ActionForm中的数据,以及执行其他控制流程...

    struts下使用dwr

    而DWR则是一个JavaScript库,它允许在浏览器和服务器之间进行异步的、动态的JavaScript到Java的调用,提供了类似Ajax的功能,但更易于使用。 **Struts框架**: 1. **架构**:Struts框架主要由ActionForm、Action、...

    Struts2和Struts1的区别,详细点,主要说说Struts2

    - **Struts2**虽然不再强制要求使用ActionForm模式,但仍然支持类似的功能,例如通过ModelDriven模式或使用Struts2的类型转换机制来处理用户输入。 #### 视图技术的支持 - **Struts1**支持使用JSTL标签库和EL表达式...

    struts中使用validator验证框架

    最后,Validator_Struct_03展示了如何在ActionForm中使用动态验证。动态验证允许我们在运行时根据不同的条件来决定是否执行某个验证规则。这通常用于处理具有多种状态或选项的表单,例如,当用户选择“学生”身份时...

    struts的总结(struts1.x)

    DynaActionForm 是一种特殊的 ActionForm,它可以动态地管理表单字段。它继承自 `org.apache.struts.action.DynaActionForm` 类,并且可以通过 `&lt;form-property&gt;` 标签在 `struts-config.xml` 文件中定义表单字段。 ...

    SSH项目整合实例(struts1.3+hibernate3.2+spring2.0)

    ActionForm分为静态和动态两种类型,静态FormBean通常用于固定不变的数据输入,而动态FormBean则适用于数据结构不固定或需要动态生成的情况。在增删查改操作中,Action会根据不同的请求调用相应的Service,然后返回...

    struts1和struts2的区别

    - Struts2使用XWork框架的验证机制,支持链式验证和动态验证,提供了更强大和灵活的验证功能。 10. **Action执行过程的定制**: - Struts1通过配置多个`RequestProcessors`来定制Action的执行过程,不同的Action...

Global site tag (gtag.js) - Google Analytics