validwhen主要用于關聯驗證,即為了驗證某個域的值,可能會參考其它域的值來進行綜合判斷,以確定該域的值是否符合要求。
1,表達式及其注意事項
輸入給validwhen的是一個布爾型表達式(對該表達式的解析使用了antlr),其引用名為test,即形如:
<var>
<var-name>test</var-name>
<var-value>expression</var-name>
</var>
即,當expression為真(true)時,該域驗證通過,其中,expression可以使用的元素包括:
1)表單中其它域屬性的名稱,例如:
<var>
<var-name>test</var-name>
<var-value>(color=="red")</var-name>
</var>
例子中color為表單中其它某個域的屬性名。
2)*this*,用于表示該域的屬性名稱,即對正在驗證的屬性自身,其變量的引用為*this*,例如:
<var>
<var-name>test</var-name>
<var-value>((color=="red")
and (*this* != null))</var-name>
</var>
3)可以使用一些常規運算符,如
>、<、==、>=、<=、!=、+、-、*、/、%等等。例如:
<var>
<var-name>test</var-name>
<var-value>((color=="red")
and (age>=25))</var-name>
</var>
4)可以使用邏輯運算 and
、or,例如:
<var>
<var-name>test</var-name>
<var-value>(((color=="red")
and (age>=25)) or (color!="red"))</var-name>
</var>
在使用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,例如:
<validator name="email"
classname="org.apache.struts.validator.FieldChecks"
method="validateEmail"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.email"/>
|
其中,msg的值為resource bundle中的一個屬性名
。例如在resource
bundle文件中存在如下定義:
errors.email={0} is an invalid e-mail address.
2)本地方式,即在validation.xml中的field中定義的錯誤消息,格式為:
<msg key="value"
resource="booleanValue"/>
例如:
<field property="endDate"
depends="validwhen,date">
<msg name="validwhen" key="date.validwhen"/>
<arg0 key="start time" resource="false"/>
<arg1 key="end time" resource="false"/>
<var>
<var-name>test</var-name>
<var-value>((*this* != null) and (*this*>startDate))</var-value>
</var>
</field>
|