zoukankan      html  css  js  c++  java
  • 在struts中使用动态Form

    在 struts 中使用动态 form,需要 有以下几步:

    1)        配置动态 form

    要想使用动态 form, 首先要现在 struts-config.xml 中作配置

    实例代码如下:

    < form-beans >

        < form-bean name = "vOForm" type = "org.apache.struts.action.DynaActionForm" >

          < form-property name = "uname" type = "java.lang.String" />

         < form-property name = "upass" type = "java.lang.String" />

        </ form-bean >

    </ form-beans >

    使用动态 form, 没有对应的类,所以,如果需要扩展属性,只需要再次配置文件中添加一个属性家可以了。

    但是如果是 actionform 的话,那么,如果你添加了一个属性的话,那么你就要在属性里面添加一个属性,在类里面添加一个属性。而必须做好这种对应。动态 form 就没有这个必要了。

    从这一点来说,动态 form 使用起来就更加方便。

    2)        页面 form

    Form, 其实是一个 transfer object , 也就是说,是在 viewer 和 action 只见地交换数据和传递数据的对象。

    所以从页面的 form, 每一个属性都要和动态 form 的属性一一对应。

    然后,由 struts 来完成其属性值的映射。

    实例代码如下:

    <form method="POST" action="login.do">

          username : <input type="text" name="uname" value="zhangyi"><br>

          password : <input type="password" name="upass" value="zhangyi"><br>

          <input type="submit" name="submit" value="login">

    </form>

    这个 form 里面的属性和动态 form 里面的属性是一一对应的。

    3)        Action

    由上面的页面 form 上,我们可以看到,如果此 form 提交,那么,请求提交到了 login.do

    这个 action.

    那么,在这个 action 里面,如何实现对动态 form 的调用 ? 同普通的ActionForm一样,Action类和JSP都可以访问动态ActionForm,而访问方式也基本一致。访问动态ActionForm与访问普通的ActionForm的最大区别在于对属性的访问方式不同。在标准的ActionForm中,针对每一个属性都提供了getter和setter方法来读取和设置属性,而DynaActionForm把所有的属性保存在一个Map 对象中,因此访问DyanActionForm中的属性与访问Map对象中的方法类似:

    实例代码如下:

           DynaActionForm vOForm = (DynaActionForm) form;

               String uname= (String)vOForm .get("uname");
              String upass= (String)vOForm .getString("upass");
            //vOForm.set("uname", "fengyan");设置值!

           System. out .println( "vo is : " + vOForm);

    因为,我们传递的是 DynaActionForm, 所以,在调用的时候,我们就要把 form 强制转换成 DynaActionForm 对象。

    4)        测试结果

    上面粒子的执行结果如下:

    vo is : DynaActionForm[dynaClass=vOForm,upass=bbbbbbbbb,uname=aaaaaaa]

    也就是说,我们已经取得了此对象。

    实例化动态ActionForm的解析

    <form-bean name="logonForm" type="org.apache.struts.validator.DynaValidatorForm">
                <form-property name="userName" type="java.lang.String"/>
                <form-property name="password" type="java.lang.String"/>
                <form-property name="forwardAction" type="java.lang.String"/>
            </form-bean>

             <action path="/logon" name="logonForm" input="/WEB-INF/jsp/bas/logon.jsp" scope="request" type="com.longtop.bas.web.LogonAction" validate="false"/>

    FormBeanConfig ----- 和<form-bean>配置对应的类

    protected ModuleConfig moduleConfig;

    protected String name;

    protected String type;

    protected boolean dynamic = false;

    protected HashMap formProperties = new HashMap();//和<form-property>相对应的属性。

    DynaActionFormClass ----专门用来处理动态类,这样用户就不用单独定义ActionForm。

    protected transient static HashMap dynaClasses = new HashMap();//static类型,所有DynaActionFormClass 实例的该变量都是一致的,且里面存放的是DynaActionForm或DynaActionForm的子类。

    protected transient Class beanClass = null;//该变量表示要创建的动态ActionForm的类名(org.apache.struts.validator.DynaValidatorForm)。

    protected FormBeanConfig config = null;//和<form-bean>配置相对应的类,一个<form-bean>配置就会生成一个DynaActionFormClass 。

    protected HashMap propertiesMap = new HashMap();//和<form-property>相对应的属性集合。

    protected DynaProperty properties[] = null;和<form-property>相对应的DynaProperty 数组。

    protected String name = null;//和<form-bean>的name一致=config.getName()。

    其中重要的方法有

        public static DynaActionFormClass   createDynaActionFormClass(FormBeanConfig config)

        首先查找该类的静态集合dynaClasses 是否有和<form-bean>相对应的DynaActionFormClass实例。如果有,则返回这个DynaActionFormClass实例。如果没有,则实例化一个DynaActionFormClass类,并初始化它的config变量, name变量,properties数组,propertiesMap 集合,并且加载config.getType()对应的类((org.apache.struts.validator.DynaValidatorForm)),最后将这个实例(DynaActionFormClass)添加到静态变量dynaClasses 中。

         public DynaBean newInstance()

         实例化DynaActionFormClass上面加载的beanClass(org.apache.struts.validator.DynaValidatorForm), 设置 beanClass的DynaActionFormClass = this(DynaActionFormClass)和dynaValues(HashMap)属性集合。

    DynaActionForm---每个请求都要获得或生成一个和地址相对应的<form-bean>,如果是动态的form-bean,就一定是DynaActionForm或DynaActionForm的子类。

        protected DynaActionFormClass dynaClass = null;//实例化该类的DynaActionFormClass

        protected HashMap dynaValues = new HashMap();//和<form-property>相对应的DynaProperty 集合。

    重要的方法有

    (1)struts启动的时候,在初始化moduleconfig(init()内的initModuleConfig())的过程中,加载动态类DynaActionFormClass。

    ModuleConfig config = .............................;

       // 获得struts-config.xml文档中配置的<form-bean>元素对应的FormBeanConfig对象,如果该<form-bean>的type是动态actionForm(type="org.apache.struts.validator.DynaValidatorForm"),则加载这个类。
       FormBeanConfig fbs[] = config.findFormBeanConfigs();
          for (int i = 0; i < fbs.length; i++) {
             if (fbs[i].getDynamic()) {
                 DynaActionFormClass.createDynaActionFormClass(fbs[i]);
              }
           }

    (2)如果有请求的地址是/WEB-INF/jsp/bas/logon.jsp,则该请求的过程从处理ActionMapping的环节开始如下:

        1、ActionMapping mapping = processMapping(request, response, path);

            通过查找ModuleConfig的ActionConfig集合中和请求的path相对应的(struts启动时,已经初始化了ModuleConfig的ActionConfig集合)。如果有查找该ActionMapping对象,则添加到request对象中。如果没有的话,该请求就交给系统缺省的ActionMapping(<action>的unknown = "true")。

         2、 ActionForm form = processActionForm(request, response, mapping);

              如果<action>配置没有name属性或name属性没有对应的<form-bean>元素,则退出。或则通过查找ModuleConfig的FormBeanConfig集合中和ActionMapping的name属性相对应的FormBeanConfig。根据<action>的name属性查找request或session是否有相应的ActionForm(attribute)。如果有,则返回这个ActionForm实例。如果没有,执行下一步。

       3、如果判断<action>的dynamic属性是否为true,先实例化一个DynaActionFormClass。

             DynaActionFormClass dynaClass = DynaActionFormClass.createDynaActionFormClass(config);

             首先查找该类的静态集合dynaClasses 是否有和<form-bean>相对应的DynaActionFormClass实例。如果有,则返回这个DynaActionFormClass实例。如果没有,则实例化一个DynaActionFormClass类,并初始化它的config变量, name变量,properties数组,propertiesMap 集合,并且加载config.getType()对应的类((org.apache.struts.validator.DynaValidatorForm))到beanClass变量中,最后将这个实例(DynaActionFormClass)添加到静态变量dynaClasses 中。        

                DynaActionFormClass dynaClass =
                    (DynaActionFormClass) dynaClasses.get(key);
                if (dynaClass == null) {
                    dynaClass = new DynaActionFormClass(config);
                    dynaClasses.put(key, dynaClass);
                }
                return (dynaClass);

          4、实例化一个动态的ActionForm。

               ActionForm instance = null;

               instance = (ActionForm) dynaClass.newInstance();实例化3步骤加载的类。

                实例化DynaActionFormClass上面加载的beanClass(org.apache.struts.validator.DynaValidatorForm), 初始化 beanClass的DynaActionFormClass = this(DynaActionFormClass)和dynaValues(HashMap)属性集合的初始值。

         5、初始化ActionForm的property属性的初始值。

                public void initialize(ActionMapping mapping);

               <form-property name="userName" type="java.lang.String" initial="hh"/>

        6、以下的处理和正常的请求处理一致。

  • 相关阅读:
    Python小工具:统计代码行数
    计算机图形学复习(一)
    牛客多校训练第一场 J.Different Integers
    数据校验码概述
    数据库复习第二章
    数据库复习第一章
    自动化AC器(带界面版)
    ZOJ 3747 Attack on Titans
    Codeforces Round #245 (Div. 1) B. Working out
    HDU 6266 Hakase and Nano 【博弈论】
  • 原文地址:https://www.cnblogs.com/luoyanli/p/2817552.html
Copyright © 2011-2022 走看看