前言:
眼前同学们对“dynaform实例教程”大体比较着重,看官们都想要学习一些“dynaform实例教程”的相关知识。那么小编同时在网上搜集了一些关于“dynaform实例教程””的相关知识,希望看官们能喜欢,姐妹们快快来了解一下吧!ActionForm
• 作用:
○ 收集表单数据
§ 如果 ActionForm 中的属性和表单中的参数不一致,则收集和表单名字相同的属性
○ 自动进行类型转换
§ 从表单中收集的参数都是 String 类型,收集进 ActionForm 时可以自动转换为 int / boolean / double / Date 等类型
○ 作为传输对象
§ 可以将数据跨层传输 -- 从控制层传送给业务层
§ 可以进行上传 -- 用户可以把文件通过表单传送给 ActionForm
○ 分步收集
§ 可以将多个请求表单中的参数收集到同一个 ActionForm 中
• ActionForm 的创建:创建 ActionForm
• 手工 ActionForm 的语法:
○ 包声明
○ 定义主类 public
○ 继承 ActionForm
○ 定义私有属性
○ 提供无参构造方法,提供相应的 get / set 方法
○ 根据实际情况添加 validate() 和 reset() 方法
动态 ActionForm -- DynaActionForm
• 使用目的:避免 ActionForm 的膨胀
• 不需要自己写 ActionForm 类,仅需要在 struts-config.xml 中进行配置,struts 会自动创建
• 配置 DynaActionForm:
<form-bean name="loginForm" type="org.apache.struts.validator.DynaActionForm"><form-property name="username" type="java.lang.String"/><form-property name="password" type="java.lang.String"/></form-bean>
○ 在 <form-bean> 标签中配置 ActionForm,type 属性为 struts 提供的动态 ActionForm 的类文件
○ 配置 <form-property> 标签,name 属性的值为与表单参数名对应的属性名,type 属性的值为表单Bean 中所需的数据类型 [ 数据类型写全称 ]
DynaActionForm 内部结构:
HashMap formProperties = new HashMap();HashMap dynaValues = new HashMap();
DynaActionForm 中有两个Map 集合:
§ formProperties:存放 FormPropertyConfig -- key 为 <form-property> 标签中的 name 属性值,value 为 FormPropertyConfig 对象
□ FormPropertyConfig 对象 -- 封装 <form-property> 标签中的各个属性 String username,Sting type
§ dynaValues:按照 <form-property> 标签收集表单数据时,存放表单中的参数数据
□ key 为 <form-property> 标签中定义的 name 属性,value 为表单中对应的用户输入的参数数据
• 动态表单Bean 实例:
○ 配置 DynaActionForm:
<form-bean name="loginForm" type="org.apache.struts.validator.DynaActionForm"><form-property name="username" type="java.lang.String"/><form-property name="age" type="java.lang.Integer"/></form-bean>
○ Tomcat 启动,创建 FormBeans 存放 FormBeanConfig 对象:
§ FormBeans -- key = "loginForm",value = FormBeanConfig 对象
§ FormBeanConfig -- String name = "loginForm",String type = "DynaActionForm"
○ 用户发请求找到与请求对应的 <action> 标签,通过 name = "loginForm" 最终找到 type = "DynaActionForm" 创建 DynaActionForm 对象:
§ 请求字符串:"tom"&age="23"
○ 一创建 DynaActionForm 对象就通过配置信息 <form-property> 创建出 FormPropertyConfig 对象和 formProperties 集合:
§ formProperties 集合:
□ key="username" value = FormPropertyConfig 对 象 [ String name = "username" String / type = "java.lang.String" ]
□ key="age" value = FormPropertyConfig 对象 [ String name = "age" String / type = "java.lang.Integer" ]
○ 调用 processPopulate() 方法收集表单数据:将表单中的数据收集到 dynaValues 集合中
username:
□ 通过参数名 username 到 DynaActionForm 中去找 key 为 username 的 FormPropertyConfig 对象
□ 通过对应的 FormPropertyConfig 找到 type 为 String
□ 就将表单参数名和参数值设到 dynaValues 的 Map 下 -- key = "username",value = "tom"
age:
□ 通过参数名 age 到 DynaActionForm 中去找 key 为 age 的 FormPropertyConfig 对象
□ 通过对应的 FormPropertyConfig 找到 type 为 Integer
□ 去一个静态 Map 集合中找整型转换器,将 "23" 转换为 23 [ 字符串型转换为整型 ]
□ 将表单参数名和参数值设到 dynaValues 的 Map 下 -- key = "age",value = 23
执行Action 中的 execute() 方法:
通过造型取得 DynaActionForm,因为数据被收集到 dynaValues Map 中,所以要从 dynaValues 集合中获得属性,在源码中有如下定义:
public Object get(String name) { Object value = dynaValues.get(name); if ( value != null ) { return (value); }
故:String username = daf.get("username"); 即从动态表单Bean 中取得属性意味着从 dynaValues 集合中取出了 key 为 username 的 value
转向到 jsp 页面中取得数据:
在源码中有如下定义:
public Map getMap() { return (dynaValues);} // 用表单Bean 对象调用 getMap() 方法会获取到 dynaValues 集合对象
§ ${ dynaForm.map.username}
□ 成功创建出表单Bean 对象时就已将dynaActionForm 对象设入 scope 内置对象中,属性名为 name 属性值
• 缺点:
® 通过 dynaForm 属性名拿到 dynaActionForm 对象
® 通过 dynaActionForm.getMap() 拿到 dynaValues 对象
® 调用 dynaValues.get("username"); 输出 username 属性值
○ 数据传送困难:动态 ActionForm 不方便将大量参数传递到业务层:BeanUtils.copyProperties() 方法无法使用在动态 ActionForm 中
○ 编译器对动态 ActionForm 的配置不会进行语法检查,因此容易出错
动态 ActionForm 进行后台验证
• struts 1 用动态 ActionForm 可以完成对表单数据的后台验证
• 后台验证实例:
Tomcat 一启动创建 ActionServlet,读取主配文件,读到 struts-config.xml 中的 <plug-in> 插件标签时会立即自动创建出插件对象
<plug-in className="org.apache.struts.validator.ValidatorPlugIn"><set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/></plug-in>
插件标签中配置了插件类
□ 作为一个插件类,一定要实现 PlugIn 接口 -- 实现 init() 和 destroy() 方法,且有一个私有的字符串类型的属性 pathnames public interface PlugIn {
void destroy();void init(ActionServlet servlet, ModuleConfig config) throws ServletException;}public class ValidatorPlugIn implements PlugIn {private String pathnames = null; public destroy() { }public void init( ActionServlet servlet, ModuleConfig config) throws ServletException {}}
§ 一创建插件对象就给插件类的 pathnames 属性注入代表着两个验证规则的 xml 文件
□ 同时调用 init() 方法,从 pathnames 所指的字符串中获取指定文件的指定位置,将两个验证规则文件读取到内存
如果有一些语句希望 Tomcat 一启动就执行,可以写在 servlet / filter / listener 中,也可以写在插件对象的 init() 方法中
○ 用户发请求,通过请求字符串创建出 DynaValidateForm 对象,同时创建出 FormPropertyConfig 对象和 formProperties 集合: 请求字符串:""&password=""
<form-bean name="loginForm" type="org.apache.struts.validator.DynaValidatorForm"><form-property name="username" type="java.lang.String"/><form-property name="password" type="java.lang.String"/></form-bean><action path="/login1" type="com.bjsxt.struts.LoginAction" name="loginForm" scope="request"validate="true" input="/login1.jsp"><forward name="success" path="/login_success.jsp"/></action>
§ 此时动态 ActionForm 的类文件为 DynaValidateForm -- 继承了 DynaActionForm
□ public class DynaValidatorActionForm extends DynaValidatorForm { }
® public class DynaValidatorForm extends DynaActionForm { }
□ 内部结构与 DynaActionForm 一致
formProperties:
□ key="username" value = FormPropertyConfig 对 象 [ String name = "username" String / type = "java.lang.String" ]
□ key="password" value = FormPropertyConfig 对 象 [ String name = "password" String / type = "java.lang.String" ]
○ 自动收集表单数据到 dynaValues 集合中:
§ username:
□ key = "username",value = "" [ 空串 ]
§ password:
□ key = "password",value = "" [ 空串 ]
○ 验证规则:
<formset><form name="loginForm"> // 说明该验证规则对哪个 ActionForm 中的属性进行验证<field property="username" depends="required"> // 说明对哪个属性进行验证,说明依赖于哪个规则,本例为不能为空<arg key="prompt.username"/> // 国际化资源文件</field><field property="password" depends="required,mask"><arg key="prompt.password"/><var><var-name>mask</var-name><var-value>^[0-9a-zA-Z]*$</var-value></var></field></form></formset>
§ 调用相应的方法根据读到内存中的验证规则对 name="loginForm" 的 DynaValidateForm 对象中的数据做验证
§ 发现为空串,产生错误信息,不再去找 type,直接转向 input 属性中的转向路径,通过<html:error>标签显示错误信息
标签: #dynaform实例教程