免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1014 | 回复: 0
打印 上一主题 下一主题

Validator概述 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-21 22:27 |只看该作者 |倒序浏览

Validator概述
没有Validator,你就不得不编写验证表单数据所需的全部代码,并把它放入Form
Bean对象的validate( )方法中。对于想在其上进行数据验证的每个Form Bean域
来说,都需要编写逻辑代码来实现验证。此外,你还必须编写代码来存储验证失
败时的出错消息。
有了Validator,你就不必在Form Bean中编写用于验证或存储错误消息的任何代
码。相反,Form Bean提供了Validator的一个ActionForm子类,它提供验证或存
储错误消息的功能。
可把Validator框架作为一个可用于Form Bean验证的可插入的验证例行程序系统
来进行安装。每个验证例行程序都只是一个Java方法,负责执行特定类型的验证
任务,验证可能通过,也可能失败。 默认情况下,Validator与几个有用的验证
例行程序封装在一起来提供,这些例行程序能满足大多数情况下的验证要求。但
是,假如Validator框架没有提供你需要的验证例行程序,那么你可以自己创建定
制的验证例行程序,并将它插入到该框架中。此外,Validator还支持服务器端和
客户端(javascript)的验证,而Form Bean只提供服务器端验证界面。
Validator使用两个XML配置文件来分别确定安装哪个验证例行程序和如何将它们
应用于给定的应用程序。第一个配置文件validator-rules.xml说明应该被插入到
框架中的验证例行程序,并提供每个验证的逻辑的名称。validator-rules.xml文
件还定义了每个验证例行程序的客户端JavaScript代码。可以配置Validator让它
把这个JavaScript代码发送到浏览器上,这样验证就可以在客户端和服务器端进
行了。
第二个配置文件validation.xml确定哪个验证例行程序应用到哪个Form Bean。文
件中的定义使用struts-config.xml文件给出的Form Bean的逻辑名称以及
validator-rules.xml文件给出的验证例行程序的逻辑名称,以便把二者关联起来

使用Validator框架包括启用Validator插件、配置Validator的两个配置文件,以
及创建提供Validator的ActionForm子类的Form Beans。下面具体解释如何配置和
使用Validator。
启用Validator插件
虽然Validator框架是与Struts封装在一起提供的,但在默认状况下Validator并
不被启用。为了启用Validator,要向你的应用程序的struts-config.xml文件中
添加下面的插件定义。
  
  validation.xml"/>
该定义告诉Struts为你的应用程序加载并初始化Validator插件。在初始化时,该
插件装入由路径名属性指定的、用逗号分隔的Validator配置文件清单。每个配置
文件的路径应该用与Web应用程序的相关的路径来指定,如前面的例子所示。
请注重,你的应用程序的struts-config.xml文件必须与Struts Configuration
Document Type Definition(Struts配置文档类型定义,DTD)一致,后者规定文
件中元素出现的顺序。所以,你必须把Validator插件定义放到该文件的适当位置
。确保文件中元素适当排列的最简便方法就是使用诸如Struts Console的工具,
它自动格式化你的配置文件,以便与DTD保持一致。
配置validator-rules.xml
Validator框架可以设置为可插入系统,其验证例行程序仅仅是插入到该系统中执
行具体验证的Java方法。validator-rules.xml文件说明性地插入Validator用于
执行验证的验证例行程序中。Struts示例应用程序带有这个文件的预配置拷贝。
在大多数情况下,你不必修改这个预配置拷贝,除非你要向该框架中添加自己定
制的验证。
清单1 是一个示例validator-rules.xml文件,说明如何将验证例行程序插入到
Validator中。validator-rules.xml文件中的每个验证例行程序都有自己的定义
,它用validator标记声明,利用name属性为该验证例行程序指定逻辑名,并指定
该例行程序的类和方法。该例行程序的逻辑名称供该文件中的其他例行程序以及
validation.xml文件中的验证定义用于引用该例行程序。
请注重,validator标记放在javascript的标记中,javascript标记用于定义客户
端JavaScript代码,以便在客户端执行与服务器端相同的验证。
提供的验证程序
默认情况下,Validator中包括几个基本验证例行程序,你可以用它们来处理大多
数验证问题。这些例行程序具有逻辑名称,如required(用于输入要求的值)、
CreditCard(用于输入信用卡号码值)、email(用于输入电子邮件地址值),等
等。
创建Form Bean
为了使用Validator,你的应用程序的Form Bean必须归到Validator的ActionForm
的某一子类,而不是ActionForm本身。Validator的ActionForm子类提供了
ActionForm的validate( )方法(它嵌入到Validator框架中)的实施过程。你不
必从头编写验证代码并把它投入validate( )方法中,相反,可以完全忽略该方法
,因为Validator为你提供了验证代码。
与Struts提供的核心功能相类似,Validator提供给你两种可供选择的方法来创建
Form Bean。 你可以选择的第一种方法就是像下面这样创建一个特定的Form Bean
对象:
package com.jamesholmes.minihr;
import org.apache.struts.validator
.ValidatorForm;
public class LogonForm extends ValidatorForm {
  private String username;
  private String passWord;
  
