validwhen的使用

关键字: Struts验证框架

validwhen主要用于关联验证,即为了验证某个域的值,可能会参考其它域的值来进行综合判断,以确定该域的值是否符合要求。

1,表达式及其注意事项

输入给validwhen的是一个布尔型表达式(对该表达式的解析使用了antlr),其引用名为test,即形如:
test
expression
即,当expression为真(true)时,该域验证通过,其中,expression可以使用的元素包括:

1)表单中其它域属性的名称,例如:
   test
   (color=="red")
例子中color为表单中其它某个域的属性名。

2)*this*,用于表示该域的属性名称,即对正在验证的属性自身,其变量的引用为*this*,例如:
   test
   ((color=="red") and (*this* != null))

3)可以使用一些常规运算符,如 >、<、==、>=、<=、!=、+、-、*、/、%等等。例如:
   test
   ((color=="red") and (age>=25))

4)可以使用逻辑运算 and 、or,例如:
   test
   (((color=="red") and (age>=25)) or (color!="red"))

在使用and和or时要注意一点,在同一级的逻辑运算中,同时只能存在一个逻辑运算符,要么是and,要么是or,即:
xxx and yyy或者xxx or yyy, 如果在同一级出现多于一个的and或or或and和or的组合,那么是不合法的,例如下面的表达式是不合法的:xxx and yyy and zzz或者xxx or yyy or zzz或者xxx and yyy or zzz等等
为了让复杂的表达变得合法,可以让一个复杂的表达式变为多级的表达形式,每一级只有一个and或一个or就可以了,例如:
xxx and yyy and zzz是错误的,进行一下简单的变换:
(xxx and yyy) and zzz或者xxx and (yyy and zzz)等都是合法的。

5)其他合法的输入,例如可以使用双引号和单引号引用literal字符串等等。

2,错误消息的定制
无论是validwhen还是其它验证例程,都可以定制验证出错后的错误信息,定制消息有两种方式,即全局方式和本地方式。

1)全局方式,即在validator-rules.xml中某个validator里面定义的消息,参数名为msg,例如:

xml 代码
  1. <validator name="email"  
  2.            classname="org.apache.struts.validator.FieldChecks"  
  3.            method="validateEmail"  
  4.            methodParams="java.lang.Object,   
  5.                        org.apache.commons.validator.ValidatorAction,   
  6.                        org.apache.commons.validator.Field,   
  7.                        org.apache.struts.action.ActionMessages,   
  8.                        org.apache.commons.validator.Validator,   
  9.                        javax.servlet.http.HttpServletRequest"   
  10.            depends=""  
  11.            msg="errors.email"/>   

其中,msg的值为resource bundle中的一个属性名。例如在resource bundle文件中存在如下定义:errors.email={0} is an invalid e-mail address.

2)本地方式,即在validation.xml中的field中定义的错误消息,格式为:
例如:
xml 代码
  1. <field property="endDate" depends="validwhen">  
  2. <msg name="validwhen" key="date.validwhen"/>  
  3.  <arg0 key="start time" resource="false"/>  
  4.  <arg1 key="end time" resource="false"/>  
  5.    <var>  
  6.       <var-name>testvar-name>    
  7.       <var-value>((*this* != null) and (*this*>startDate))var-value>  
  8.   var>  
  9. field>   
这里需要注意的是
* 的name属性的值应该为某个验证例程的名称,例如name="required"、name="date"等,这指明了当该field的该验证例程(例如required、date等)出错时所显示的错误信息。
*如果全局已经定义了msg的信息,而且本地的msg的key与全局的msg的key相同,那么在该field的验证中,本地的msg将覆盖全局的msg。
* 到 的属性中也有name属性,即该arg参数所应用的验证例程,例如 ,即该参数用于date验证的出错信息。注意,对于一个field,需要的验证规则有时不止一个,例如depends="required,date",而多个验证规则中的每一个都需要出错时传入一些参数信息,如果它们所需要的参数个数、名称和顺序都相同,那么只要定义
3,例子
场景:在一个表单中,有两个文本域,用于得到一个时间段,一个文本域输入起始日期(startDate),另一个输入终止日期(endDate)。
约束:日期格式为:年(四位数)-月(两位数)-日(两位数),而且终止日期大于起始日期。
根据上述条件,验证规则如下:
xml 代码
  1. <field property="startDate" depends="date">  
  2.     <arg0 key="form.date.start"/>  
  3.     <var>  
  4.         <var-name>datePatternStrictvar-name>  
  5.         <var-value>yyyy-MM-ddvar-value>  
  6.     var>  
  7. field>  
  8. <field property="endDate"  
  9.     depends="validwhen,date">  
  10.     <msg name="validwhen" key="date.validwhen"/>  
  11.     <arg0 name="validwhen" key="form.date.start"/>  
  12.     <arg1 name="validwhen" key="form.date.end"/>  
  13.     <arg0 name="date" key="form.date.end"/>  
  14.     <var>  
  15.         <var-name>testvar-name>  
  16.         <var-value>((*this* != null) and (*this*>startDate))var-value>  
  17.     var>  
  18.     <var>  
  19.         <var-name>datePatternStrictvar-name>  
  20.         <var-value>yyyy-MM-ddvar-value>  
  21.     var>  
  22. field>  
在资源文件中加入如下message:
form.date.start=起始日期
form.date.end=终止日期
date.validwhen= {0}不能大于{1}!
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值