ActionForm
Actionform的作用:
表单字段收集器
如果ActionForm中的属性和表单中的参数不一致,则只收集和表单名字相同的属性
作为类型转换器
作为传输对象
语法要求:
必须扩展自org. apache . struts . action . ActionForm
如果要获取表单的值,必须定义相应的私有属性
如果要求在ActionForm传递到Action之前进行校验,必须实现validate方法
如果想要在组装前初始化属性,必须实现reset方法
注意:
不是pojo类,继承了ActionForm,依赖于struts框架
不能作为结果bean,只能收集表单参数
如果要传递到业务层,只能把它放到pojo对象进行传递
DynaActionForm
执行流程:
1、先在struts.xml文件 中添加配置信息(以表单发送用户名密码为例)
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>
2、启动服务器,加载配置文件web.xml。文件读取到内存,读取< servlet>标签创建出中央控制器ActionServlet
执行init ()方法进行初始化。
3、创建fromBean存放FromBeanConfig对象
4、将主配文件struts-config.xml 读取到内存
5、创建一个ModuleConfigImpl对象[ 实现ModuleConfig接口]
ModuleConfig 管理actionConfigs和formBeans两个Map集合:
◆把每个请求对应的配置信息< action-mappings>封装到ActionMapping,把多个ActionMapping放在actionConfigs Map中
◆把每个请求对应的配置信息< form-beans>封装到FormBeanConfig, 把多个FormBeanConfig放在FormBeanConfig Map中
formBeans: key = “loginForm”, value = FormBeanConfig 对象
FormBeanConfig : string name = “loginForm”, string type = “DynaActionForm”
6、通过name="dynaForm"找到formbean type= org. apache. struts .action.DynaActionForm”创建DynaActi onForm对象
一创建DynaActionForm 对象就通过创建出FormpropertyConf ig对象和fromProperties集合(map)
7、调用processPopulate()方法收集表单数据,将数据收集到dynaValues集合(map) 中
usename
◆通过参数名usename到 DynaActionForm 中找key为username的FromBeanConfig 对象
◆通过FromBeanConfig 对象找到type 为string
◆将表单中参数名和参数值封装到dynaValues下 key三"username", value = "tom”
age
◆通过参数名age到DynaActionForm中找key为age的FromBeanConfig对象
◆通过FromBeanConfig对象找到type为Integer
◆到静态Map集合中找类型转化器,将字符串“21”转换为整型21
◆将表单中参数名和参数值封装到dynaValues下 key="age”, value=21
8、调用processPopulate(request, response, form, mapping), 将表单参数收集到表单bean (收集到DynaActionForm 中的map中)
9、调用processActionCreate(request, response, mapping), 创建action对象
10、执行validation()方法,把DynaActionForm、action、 mapping. request、 response 传过来
从dynaValues集合中获得属性
public objectget(Stringname){
object value = this . dynaValues . get(name);//以dynaValues 集合中取出了key 为age 的value
if(value !=nul1){
return value;
}else{
......
}
11、拿到username与age 后,传到名字为success的forward标签对应的视图组件
${ dynaForm. map. username }
12、通过dynaForm 属性名拿到dynaActionForm对象
13、通过dynaActionForm. getMap()拿到dynaValues map集合
14、调用dynaValues . get(“username”);输出username 属性值
优点: 代码量大大减少
缺点:
表单中的数据传递给业务层较为麻烦。不能用setParameter方法。
所有属性和类型在配置文件中设定,编译的时候不会验证,如果配置错了,产生错误结果较为难找。