`

validator验证框架

阅读更多

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的区别一样。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics