初级:ActionForm:reset()是一种钩子方法,Struts在使用提交的HTML表单填充Form Bean 前会调用该方法。validate()也是一种钩子方法,Struts在使用提交的HTML表单填充Form Bean 后会调用该方法。Form Bean 的属性可以是任何对象类型。Struts负责类型转换。最好将Form Bean 字段设置为 String 而不是去他的类型,这是因为所有的HTML表单数据都以字符串的形式输入。如果将数据存储在 Long 中,当Struts试图将字符串值转换成数字时,如果该值为字符将会庖厨NumberFormatException。当表但再次显示时,显示的无效数据为0而不是原来输入的字符串,这是因为字母不能存储在数字类型字段中。对于每一个客户请求,Struts framework在处理ActionForm的时候,一般需要经历如下几个步骤:(1)检查Action的映射,确定Action中已经配置了对ActionForm的映射 (2)根据name属性,查找form bean的配置信息 (3)检查Action的formbean的使用范围,确定在此范围下,是否已经有此form bean的实例。 (4)假如当前范围下,已经存在了此form bean的实例,而是对当前请求来说,是同一种类型的话,那么就重用。 (5)否则,就重新构建一个form bean的实例 (6)form bean的reset()方法备调用 (7)调用对应的setter方法,对状态属性赋值 (8)如果validatede的属性北设置为true,那么就调用form bean的validate()方法。(9)如果validate()方法没有返回任何错误,控制器将ActionForm作为参数,传给Action实例的execute()方法并执行。否则将生成ActionErrors并将其保存在request scope范围里,request自动跳转到有mapping里的input属性指定的页面。注意:直接从ActionFrom类继承的reset()和validate()方法,并不能实现什么处理功能,所以有必要自己重新覆盖。仅当ActionMapping对象中validate属性被设为true时,validate(…)方法被调用;这就是默认的行为。request.getParameterValues(parameterName)被用于得到一个String[]对象,它用来表单填充;验证的结果应该是一个ActionErrors对象,用org.apache.struts.taglib.html.ErrorsTag来显示验证错误给用户在struts1.1中,ActionForm的校验功能,逐渐被剥离出来(当然依然可以使用)。使用了validator framework对整个应用系统的表单数据验证进行统一管理。 高级: 有两大类form bean: 第一类是不需要使用validator验证机制的ActionForm:org.apache.struts.action.ActionForm和org.apache.struts.action.DynaActionForm1. ActionForm是常规类,form bean必须是AcitonForm的一个子类,在子类中设置相关属性。2. 若form bean设置为org.apache.struts.action.DynaActionForm则不需要生成具体的form bean且 他的属性可以在struts-config.xml里的form-bean元素里指定。原先form bean里的validation()功能在action里执行。reset()方法不起作用。若需要,则需重新写一个DynaActionForm类的子类并覆盖reset()方法。然后将form –bean元素的type属性设置为该子类。 第二类是使用validator验证框架的formbean:org.apache.struts.validator.ValidatorFormorg.apache.struts.validator.ValidatorActionFormorg.apache.struts.validator.DynaValidatorFormorg.apache.struts.validator.DynaValidatorActionForm1. 第一种validatorForm:他与没有使用Validator的ActionForm很相似,不同的是form bean是有ValidatorForm 派生来的而不是ActionForm.该类没有实现reset()和validation()方法。因为ValidatorForm实现这些方法。2. 第二种ValidatorActionForm:第一种中,validator.xml文件中的验证定义与form bean关联起来,对于多个操作共享form bean时是理想的。但有时不同的操作需要不同的验证方法,因此可以将validator.xml文件中的验证定义不与form bean 关联而与操作路径关联,这就用到ValidatorActionForm。eg:两种操作创建地址和编辑地址路径/createAddress和/editAddress。struts-config.xml:<action-mappings> <action path=”/createAddress”type=”sample.CreateAddressAction”name=”addressForm”/><action-mappings> <action path=”/editAddress”type=”sample.EditAddressAction”name=”addressForm”/>虽然他们对应相同的addressForm,但可以通过不同的路径来区分。validation.xml:<formset> <form name=”/createAddress”><field property=”city” depends=”required”> <arg0 key=”prompt.city”/></field></form><form name=”/editAddress”><field property=”state” depends=”required”> <arg0 key=”prompt.state”/></field></form>由于你的form bean是ValidatorActionForm,Validator知道使用操作路径而不是form bean逻辑名称来进行验证。3. 第三四种:DynaValidatorForm、DynaValidatorActionForm:分别与第一二种对应。不同的是不创建定义form bean的类文件。只需在<form-bean>里定义一个form bean 和他的属性即可。

评论