  public String getUsername() {
    return username;
  }
  
  public void setUsername(String
username) {
    this.username = username;
  }
  public String getPassword() {
    return password;
  }
public void setPassword(String
password) {
    this.password = password;
  }
}
这个类与你不是用Validator所创建的类相似,但它提供ValidatorForm而不是
ActionForm。这个类也不提供ActionForm的空reset( )和validate( )方法的实施
过程,因为ValidatorForm提供了相应过程。
在struts-config.xml文件中配置这个特定Form Bean的方法与配置正则Form Bean
的方法相同:
  
用表单标记的name属性给特定Form Bean指定的逻辑名是在定义validation.xml文
件中的验证时所使用的名称,如下所示:
  
   
      
        
      
   
  
Validator使用该表单标记的name属性的值将验证定义与要应用这些定义的Form
Bean的名称相匹配。
创建Form Bean时可以选择的第二种方法是在struts-config.xml文件中定义一个
动态Form Bean,如下所示:
  
   
   
  
动态Form Bean不要求创建特定的Form Bean对象;相反,要定义Form Bean应该具
有的属性和类型,而Struts为你动态创建Form Bean。 Validator答应你使用这个
概念,就像在核心Struts中使用这个概念一样。与使用Validator的惟一区别就是
要指定Form Bean是org.apache.struts.validator.DynaValidatorForm类型,而
不是org.apache.struts.action.DynaActionForm类型。
分配给动态Form Bean的逻辑名是在定义validation.xml文件中的验证时使用的名
称。Validator使用与之相匹配的名称将这些验证与Form Bean联系在一起。
除了创建Form Bean的这两种标准方法之外,Validator还提供了一个高级特性,
用于将多个验证定义与一个Form Bean定义联系起来。当你使用基于
validatorForm或基于DynaValidatorForm的Form Bean时,Validator使用struts
-config.xml文件中的Form Bean的逻辑名称,将Form Bean映射到validation.xml
文件中的验证定义。这种机制在大多数情况下非常有用,但在某些时候,Form
Bean要在多个操作中共享。 一个操作可能使用Form Bean的所有域(fields),
而另一个操作可能只使用这些域的一个子集。因为验证定义被连接到Form Bean,
所以只使用域的一个子集的操作就无法绕过对未使用域的验证。当验证Form Bean
时,就会对未使用的域生成错误消息,因为Validator无从知道不去验证未使用的
域,它只是简单地把它们看作缺失或无效。
为了解决这个问题,Validator提供了两个附加的ActionForm子类,它使你能够将
验证与操作相关联,而不是与Form Bean相关联。这样你就可以根据哪个操作正在
使用Form Bean来指定把哪些验证用于该Form Bean了。对于特定的Form Bean,你
要像下面这样声明org.apache.struts.validator.ValidatorActionForm子类:
public class AddressForm extends ValidatorActionForm {
  ...
}
对于动态Form Bean,在struts-config.xml文件中为Form Bean定义指定
org.apache.struts.validator.DynaValidatorActionForm的类型,如下所示:
  ...
