• 作用:
○ 收集表单数据
§ 如果 ActionForm 中的属性和表单中的参数不一致,则收集和表单名字相同的属性
○ 自动进行类型转换
§ 从表单中收集的参数都是 String 类型,收集进 ActionForm 时可以自动转换为
int / boolean / double / Date 等类型
○ 作为传输对象
§ 可以将数据跨层传输 -- 从控制层传送给业务层
§ 可以进行上传 -- 用户可以把文件通过表单传送给 ActionForm
○ 分步收集
§ 可以将多个请求表单中的参数收集到同一个 ActionForm 中
• ActionForm 的创建:
○ 包声明
○ 定义主类 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>
最新评论