Validator验证框架入门讲解

来源:互联网 发布:青海省干部网络培训 编辑:程序博客网 时间:2024/06/07 20:38

 一、Validator框架的优势

    Validator框架是一个Struts插件,最初由David Winterfeldt设计并实现。Validator框架从Struts 0.5时代就可以使用,但那时Validator框架只是被捐助的一个jar包。Apache组织为了使开发人员更方便地使用Validator框架,决定从Struts1.1开始,将Validator框架作为Struts的一部分同Struts一起发布。

  Validator框架可以在XML文件中配置验证规则和验证对象。因此,使用Validator框架可以无需在ActionForm的子类中覆盖validate方法就可以很方便地验证客户端的提交数据。由于Validator框架内置了很多预定义的验证机制,如验证某个属性是否存在,验证EMail是否合法等。所以在一般情况下,只需要配置XML文件就可以满足我们的验证需求。

  在使用Validator框架时,就会发现这种方式要比直接使用validate方法进行验证会给我们带来如下的好处:

  1. 更容易维护。 由于验证信息可以被放置在同一个配置文件中,因此,我们可以更容易地来维护这些验证信息。

  2. 标准化。由于很多简单的验证都是相同的。如用户名和密码都要求由字母、数字以及下划下组成。如果将这些验证都写在validate方法中,对这些验证进行标准化非常困难。而在Validator框架中的这些验证机制都是预先定义的,因此,标准化相同的验证对于Validator框架来说将是一件非常轻松的事。
3. 避免重造轮子。虽然一些验证很简单,但如果想正确实现它们也是非常困难的。一个典型的例子是验证EMail地址的格式。如果这个验证要想完美无缺,就必须按着RFC-2822规范的要求来验证EMail地址。而如果我们使用Validator框架,就无需再重造轮子来验证EMail地址了。

  4. 减少重复代码的数量。由于Validator框架提供了很多预定义的验证,因此,我们可以避免自己写很多重复的代码进行验证。当然,我们也可以将大量使用的验证封装在类的方法中,这些虽然可以避免大量的重复劳动,但这就意味着我们团队的新成员要使用这些被封装的验证方法之前必须先学习它们。而最糟糕的情况是很多开发人员可能会忘记使用这些由其他成员实现的验证库,而自己重新编写具有同样功能的验证库。当然,这一切如果使用Validator框架就都可以得到解决。

  5. 客户端和服务端验证自动切换。我们只需要简单地在JSP页面中放一个单独的<html::javascript/>元素就可以将服务端的验证转换为客户端验证(基于JavaScript的验证)

  虽然Validator框架的预定义验证已经可以满足大多数的验证需求了,但在某些特殊情况下,这些预定义验证就无法满足我们的需求了,为此,Validator框架也为开发人员提供了扩展验证机制的功能。这也使得Validator框架可以完成更复杂的验证工作。

  二、配置和使用Validator框架

 

补:

框架能够克服在ActionForm Bean中以编程方式进行数据验证的局限,它允许Struts应用灵活的配置验证规则,无需编程。
Validator框架主要依赖两个JAR文件:jakarta-oro.jar和commons-validator,.jar
Validator框架采用两个基于XML的配置文件来配置验证规则。这两个文件为validator-rules.xml和validation.xml。
Validator-rules.xml文件保换了一组通用的验证规则,对所有的Struts应用都适用。一般情况下,没有必要修改该文件,除非需要修改或扩展默认的规则。
元素有7个属性:
Name属性:name属性指定验证规则的逻辑名,这个名字必须是唯一的。
Classname和method属性:classname和method属性分别指定实现验证规则逻辑的类和方法。
MethodParams:属性用来指定验证方法包含的参数,多个参数之间以逗号隔开。
Msg属性:msg属性指定来自于Resource Bundle中的消息key。当验证失败时,Validator框架将根据这个消息key到resource Bundle中查找匹配的消息文本。
Depends属性:depends属性指定在调用当前验证规则之前必须先调用的其他验证规则。
Validator框架提供了基本的,通用的验证规则,对struts应用以及非Struts应用都适用。Org.apache.commons.validator.GenericValidator类提供了一组实现这些规则的静态方法。
GenericValidator类的验证方法:
isBlankOrNull: 验证字段是否为null,或者长度是否为0。
isByte:验证字段是否可以被转换为有小的byte类型的数据。
isCreditCard:验证字段是否为有效的信用卡号。
isDate:验证字段是否为有效的日期。
isDouble:验证字段是否可以被转换成有效的double类型的数据。
isEmail:验证字段是否为有效的Email地址。
isFloat:验证字段是否可以被转换为有效的float类型的数据。
isInRange:雁阵谷子断时候借于最小值和最大值之间。
isInt:验证字段是否可以被转换为有效的int类型的数据。
isLong:验证字段是否可以被转换为有效的long类型的数据。
isShort:验证字段是否可以被转换为有效的short类型的数据。
matchTegexp:验证字段是否和正规表达式匹配。
maxLength:验证字段时候小于或等于最大值。
minLength:验证字段时候大于或等于最小值。
在Struts框架中定义了专门用于验证表单字段的org.apache.struts.validator.FieldChecks类,它提供了和GenericValidator类似的方法。以下是FieldChecks类包含的验证方法:
validateByte
validateCreditCard
validateDate
validateDouble
validateEmail
validateFloat
validateInteger
validateLong
validateMask
validateMinLength
validateMaxLength
validateRange
validateRequired
validateShort
validation.xml文件:
这个文件是针对于某个具体Struts应用的,需要开发人员来创建,它可以为应用中的ActionForm配置所需的验证规则,取代在ActionForm类中以编程的方式来实现验证逻辑。
Validator框架不能用于验证标准的org.apache.struts.action.ActionForm类。如果要使用Validator框架应该采用ActionForm类的两个子类:DynavalidatorForm和ValidatorForm。
Validator框架可以进行浏览器客户端验证。如果要进行客户端验证,需要用到Struts的标签,它能够在JSP网页中生成用于客户端验证的JavaScript脚本。

 

 

 

 

  1. 安装Validator框架

  由于Validator是Struts的一个插件,因此,就需要在struts-config.xml文件中按着Struts插件的方式来安装Validator框架。打开struts-config.xml文件,在<struts-config>元素中加入一个<plug-in>子元素,如下面的代码所示:

 

