现在的位置: 首页 > 综合 > 正文

strut2 学习之验证框架五验证器的短路

2014年07月17日 ⁄ 综合 ⁄ 共 2085字 ⁄ 字号 评论关闭
文章目录

验证器短路


拦截器有可能被短路,下面看一个例子.请注意某些<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 将取决于验证器的类型).
在上面的例子中,正确的执行顺序应该是:

  1. Plain Validator 1
  2. Plain Validator 2
  3. Field Validators for email field
  4. 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 不是针对某个特定的属性,因此是不会被短路的.

抱歉!评论已关闭.