ActionForm
ActionForm 表示 HTTP窗体中的数据,可以将其看作是模型和视图的中介,它负责保存视图中的数据供模型或者视图使用。ActionForm还具有的过滤保护的作用,只有通过ActionForm 验证的数据才能够发送到 Action
处理。
ActionForm Bean从应用和配置的角度分为两类:动态ActionForm和静态ActionForm和LazyForm。作用一样,只是实现不一样。
一.静态Form
由程序员手工编写Form
1.ActionForm
提交表单的字段名和form中的属性名一致。
2.ValidatorForm
用于验证框架的Form,在请求参数前,先使用验证框架验证。
在struts-config中对应的action标签的validate值为true。
3.ValidatorActionForm
二.动态ActionForm
通过配置文件完成ActionForm配置
1.DynaActionForm
<form-beanname="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>
Java代码
public ActionForwardexecute(ActionMapping mapping, ActionForm form, HttpServletRequestrequest, HttpServletResponse response) throwsException { DynaActionFormdaf=(DynaActionForm)form; Stringusername=(String)daf.get("username"); Integerage=(Integer)daf.get("age"); System.out.println("UserName="+username); System.out.println("Age="+age); returnmapping.findForward("success"); }
2.DynaValidatorForm
和ValidatorForm一样在使用验证框架时使用。配置和DynaActionForm类似。
type="org.apache.struts.validator.DynaValidatorForm"
3.DynaValidatorActionForm
ValidatorActionForm和DynaValidatorActionForm也都是在使用验证框架时使用,和DynaValidatorForm及ValidatorForm不同的是,在配置validtion.xml中<formname=path>
name使用的是action的path属性值。以此来区分不同请求的验证规则。
三.还有一种特殊的Form:LazyValidatorForm。
<form-beanname="loginForm"type="org.apache.struts.validator.LazyValidatorForm"></form-bean>
我们没有配置form的属性。所以在jsp页面中必须使用struts标签。
Jsp代码
<br>基本使用方式<br>Customer Name:<html:text property="username"></html:text> <br>Customer Code:<html:text property="usercode"></html:text> <br> <br>自动封装Map<br>国家:<html:text property="address(nation)"></html:text> <br>省份:<html:text property="address(state)"></html:text> <br>城市:<html:text property="address(city)"></html:text>
这样就可以直接进行验证框架和action中的取值。
Java代码
public ActionForwardexecute(ActionMapping mapping, ActionForm form, HttpServletRequestrequest, HttpServletResponse response) throwsException { LazyValidatorFormlz = (LazyValidatorForm) form; Stringusername = (String) lz.get("username"); Stringusercode = (String) lz.get("usercode"); System.out.println("name---" + username + " usercode---" + usercode); Map m =(Map) lz.get("address"); System.out.println(m.get("nation")); System.out.println(m.get("state")); System.out.println(m.get("city")); returnnull; }
四、ActionForm赋值原理
我们如果知道了Struts的流程,那么理解起ActionForm的赋值过程来就简单了很多,大家都知道,点击提交后,会先初始化ActionServlet类,当接收到请求时,会调用service对象检查HTTP请求类型,通过doGet()或doPost()方法调用process()方法。在ActionServlet中会调用RequestProcessor的process()方法进行处理,该方法负责创建ActionForm对象,创建成功之后,首先执行ActionForm中的reset()方法进行重置,然后得到表单中所有输入域的name名称,再调用request.getParameterValues(),根据name名称得到相应的值,最后将表单中的数据全部放到map中,map的key为表单输入域的名称,map的value为表单输入域的值,接下来调用一个第三方组件BeanUtils,将Map中的值,根据ActionForm中的类型先转换好,再调用ActionForm中的setter方法设置到ActionForm上。
reset()方法:
赋值流程:
简单顺序:先调用构造方法(判断是否存在)——reset(重置)——setter(设定值)
五、总结
ActionForm是在Struts1中存在的一个常用类,ActionForm帮助我们实现了自动设置数据,使得程序员的使用变得简单,不用关心赋值之类的事情而专注于业务。Struts2出现后,不用人们手动写ActionForm了,但是这种思想我们需要了解。