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