文章目录
验证器短路
拦截器有可能被短路,下面看一个例子.请注意某些<field-validator> 和 <validator> 添加了short-circuit
属性.
属性.
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> <validators> <!-- Field Validators for email field --> <field name="email"> <field-validator type="required" short-circuit="true"> <message>You must enter a value for email.</message> </field-validator> <field-validator type="email" short-circuit="true"> <message>Not a valid e-mail.</message> </field-validator> </field> <!-- Field Validators for email2 field --> <field name="email2"> <field-validator type="required"> <message>You must enter a value for email2.</message> </field-validator> <field-validator type="email"> <message>Not a valid e-mail2.</message> </field-validator> </field> <!-- Plain Validator 1 --> <validator type="expression"> <param name="expression">email.equals(email2)</param> <message>Email not the same as email2</message> </validator> <!-- Plain Validator 2 --> <validator type="expression" short-circuit="true"> <param name="expression">email.startsWith('mark')</param> <message>Email does not start with mark</message> </validator> </validators>
平滑的验证器优先级要比属性验证器高,这个验证器将按定义顺序先执行,然后再按顺序执行属性验证器.个别有short-circuit
标记的验证器如果验证失败,将会阻止接下来的验证器执行,并且将在被验证的对象上的ValidationContext添加相应的错误信息(至于是action error 还是field error 将取决于验证器的类型).
标记的验证器如果验证失败,将会阻止接下来的验证器执行,并且将在被验证的对象上的ValidationContext添加相应的错误信息(至于是action error 还是field error 将取决于验证器的类型).
在上面的例子中,正确的执行顺序应该是:
- Plain Validator 1
- Plain Validator 2
- Field Validators for email field
- Field Validators for email2 field
由于Plain Validator 2 被设置成短路的,那么,如果它验证失败,则会导致email 和email2 的验证器都不会执行.
注意:
更复杂的验证应该放在action 的validate() 方法中来进行,并且 action 需要实现Validatable 接口,ActionSupport 已经继承了,我们只需要继承ActionSupport
类就行了.
一个平滑的验证器如果被短路了,将会完全从validation stack中 结束.没有其他的验证器被执行和平滑的验证器比属性验证器的优先级高,意思是他们比属性验证器更有机会来被执行.
一个属性验证器被设置成短路,将只会阻止在相同属性上定义的其他验证器.注意:相同的属性将不管是不是 "或" 语法定义的验证器.
看下面的例子:
<validator type="required" short-circuit="true"> <param name="fieldName">bar</param> <message>You must enter a value for bar.</message> </validator> <validator type="expression"> <param name="expression">foo gt bar</param> <message>foo must be great than bar.</message> </validator>
尽管"required" 验证器被短路,两个属性验证器都将被执行."required" 是属性验证器并且不会短路ExpressionValidator 表达式验证器,因为,属性验证器只会短路相同属性上的其他验证器.由于plain
Validator 不是针对某个特定的属性,因此是不会被短路的.