formaction什么意思(浅谈struts中的ActionForm)

• 作用:

○ 收集表单数据

§ 如果 ActionForm 中的属性和表单中的参数不一致,则收集和表单名字相同的属性

○ 自动进行类型转换

§ 从表单中收集的参数都是 String 类型,收集进 ActionForm 时可以自动转换为

int / boolean / double / Date 等类型

○ 作为传输对象

§ 可以将数据跨层传输 -- 从控制层传送给业务层

§ 可以进行上传 -- 用户可以把文件通过表单传送给 ActionForm

○ 分步收集

§ 可以将多个请求表单中的参数收集到同一个 ActionForm 中

• ActionForm 的创建:

○ 包声明

formaction

○ 定义主类 public

○ 继承 ActionForm

○ 定义私有属性

○ 提供无参构造方法,提供相应的 get / set 方法

○ 根据实际情况添加 validate() 和 reset() 方法

动态 ActionForm -- DynaActionForm

• 使用目的:避免ActionForm 的膨胀

• 不需要自己写 ActionForm 类,仅需要在 struts-config.xml 中进行配置,

struts 会自动创建

• 配置 DynaActionForm:

<form-bean name="dynaForm" type="org.apache.struts.action.DynaActionForm"> <form-property name="username" type="java.lang.String"/> <form-property name="age" type="java.lang.Integer"/> <form-bean>

在<form-bean> 标签中配置 ActionForm,type 属性为 struts 提供的动态 ActionForm 的类文件,配置 <form-property> 标签,name 属性的值为与表单参数名对应的属性名,type 属性的值为表单Bean 中所需的数据类型 [ 数据类型写全称 ]

DynaActionForm 内 部 结 构 :

formProperties = new HashMap();

protected HashMap dynaValues = new HashMap();

DynaActionForm 中有两个Map 集合:

§ formProperties:存放 FormPropertyConfig -- key 为 <form-

property> 标签中的 name 属性值,value 为FormPropertyConfig 对象

□ FormPropertyConfig 对象 -- 封装 <form-property> 标签中的各个属性

□ key 为<form-property> 标签中的name 属性值,value 为 type 属性值

§ dynaValues:

Tomcat 启动,创建 formBeans 存放 FormBeanConfig 对象

通过name 找对应的 ActionForm,找到了动态 ActionForm 类文件准备创建

DynaActionForm 对象——创建DynaActionForm 对象就通过配置信息创建出

FormPropertyConfig,并设入其 Map 中,key = "username",value =

FormPropertyConfig 对象

调用 processPopulate 收集数据:将表单中的数据收集到 dynaValues 集合中,通过参数名 username 到DynaActionForm 中去找 key 为 username 的 FormPropertyConfig 对象,通过这个对象找到 type 为 String 类型 , 就 将 参 数 名 和 参 数 名 设 到 dynaValues 的 Map 下 , key=username,value=tom

通过参数名 age 到 DynaActionForm 中去找 key 为 age 的FormPropertyConfig 对象,通过FormPropertyConfig.getType() 找到 type 为 Integer 类型,就去一个静态 Map 集合中找整型转换器,将字符 串 类 型 的 23 转 换 为 整 型 23 后 设 到 dynaValues 的 Map 下 , key=age,value=23

创建 Action 对象

通过造型取得 DynaActionForm

因为数据被收集到 dynaValues Map 中,所以要从dynaValues 中获得属性

public Object get(String name) { Object value = dynaValues.get(name); if (value != null) { return (value); }

daf.get("username"); // 从 dynaValues 集合中取得数据

jsp 页面中取得数据

${ dynaForm.map.username}

通过dynaForm 属性名拿到dynaActionForm 对象,通过dynaActionForm.getMap() 拿到dynaValues 对象,调用dynaValues.get("username");

public Map getMap() { return (dynaValues); }

缺点:

数据传送困难:动态 ActionForm 不方便将大量参数传递到业务层:

BeanUtils.copyProperties() 方法无法使用在动态 ActionForm 中编译器对动态 ActionForm 的配置不会进行语法检查,因此容易出错

• struts 1 用动态 ActionForm 完成对表单数据的验证

○ Tomcat 一启动创建 ActionServlet,读取主配文件,读到一个插件标签

○ 用户发请求,通过请求字符串创建出动态 ActionForm

○ 动态 ActionForm 的类文件为 DynaValidateForm -- 继承了DynaActionForm

§ public class DynaValidatorActionForm extends DynaValidatorForm { }

□ public class DynaValidatorForm extends DynaActionForm

{ }

内部结构与DynaActionForm 一致

○ 创建出DynaValidateForm 对象,往里设两个Map,key="name" value="" / key="password",value=""

○ 调用相应的方法根据读到内存中的验证规则对 name="loginForm" 的

DynaValidateForm 对象中的数据做验证

配置:

□ 将插件类配置在标签下,Tomcat 一启动创建ActionServlet 对象读取主配文件后,读到<plug-in> 标签时会自动创建插件对象

□ 一创建插件对象就给插件类的 pathnames 属性注入代表着两个验证规则的xml 文件

□ 创建对象调用init() 方法,从 pathnames 所指的字符串中获取指定文件的指定位置,将两个验证规则文件读取到内存

□ <plug-in className="org.apache.struts.validator.ValidatorPlugIn"> 作为一个插件类,要实现 plugin 接口

<set-property>property="pathnames" value="" public interface PlugIn { void destroy(); void init(ActionServlet servlet, ModuleConfig config) throws ServletException; } public class ValidatorPlugIn implements PlugIn { private String pathnames = null;

§ 验证规则:对DynaValidateForm 中的数据做验证

□ validation.xml,depends="reguired,mask" 不能为空,任务

[ 可以自定义]

□ 发现为空串,产生错误信息,不再去找 type,直接转向 input 属性中的转向路径,通过<html:error>标签显示错误信息

○ 如果一个类想作为插件,一定要实现 PlugIn 接口 -- 实现 init() 和

destroy() 方法

§ 配置到struts-config.xml 中的 <plug-in> 标签下进行使用[ 作为

struts 组件的一部分 ]

§ Tomcat 一启动看见<plug-in> 标签会自动创建出插件对象并执行插件对象的 init() 方法

§ 如果有一些语句希望 Tomcat 一启动就执行,可以写在 servlet / filter / listener 中,也可以写在插件对象的 init() 方法中

○ 验证规则:

<form name="loginForm"> // 说明该验证规则对哪个ActionForm 中的属性进行验证

<field property="username" depends="reguired"> // 说 明对哪个属性进行验证,说明依赖于哪个规则,本例为不能为空

<arg key="国际化资源文件">

</field>

您可以还会对下面的文章感兴趣

最新评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

使用微信扫描二维码后

点击右上角发送给好友