5.3.3 短路校验器

从 xwork-validator-1.0.3.dtd 文件中可以看到,校验规则文件的<validator .../>元素和<field-validator .../>元素可以指定一个可选的short-circuit属性,这个属性指定该校验器是否是短路校验器,该属性的默认值是false,即默认是非短路校验器。

短路校验器其实是非常有用的,读者可以看图5.6所示的页面,在“用户名”输入框的上面看到两行校验提示信息:

您必须输入用户名!
您输入的用户名只能是字母和数字,且长度必须在4到25之间!

这种提示信息是多么不友好啊,浏览者此时完全没有输入用户名,而我们的应用一下子就显示了两条提示信息(而且,第二条校验提示完全是多余的,完全没有输入用户名,当然长度不在4到25之间)。通常的做法是,如果浏览者完全没有在某个输入框中输入任何内容,系统应该仅输出第一行提示信息,而不是一次输出所有的校验提示。

为了达到这种效果,我们应该采用短路校验器,采用短路校验器只需要在<validator .../>元素或<field-validator .../>元素中增加short-circuit="true"即可。

修改上面的配置文件,对于采用字段校验器风格的校验规则文件,将用户名必填和密码必填校验规则配置成短路校验器,修改后的校验文件片段如下:

程序清单:codes\05\5.3\ short-circuit\WEB-INF\src\org\crazyit\struts2\action\RegistAction-validation.xml

<!-- 校验Action的name属性 -->
<field name="name">
    <!-- 指定name属性必须满足必填规则,将其配置成短路校验器 -->
          <field-validator type="requiredstring" short-circuit="true">
          <param name="trim">true</param>
          <!-- 如果校验失败,输出name.requried对应的国际化信息 -->
          <message>${getText("name.requried")}</message>
          </field-validator>
    <!-- 指定name属性必须匹配正则表达式 -->
          <field-validator type="regex">
                <param name="expression"><![CDATA[(\w{4,25})]]></param>
          <!-- 如果校验失败,输出name.regex对应的国际化信息 -->
          <message>${getText("name.regex")}</message>
          </field-validator>
</field>
<!-- 校验Action的pass属性 -->
<field name="pass">
    <!-- 指定pass属性必须满足必填规则,将其配置成短路校验器-->
    <field-validator type="requiredstring" short-circuit="true">
          <param name="trim">true</param>
          <!-- 如果校验失败,输出pass.requried对应的国际化信息 -->
          <message>${getText("pass.requried")}</message>
    </field-validator>
    <!-- 指定pass属性必须满足匹配指定的正则表达式 -->
    <field-validator type="regex">
          <param name="expression"><![CDATA[(\w{4,25})]]></param>
          <!-- 如果校验失败,输出pass.regex对应的国际化信息 -->
          <message>${getText("pass.regex")}</message>
    </field-validator>
</field>

在上面的配置文件中,将user和pass的必填校验器配置成短路校验器。对于同一个字段内的多个校验器,如果一个短路校验器校验失败后,其他校验器根本不会继续校验。

将校验规则文件修改成上面文件所示的样式后,如果依然不输入用户名和密码,直接提交该请求,将看到如图5.7所示的页面。

图5.7 短路校验器的效果

从上面的校验效果可以看出:该表单内所有的表单控件都没有输入——也就是所有表单校验都不能通过,但Struts 2只显示了“用户名”校验没通过的错误提示,这就是因为该短路校验器阻止了其他校验器。