在J2EE中,绝大部分客户端的数据都是通过表单提交到服务器端,而关于表单数据的收集,都是由Struts核心控制器ActionServlet完成的,它是通过标准的JavaBean命名规范来将表单数据封装在ActionForm中;
ActionForm用于封装用户的请求参数,而请求参数是通过JSP页面的表单域传递过来的,因此要保证ActionForm的参数属性与表单域的名字相同,注意ActionServlet并不是通过ActionForm中的私有属性的名称来进行封装注值,因为这个私有属性对外部属性是不可见的。因此ActionServlet是通过对应额setter和getter方法来封装注值的。
ActionFrom的生命周期:
说明:
在每次为ActionForm赋值前调用他的reset方法,其作用是使ActionForm中的值恢复初始状态,在应用中,我们可以通过在reset中为变量赋初值的方式,使得页面上的某个对象有显示值。
如果可视范围是request,则reset方法并不是很重要,因为你每次调用时都会产生一个新的ActionForm实例,所以你所操作的ActionForm不会与别人分享同时也就不会受别人的影响;如果可视范围是 session,由于在session范围内此ActionForm是唯一的,所以你在session范围内需要用到此ActionForm的地方调用的都是同一个ActionForm,要是你没有在reset中对变量赋初值那么前一次调用ActionForm是为它赋的值将在此次调用时有效,这到也没什么。但是,如果恰巧再次调用时你仅仅需要为ActionForm中的一部分变量赋值,那么其余的变量将保持上一次得到的值,这样你就得到了一个“新旧混合体”,我想这多半不是你所期望的;如果可视范围是application,那其影响就更是不难理解了,这时不但是你自己会影响你自己,使用应用的其他用户的操作也会影响到你。
ActionForm Bean从应用和配置的角度分为两类:动态ActionForm和静态ActionForm都是成对出现的,作用一样,只是实现不一样;
1、静态ActionForm:由程序员手工编写Form
1.ActionForm:提交表单的字段名和form中的属性名一致。
2.ValidatorForm:用于验证框架的Form,在请求参数前,先使用验证框架验证。 在struts-config中对应的action标签的validate值为true。 基于Form name的校验
3.ValidatorActionForm:基于Form path的校验
二、动态ActionForm:(通过配置文件完成ActionForm配置 )
Struts提供了动态ActionForm类,通过动态ActionForm,可以完全不用书写ActionForm,只需在struts-config.xml文件中配置即可,所有的动态ActionForm的实现类都必须是org.apache.struts.action.DynaActionForm类,或者是他的子类。
因为系统不清楚动态ActionForm属性,所以必须在配置文件中配置对应的属性,可以form-property元素来配置动态ActionForm的属性
<form-bean name="TeacherForm" type="org.lxh.form.TeacherForm"> <form-property name="id" type="java.lang.Integer" /> <form-property name="name" type="java.lang.String" /> </form-bean>
从上面的配置文件可以看出,动态ActionForm的配置必须增加form-property元素,每个属性必须对应一个form-property元素,其包含两个属性,一个是name,必须与jsp页面的表单域的名字相同,另一个是type,为属性的类型;
使用动态ActionForm同样用于封装用户请求参数,同时也不需要编写ActionForm类了,但该ActionForm没有各属性的getter和setter,因此无法调用对应的getter方法来解析请求参数,我们这样使用:
public ActionForward add(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { DynaActionForm dynaActionForm = (DynaActionForm) form; String username = (String) dynaActionForm.get("username"); String password = (String) dynaActionForm.get("password"); UserPersistent userPersistent = new UserPersistent(); if (userPersistent.addUser(username, password)) { return mapping.findForward("success"); } else { return mapping.findForward("error"); } }
使用动态ActionForm时,请求参数必须使用DynaActionForm的getter方法获取,有如下三种;
Object get(java.lang.String name):根据属性名返回对应的值;
Object get(java.lang.String name,int index):对于有多个重名表单域的情况,Struts将其当成数组处理,此处根据表单域和索引获取对应值;
Object get(java.lang.String name,java.lang.String key):对于使用Map属性的情况,根据属性名及对应key,获取对应的值;
动态ActionForm总结:
使用动态ActionForm的目的是为了减少代码的书写量,但是配置变得更复杂了,而普通ActionForm使解析请求参数变得更直观;动态ActionForm其实就是把页面中的html元素的名称和值放到了map中,所以通过get方法可以取出相应的值;
但是,其reset方法和validate方法调用不了,不能继承,所以不够灵活
1.DynaActionForm
<form-bean name="loginForm" type="org.apache.struts.action.DynaActionForm"> <form-property name="username" type="java.lang.String"/> <form-property name="password" type="java.lang.String"/> </form-bean>
DynaActionForm lForm = (DynaActionForm)form; String username = (String) lForm.get("username"); String password = (String) lForm.get("password"); System.out.println("username:"+username+"->"+password); return mapping.findForward("success");
无法提供默认的验证行为。
2.DynaValidatorForm :和ValidatorForm一样在使用验证框架时使用。配置和DynaActionForm类似。
type="org.apache.struts.validator.DynaValidatorForm"
3.DynaValidatorActionForm:
ValidatorActionForm和DynaValidatorActionForm也都是在使用验证框架时使用,和DynaValidatorForm及ValidatorForm不同的是,在配置validtion.xml中<form name=path> name使用的是action的path属性值。以此来区分不同请求的验证规则。
三.还有一种特殊的Form ,LazyValidatorForm。
<form-bean name="loginForm" type="org.apache.struts.validator.LazyValidatorForm"></form-bean>
我们没有配置form的属性。所以在jsp页面中必须使用struts标签。
<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中的取值。
LazyValidatorForm lz = (LazyValidatorForm)form; String username = (String)lz.get("username"); String usercode = (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")); return null;
LazyValidatorForm总结:
1、不需写Java类
2、不需要配置属性
3、对页面没有任何要求
4、可以支持验证