<plug-inclassName="org.apache.struts.validator.ValidatorPlugIn">
  <set-propertyproperty="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validator.xml"/>
</plug-in>   

其中<set-property>元素设置了插件中使用的pathnames属性的值。在pathnames属性值中包含了两个xml文件。

  (1)validator-rules.xml:在这个文件中声明了Validator框架的预定义验证。这个文件可以在Struts的发行包的lib目录中可以找到这个文件。在使用MyEclipse为Web工程添加Struts功能后,会自动将这个文件加到WEB-INF目录中。

  (2)validator.xml:这个文件定义了要验证的对象。实际上,在这个文件中,包含了一个或多个ActionForm的子类及其要验证的属性和验证规则。因此,这个文件就相当于validate方法。在Validator框架中,可以有多个定义验证对象的xml文件(可以将不同的ActionForm的子类分散到不同的xml文件中),中间用逗号(,)隔开,如下面的代码所示:

<plug-inclassName="org.apache.struts.validator.ValidatorPlugIn">
  <set-propertyproperty="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validator1.xml,
                       /WEB-INF/validator2.xml, /WEB-INF/validator3.xml"/>
</plug-in>  

  2. 使用Validator框架的一个例子

  在本节将举一个例子来演示如何使用Validator框架来验证数据。我们需要按着如下的六步来完成这个例子:

  【第1步】建立FirstValidatorForm类(ValidatorForm的子类)

  在<samples工程目录>srcactionform目录中建立一个FirstValidatorForm.java文件,代码如下:

 packageactionform;
 importorg.apache.struts.validator.ValidatorForm;
 publicclassFirstValidatorFormextendsValidatorForm //必须从ValidatorForm继承
 {
   privateStringname;
   privateStringage;
   privateStringemail;
   publicStringgetName()
   {
     returnname;
   }
   publicvoidsetName(Stringname)
   {
     this.name=name;
   }
   publicStringgetEmail()
   {
     returnemail;
   }
   publicvoidsetEmail(Stringemail)
   {
     this.email=email;
   }
   publicStringgetAge()
   {
     returnage;
   }
   publicvoidsetAge(Stringage)
   {
     this.age=age;
   }
 } 

要注意的是,要想使用Validator框架验证数据,Form类就必须从ValidatorForm继承,而不能从ActionForm继承。这是因为ValidatorForm类是从ActionForm继承的,在ValidatorForm类中已经覆盖了validate方法来自动进行验证工作,因此,我们在ValidatorForm的子类中就不用写validate方法了。

  <!--[endif]-->

  【第2步】建立ValidatorAction类(Action的子类)

  在<samples工程目录>srcaction目录中建立一个ValidatorAction.java文件,代码如下:

 packageaction;
 importjavax.servlet.http.*;
 importorg.apache.struts.action.*;
 publicclassValidatorActionextendsAction
 {
   publicActionForwardexecute(ActionMappingmapping,ActionFormform,
       HttpServletRequestrequest,HttpServletResponseresponse)
   {
     response.setCharacterEncoding("GBK");
     try
     {
       response.getWriter().println("验证成功!");
     }
     catch(Exceptione)
     {
     }
     returnnull;
   }
 }

  ValidatorAction类是一个空的Struts动作类(除了输出一行“验证成功!”字符串)。这个动作是为了正常运行含有Struts元素的JSP程序所编写的。在以后的代码中会经常使用到这个Struts动作类。

  【第3步】配置struts-config.xml文件

  配置FirstValidatorForm和ValidatorAction的代码如下所示

<form-beanname="firstValidatorForm"type="actionform.FirstValidatorForm"/>
<actionname="firstValidatorForm"path="/firstValidator"scope="request" type="action.ValidatorAction" input="/firstValidator.jsp"/>  

