龙空技术网

浅谈struts 动态表单Bean

芒格果子 128

前言:

眼前同学们对“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实例教程