在validation.xml文件中,把一组验证映射到一个操作路径,而不是映射到Form
Bean名,因为假如你定义了Create Address和Edit Address两个操作(它们使用
同一个Form Bean),那么每个操作都会有一个惟一的操作名,如下所示:
  
  
下面的validation.xml文件片断显示了两组验证,它们用于同一个Form Bean,但
却有不同的操作路径:
  
   
      
   
  
  
   
      
   
  
因为Form Bean要么属于ValidatorActionForm子类,要么属于
DynaValidatorActionForm子类,所以Validator知道用一个操作路径代替Form
Bean的逻辑名称来找出用于Form Bean的验证。
配置validation.xml文件
validation.xml文件用于声明将应用到Form Beans的一组验证。要验证的每个
Form Bean在这个文件中都有自己的定义。在这个定义中,指定要应用到该Form
Bean的各域的验证。下面是一个validation.xml文件的例子,说明如何定义验证

  
   
      
        
      
      
        
      
   
  
validation.xml文件的第一个元素是form-validation。这个元素是该文件的主元
素,而且只定义一次。在form-validation元素内定义form-set元素,它包括多个
表单元素。一般来说,在文件中只定义一个form-set元素,但是假如要将验证国
际化,那就要在每个地方单独使用一个form-set元素。
每个表单元素使用name属性将名称与其所包含的域验证集关联起来。Validator使
用这个逻辑名称将这些验证映射到在struts-config.xml文件中定义的一个Form
Bean。根据要验证的Form Bean的类型,Validator力求将该名称与Form Bean的逻
辑名称或操作路径相匹配。在表单元素内,field元素定义要应用到Form Bean的
特定域的验证。field元素的property属性对应于特定Form Bean中的域名。
depends属性利用validator-rules.xml文件指定验证例行程序的逻辑名称,这些
例行程序将应用到域验证中。
配置ApplicationResources.properties
Validator使用Struts的资源绑定(Resource Bundle)机制将错误消息具体化。
不用在框架中对错误消息进行硬编码,Validator使你能在
ApplicationResources.properties文件中为一个消息指定一个键值,假如验证失
败则将返回该键值。validator-rules.xml文件中的每个验证例行程序都用
validator标记的msg属性指定错误消息的键值,如下所示:
.struts.validator.FieldChecks"
          method="validateRequired"
          methodParams="java.lang
.Object, org.apache.commons.validator
.ValidatorAction, org.apache.commons
.validator.Field, org.apache.struts
.action.ActionErrors, javax.servlet
.http.HttpServletRequest"
          msg="errors.required">
假如在验证例行程序运行时验证失败,则返回与msg属性指定的键值对应的消息。
下面的片段显示来自ApplicationResources.properties文件的验证出错时的默认
消息集,它们由Struts示例应用程序提供。每个消息的键值对应于每个由
validator-rules.xml文件中的验证例行程序所指定的消息,它们由Struts示例应
用程序提供。
# Error messages for Validator framework validations
errors.required={0} is required.
errors.minlength={0} cannot be less than {1} characters.
errors.maxlength={0} cannot be greater than {2} characters.
errors.invalid={0} is invalid.
errors.byte={0} must be a byte.
errors.short={0} must be a short.
errors.integer={0} must be an integer.
errors.long={0} must be a long.0.   errors.float={0} must be a float.
errors.double={0} must be a double.
errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is not a valid credit card number.
errors.email={0} is an invalid e-mail address.
请注重,每条消息都有占位符,形式为{0}、{1}或{2}。在运行期间,占位符被另
一个值代替,如所验证的域的名称。这一特性非凡有用,它使你能够创建可被几
个不同的域重复使用的通用验证错误消息。
例如,下面给出required验证的错误消息errors.required:
errors.required={0} is required.
当你使用validation.xml文件中的该required验证时,必须定义用于替换该错误
消息中的{0}的值,如下所示:
  
   
  
错误消息最多可以有4个占位符:{0}和{3}。这些占位符分别称为arg0到arg3,你
可以通过使用arg0~arg3标记来指定它们。在上面的例子中,arg0标记指定了用于
替换{0}占位符的值。该标记的key属性指定来自
ApplicationResources.properties文件的一个消息键值,它的值用于替换占位符


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/57282/showart_469063.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP