Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1213|回复: 0

在struts中使用动态Form

[复制链接]

该用户从未签到

发表于 2011-8-1 10:25:00 | 显示全部楼层 |阅读模式
在 strutsstrutsstrutsjavajavastrutsjspstrutsjavajavajavajspjspstrutsstrutsstrutsstrutsstrutsstrutsjspjspstrutsstrutsstrutsjava 中使用动态 form,需要 有以下几步:

1) 配置动态 form

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

实例代码如下:

< form-beans >

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

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

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

</ form-bean >


</ form-beans >



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

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

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

2) 页面 form

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

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

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

实例代码如下:


<form method=&quotOST" 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类和都可以访问动态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..validator.DynaValidatorForm">
<form-property name="userName" type=".lang.String"/>
<form-property name="password" type=".lang.String"/>
<form-property name="forwardAction" type=".lang.String"/>
</form-bean>

<action path="/logon" name="logonForm" input="/WEB-INF//bas/logon." 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..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..validator.DynaValidatorForm)),最后将这个实例(DynaActionFormClass)添加到静态变量dynaClasses 中。

public DynaBean newInstance()

实例化DynaActionFormClass上面加载的beanClass(org.apache..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)启动的时候,在初始化moduleconfig(init()内的initModuleConfig())的过程中,加载动态类DynaActionFormClass。

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

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

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

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

通过查找ModuleConfig的ActionConfig集合中和哀求的path相对应的(启动时,已经初始化了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..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..validator.DynaValidatorForm),初始化 beanClass的DynaActionFormClass = this(DynaActionFormClass)和dynaValues(HashMap)属性集合的初始值。

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

public void initialize(ActionMapping mapping);

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

6、以下的处理和正常的哀求处理一致。
回复

使用道具 举报

  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2011-8-1 10:27:32 | 显示全部楼层
    谢谢楼主分享。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2012-6-20 13:41:55 | 显示全部楼层
    确实不错,眼前一亮的好文








    http://www.guizhoujiaxiao.com/698.htm
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-20 05:41 , Processed in 0.387178 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表