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

一、 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 框架可以完成更复杂的验证工作。
<!--[endif]-->

二、配置和使用 Validator 框架

  1.   安装 Validator 框架

     由于 Validator Struts 的一个插件,因此,就需要在 struts-config.xml 文件中按着 Struts 插件的方式来安装 Validator 框架。打开 struts-config.xml 文件,在 <struts-config> 元素中加入一个 <plug-in> 子元素,如下面的代码所示:
< plug-in  className ="org.apache.struts.validator.ValidatorPlugIn" >
    < set-property  property ="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 文件中),中间用逗号 (,) 隔开,如下面的代码所示:
<!--[endif]-->

< plug-in  className ="org.apache.struts.validator.ValidatorPlugIn" >
    < set-property  property ="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 工程目录 >\src\actionform 目录中建立一个 FirstValidatorForm.java 文件,代码如下:
   package  actionform;
  
import  org.apache.struts.validator.ValidatorForm;
  
public   class  FirstValidatorForm  extends  ValidatorForm   //  必须从ValidatorForm继承
  {
      
private  String name;
      
private  String age;
      
private  String email;
      
public  String getName()
      {
          
return  name;
      }
      
public   void  setName(String name)
      {
          
this .name  =  name;
      }
      
public  String getEmail()
      {
          
return  email;
      }
      
public   void  setEmail(String email)
      {
          
this .email  =  email;
      }
      
public  String getAge()
      {
          
return  age;
      }
      
public   void  setAge(String age)
      {
          
this .age  =  age;
      }
  }
     要注意的是,要想使用 Validator 框架验证数据, Form 类就必须从 ValidatorForm 继承,而不能从 ActionForm 继承。这是因为 ValidatorForm 类是从 ActionForm 继承的,在 ValidatorForm 类中已经覆盖了 validate 方法来自动进行验证工作,因此,我们在 ValidatorForm 的子类中就不用写 validate 方法了。
<!--[endif]-->

【第 2 步】 建立 ValidatorAction 类( Action 的子类)
     <samples 工程目录 >\src\action 目录中建立一个 ValidatorAction.java 文件,代码如下:
   package  action;
  
import  javax.servlet.http. * ;
  
import  org.apache.struts.action. * ;
  
public   class  ValidatorAction  extends  Action
  {
      
public  ActionForward execute(ActionMapping mapping, ActionForm form,
              HttpServletRequest request, HttpServletResponse response)
      {
          response.setCharacterEncoding(
" GBK " );
          
try
          {
              response.getWriter().println(
" 验证成功! " );
          }
          
catch  (Exception e)
          {
          }
          
return   null ;
      }
  }
        ValidatorAction 类是一个空的 Struts 动作类(除了输出一行“验证成功!”字符串)。这个动作是为了正常运行含有 Struts 元素的 JSP 程序所编写的。在以后的代码中会经常使用到这个 Struts 动作类。

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

     配置 FirstValidatorForm ValidatorAction 的代码如下所示
< form-bean  name ="firstValidatorForm"  type =" actionform.FirstValidatorForm"   />
< action  name ="firstValidatorForm"  path ="/firstValidator"  scope ="request"  type =" action.ValidatorAction"   input ="/firstValidator.jsp" />         
其中 firstValidator.jsp 是用户录入信息的界面,也是显示错误信息的界面。

【第 4 步】 建立 firstValidator.jsp
     Web 根目录建立一个 firstValidator.jsp 文件,代码如下:
<!--[endif]-->

   < %@ page  pageEncoding ="GBK" % >
  
< %@ taglib  uri ="http://struts.apache.org/tags-html"  prefix ="html" % >
  
< html >
    
< head >
      
< title > 第一个Validator程序 </ title >
    
</ head >
    
< body >
      
< html:form  action ="firstValidator"   >
         姓  名:
< html:text  property ="name"   /> &nbsp;&nbsp; < font  color ="red" >< html:errors  property ="name" /></ font >< p >
         年  龄:
< html:text  property ="age" /> &nbsp;&nbsp; < font  color ="red" >< html:errors  property ="age" /></ font >< p >
       EMail:
< html:text  property ="email" /> &nbsp;&nbsp; < font  color ="red" >< html:errors  property ="email" /></ font >< p >
              
< html:submit  value ="提交" />
      
</ html:form >   
    
</ body >
  
</ html >
    从 firstValidator.jsp 中可以看出,不管是否使用 Validator 框架进和验证,对于 JSP 代码来说是完全一样的。仍然是使用 <html:errors> 元素来显示错误信息。但要注意,在使用 Validator 框架时, <html:errors> 标签的 property 属性的值就是所对应 ValidatorForm 的子类的属性名。



【第 5 步】 配置 validator.xml 文件
     在本例中只使用了一个 XML 文件 (validator.xml) 来配置要验证的对象。 validator.xml 的代码如下:
<!--[endif]-->

   <? xml version="1.0" encoding="GBK"  ?>
  
<! DOCTYPE form-validation PUBLIC
   "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
            "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd"
>
  
< form-validation >
      
< formset >
          
< form  name ="firstValidatorForm" >
              
< field  property ="name"  depends ="required,maxlength,minlength,mask" >
                  
< msg  name ="required"  key ="error.name.blank"   />
                  
< msg  name ="minlength"  key ="error.name.minLength"   />
                  
< msg  name ="maxlength"  key ="error.name.maxLength"   />
                  
< msg  name ="mask"  key ="error.name.alphanum"   />
  
                  
< arg  name ="minlength"  key ="${var:minlength}"  position ="0"  resource ="false"   />
                  
< arg  name ="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 >
              
< field  property ="age"  depends ="required,integer,intRange" >
                  
< msg  name ="required"  key ="error.age.blank"   />
                  
< msg  name ="integer"  key ="error.age.integer"   />
                  
< msg  name ="intRange"  key ="error.age.intRange"   />
  
                  
< arg  name ="intRange"  key ="${var:min}"  position ="0"  resource ="false"   />
                  
< arg  name ="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 >
              
< field  property ="email"  depends ="required,email" >
                  
< msg  name ="required"  key ="error.email.blank"   />
                  
< msg  name ="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



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






 本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/215191,如需转载请自行联系原作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值