其中firstValidator.jsp是用户录入信息的界面,也是显示错误信息的界面。

  【第4步】建立firstValidator.jsp

  在Web根目录建立一个firstValidator.jsp文件,代码如下:

 <%@pagepageEncoding="GBK"%>
 <
%@tagliburi="http://struts.apache.org/tags-html"prefix="html"%>
 <html>
  <head>
   <title>第一个Validator程序</title>
  </head>
  <body>
   <html:formaction="firstValidator">
    姓 名:
<html:textproperty="name"/>&nbsp;&nbsp;<fontcolor="red"><html:errorsproperty="name"/></font><p>
    年 龄:
<html:textproperty="age"/>&nbsp;&nbsp;<fontcolor="red"><html:errorsproperty="age"/></font><p>
   EMail:
<html:textproperty="email"/>&nbsp;&nbsp;<fontcolor="red"><html:errorsproperty="email"/></font><p>
       <html:submitvalue="提交"/>
   </html:form> 
  </body>
 </html>

  从firstValidator.jsp中可以看出,不管是否使用Validator框架进和验证,对于JSP代码来说是完全一样的。仍然是使用<html:errors>元素来显示错误信息。但要注意,在使用Validator框架时,<html:errors>元素的property属性的值就是所对应ValidatorForm的子类的属性名。

【第5步】配置validator.xml文件

  在本例中只使用了一个XML文件(validator.xml)来配置要验证的对象。validator.xml的代码如下:

 <?xmlversion="1.0"encoding="GBK"?>
 <!DOCTYPEform-validationPUBLIC
 "-//ApacheSoftwareFoundation//DTDCommonsValidatorRulesConfiguration1.1.3//EN"
      "
http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
 <form-validation>
   <formset>
     <formname="firstValidatorForm">
       <fieldproperty="name"depends="required,maxlength,minlength,mask">
         <msgname="required"key="error.name.blank"/>
         <msgname="minlength"key="error.name.minLength"/>
         <msgname="maxlength"key="error.name.maxLength"/>
         <msgname="mask"key="error.name.alphanum"/>
 
         <argname="minlength"key="${var:minlength}"position="0"resource="false"/>
         <argname="maxlength"key="${var:maxlength}"position="0"resource="false"/>
         <var>
           <var-name>minlength</var-name>
           <var-value>5</var-value>
         </var>
         <var>
           <var-name>maxlength</var-name>
           <var-value>10</var-value>
         </var>
         <var>
           <var-name>mask</var-name>
           <var-value>^[a-zA-Z0-9]*$</var-value>
         </var>
       </field>
       <fieldproperty="age"depends="required,integer,intRange">
         <msgname="required"key="error.age.blank"/>
         <msgname="integer"key="error.age.integer"/>
         <msgname="intRange"key="error.age.intRange"/>
 
         <argname="intRange"key="${var:min}"position="0"resource="false"/>
         <argname="intRange"key="${var:max}"position="1"resource="false"/>
         <var>
           <var-name>min</var-name>
           <var-value>18</var-value>
         </var>
         <var>
           <var-name>max</var-name>
           <var-value>60</var-value>
         </var> 
       </field>
       <fieldproperty="email"depends="required,email">
         <msgname="required"key="error.email.blank"/>
         <msgname="email"key="error.email.invalid"/>
       </field>
     </form>
   </formset>
 </form-validation>

validator.xml文件中的所有配置都放到<form-validation>元素中。在<form-validation>元素中有一个<formset>子元素,这个元素可以定义多个<Form>元素,这个元素用来定义要验证的ValidatorForm类的子类。其中name属性值就是<form-bean>元素中的name属性值。

  <field>元素用来定义某个属性的约束条件,如第一个<field>元素定义了name属性必须存在(required)、必须要满足最小长度(minlength)和最大长度(maxlength)以及还要通过mask所指的正则表达式的验证。

  <msg>元素用来定义出错信息在属性文件中的Key(所有的出错信息都在属性文件中)。<arg>元素用来向出错信息中的参数传递参数值。<var>元素用来定义变量名和变量值。

 【第6步】在ErrorDescription.properties文件中添加错误信息

  打开ErrorDescription.properties文件,在文件的后面添加如下的内容:

 error.name.blank=姓名不能为空
 error.name.minLength=姓名的长度不能小于{0}
 error.name.maxLength=姓名的长度不能大于{0}
 error.name.alphanum=姓名必须由字母和数字组成
 error.age.blank=年龄不能为空
 error.age.integer=年龄必须为数字
 error.age.intRange=年龄必须在{0}和{1}之间

  启动Tomcat,在IE中输入如下的URL来测试程序:

  http://localhost:8080/samples/%20firstValidator.jsp

  在输入一些错误信息后,点击“提交”按钮,将出现类似下图的效果。

 

 Struts1.x系列教程(10):Validator验证框架入门

 

 

资源收集于:

http://tech.ddvip.com/2009-02/1234498087108611_8.html