Validator验证框架
Struts框架能够在ActionForm Bean 的validate()方法中对用户输入的表单数据进行验证。这种验证方法有两种局限性: 必须通过程序代码来实现验证逻辑,如果验证逻辑发生变化,必须重新编写和编译程序代码。 当系统中有多个ActionForm Bean,并且它们包含一些相同的验证逻辑时,开发人员必须对每个ActionForm Bean进行重复编程,完成相同的验证逻辑,这会降低代码的可重用性。 Validator框架主要依赖于两个JAR文件: Jakarta-oro.jar,提供了一组处理文本的类,具有文本替换、过滤和分割等功能。 Commons-validator.jar;提供了一个简单、可扩展的验证框架,包含了通用的验证方法和验证规则。 Validator框架采用两个基于XML的配置文件来配置验证规则。这两个文件为validator-rules.xml和validation.xml。在struts应用中,它们均放在WEB-INF目录下。 validator-rules.xml文件: validator-rules.xml文件包含了一组通用的验证规则,对所有的Struts应用都适用。 Validation.xml文件 Validation.xml文件是针对于某个具体Struts应用的,需要开发人员来创建,它可以为应用中的ActionForm配置所需要的验证规则。 下面显示了一个简单的validation.xml文件样例。 <form-validation> <golobal> <constant> <constant-name>phone</ constant-name> <constant-value>^/d{8}*$</constant-value> </constant> </golobal> <formset> <form name=”checkoutForm”> <field property=”phone” depends=”required,mask,minlength”> <arg0 key=”label.phone”/> <arg1 name=”minilength” key=”${var:minlength}” resource=”false”/> <var> <var-name>mask</ var-name > <var-value>${phone} </var-value> </var> <var> <var-name>minlength</ var-name > <var-value>7 </var-value> </var> </field> </form> </formset> </form-validation> 1.<form-validation>元素 validation_1_1.dtd描述了validation.xml文件的语法。validation.xml文件的根元素为<form-validation>元素,它包含两个子元素:<global>和<formset>。<global>元素可以出现零次或多次,而<formset>元素可以出现一次或多次。它们的DTD定义如下: <!element form-validation(global*,formset+)> 2.<global>元素 在<global>元素中可以定义<constant>子元素,它用来定义常量表达式,在文件的其余地方可以引用这些常量表达式。以下代码配置了两个<constant>元素: <golbal> <constant> <constant-name>phone</constant-name> <constant-value>^/d{8}/d*$</constant- value > </constant> <constant> <constant-name>zip</constant-name> <constant-value>^/d{6}/d*$</constant- value > </constant> </golbal> 以上代码定义了两个常量phone和zip,在<formset>元素中可以通过${constant-name}的形式来引用它们,例如访问phone常量的形式为${phone}. 3.<formset>元素 <formset>元素包含两个子元素:<constant>和<form>。<constant>可以出现零次或多次,<form>元素可以出现一次或多次。 提示 在<global>中定义的<conatant>元素代表全局常量,而在<formset>元素中定义的<conatant>元素代表局部常量,后者只能在当前<formset>元素中使用 <formset>元素有两个属性:language和country。Language和country属性用于支持I18N。本章的10.7节将对此做介绍。 4.<form>元素 <formset>元素的<form>子元素用于为表单配置验证规则,它的name属性指定了表单的名字。<form>元素可以包含一个或多个<field>子元素. 5.<field> <form>元素的<field>子元素用于配置表单中字段的验证规则。例如对checkoutForm表中的 phone字段配置了验证规则/ 对<field>元素的属性做了描述。 <field>元素的属性 Property 指定ActionForm Bean中需要进行验证的字段的名字 Depends 指定字段的验证规则,多个规则之间以逗号隔开。 <field>元素也包含一些子元素,它的DTD定义如下: <!element field(msg?,arg0?, arg1?, arg2?, arg3?,var*)> 6.<msg> <field>元素的<msg>子元素指定验证规则的对应的消息文本。该消息文本将替代在validator-rules.xml文件中为验证规则配置的默认的消息文本。例如: <field property=”phone” depends=”required,mask,minlength”> <msg name=”mask” key=”phone.invalidformat”/> …. </field> 以上代码的<msg>元素表明,当”mask”验证规则验证失败时,错误消息文本来自于 Resource Bundle,消息key为 “phone.invalidformat”. <msg>元素有三个属性, DTD定义如下: <!ATTLIST msg name CDATA#IMPLIED key CDATA#IMPLIED resource CDATA#IMPLIED > 对<msg>元素的属性做说明。 属性 描述 Name 指定验证规则的名字 Key 当resource属性为true时,key属性指定消息key,该消息key应该在Resource Bundle中存在,当resource属性为true时,属性直接指定消息文本 Resource 当此项为true时,表示使用来自 Resource Bundle的消息,如果为false,表示直接在key属性中设置消息文本,默认值为true 7.<arg>元素 <field>元素可以包含四个附加的子元素:<arg0><arg1><arg2><arg3>,用于替换复合消息中的参数。<arg0>元素指定第一个替换值,<arg1>指定第二个值,依次类推。每个arg元素包含三个属性:name、key和resource,这些属性用法和<msg>元素很相似。 包含<arg0><arg1>元素的<field>元素 <field Property=”phone” depends=”required,mask,minlength” <arg0 key=”label.phone”/> <arg1 name=”minlength” key=”${var:minlength}” resource=”false”/> <var> <var-name>mask</var-name> <var-value>${phone}</var-value> </var> <var> <var-name>minlength</var-name> <var-value>7</var-value> </var> 以上代码没有配置<msg>元素,因此当某个验证规则失败时,将使 用在validator-rules.xml中配置的默认消息文本。例如,如果 minlength验证规则失败,则validator-rulex.xml中设置的消息 key为”errors.minlength”: <validator name=”minLength” ….. Msg=”errors.minlength” </validator> 在资源文件中与errors.minlength匹配的中文消息文本为: errors.minlength={0}不能少于{1}字符 <arg0>元素没有设置name属性,因此适用于所有验证规则,它将取 代以上复合消息中的第一个参数{0},<arg0>元素的key属性 为”label.phone”,在资源文件中与之匹配的中文消息文本为: label.phone=电话 <arg1>元素的name属性为”minlength”,表示仅适用 于”minlength”验证规则。它将取代以上复合消息中的第二个参数 {1}.<arg1>元素的resource属性为false,表明此时key属性直接指 定文本。key属性值由变量${var:minlength}决定,此处值为7. 当”minlength”验证规则验证失败时,<arg0>和<arg1>元素将分别 取代以上复合消息中的两个参数。 8.<var>元素 <field>元素还可以包含零个或多个<var>元素。<var>元素用来向验 证规则传递参数。 <var> <var-name>mask</var-name> <var-value>${phone}</var-value> </var> phone常量的值为”^/d{8}/d*$”,它定义了一种字符模式,表示字 符串长度为8位,并且只能包含数字字符。mask验证规则能够比较 用户输入的phone字段是否和指定的字符模式匹配。 <arg>元素也可以访问<var>元素,语法为${var:var-name},例如: <arg1 name=”minlength” key=”${var:minlength}” resource=”false”/> <var> <var-name>minlength</var-name> <var-value>7</var-value> </var> Validator插件 为了在Struts框架中使用Validator,可以采用插件机制把Validator加入到框架中。这需要在Struts配置文件中配置ValidatorPlugIn插件,代码如下: <plug-in className=”org.apache.struts.validator.ValidatorPlugIn”> <set-property propery=”pathnames” value=”/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml”/> </plug-in> 当应用启动时,Struts框架会加载ValidatorPlugIn插件并调用它的init()方法。init()方法根据pathnames属性,加载相应的validator-rules.xml和validation.xml文件,把验证信息读入到内存中。 Validator框架和ActionForm Validator框架不能用于验证标准的org.apache.struts.action.ActionForm类。如果要使用Validator框架,应该采用ActionForm类的两个子类:org.apache.struts.validator.DynavalidtorForm和org.apahce.struts.validator.ValidatorForm。ActionForm类及其子类的框图如图: DynaValidatorForm支持在动态ActionForm中使用Validator框架,ValidatorForm支持在标准ActionForm中使用Validator框架。无论是对于动态ActionForm还是标准ActionForm,配置Validator框架的方式都是一样的。 DynavalidatorForm和ValidatorForm类都实现了validate()方法,所以当创建他们的子类时,不必再覆盖validate()方法。validatorForm类的validate()方法的代码如下: public ActionErrors validate(ActionMapping mapping,HttpServletRequest request){ ServletContext application = getServlet().getServletContext(); ActionErrors errors = new ActionErrors(); String validationKey = getValidationKey(mapping,request); Validator validator = Resources.initValidator(validationKey, this,application,request,error,page); try{ validatorResults = validator.validate(); }catch(ValidatorException e){ log.error(e.getMessage(),e); } return errors; } 以上validate()方法调用验证框架的验证方法进行验证,如果验证失败,就会创建包含错误消息的ActionMessage对象,并把该对象添加到ActionErrors集合对象中。validate()方法最后返回ActionErrors对象。 ValidatorForm有一个子类ValidatorActionForm。下图指示为这两种类的区别。 Validator框架提供这两种类的目的在于可以更加精确的控制执行验证条件。例如, 假定有个名为“editForm”的表单对应两个Action:saveAction和cancelAction,如图: 假定editForm表单包含两个验证规则:验证A和验证B。如果对于用的保存或取消动作,都要执行两个验证,则可以创建一个扩展ValidatorForm类的EditForm类,然后再validation.xml中作如下配置: <formset> <form name=”editForm”> 验证规则A 验证规则B </form> ……. </formset> 如果对于用户的保存动作,仅执行验证规则A,对于取消动作,仅执行验证规则B,则可以创建一个扩展ValidatorActionForm类,然后再validation.xml中作如下配置: <formset> <form name=”/save”> 验证规则A </form> <form name=”/cancel”> 验证规则B </form> ….. </formset> 对于动态ActionForm,也有DynaValidatorForm和DynaValidatorActionForm之分,它们的区别于ValidationForm和ValidatorActionForm的区别一样。 |
Structs的validator验证框架(转)
最新推荐文章于 2013-04-30 14:56:00 发布