5.3.2 非字段校验器配置风格

对于非字段校验器配置风格而言,是一种以校验器优先的配置方式。在这种配置方式下,校验规则文件的根元素下包含了多个<validator .../>元素,每个<validator .../>元素定义了一个校验规则。

对于采用非字段校验器配置风格的校验规则文件,<validators .../>元素下有多个<validator .../>元素,每个<validators .../>元素都有如下格式。

<validator type="校验器名">
    <param name="fieldName">需要被校验的字段</param>
    <!-- 此处需要为不同校验器指定数量的校验参数 -->
    <param name="参数名">参数值</param>
    ...
    <!-- 校验失败后的提示信息,其中key指定国际化信息的key -->
    <message key="I18Nkey">校验失败后的提示信息</message>
</validator >

每个<validator .../>元素定义一个校验规则,该元素指定一个type属性,该type属性指定了该校验器的名字。

因为使用非字段校验器配置风格时,采用的是校验器优先的方式,故必须为<validator .../>配置一个fieldName参数,该参数的值就是被校验的Action属性名。除此之外,还需要指定数量不等的<param .../>元素,用于指定校验器所需的参数。

下面采用非字段校验器风格改写前面的校验规则文件。

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

<?xml version="1.0" encoding="GBK"?>
<!-- 指定Struts 2的数据校验规则文件的DTD信息 -->
<!DOCTYPE validators PUBLIC
    "-//OpenSymphony Group//XWork Validator 1.0.3//EN"
    "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<!-- Struts 2校验文件的根元素 -->
<validators>
    <!-- 配置必填字符串的校验器 -->
    <validator type="requiredstring">
          <!-- 使用该校验器校验name属性 -->
          <param name="fieldName">name</param>
          <param name="trim">true</param>
          <!-- 指定校验失败后输出name.required对应的国际化信息 -->
          <message>${getText("name.requried")}</message>
    </validator>
    <!-- 配置正则表达式的校验器 -->
    <validator type="regex">
          <!-- 使用该校验器校验name属性 -->
          <param name="fieldName">name</param>
          <param name="trim">true</param>
          <param name="expression"><![CDATA[(\w{4,25})]]></param>
          <!-- 指定校验失败后输出name.regex对应的国际化信息 -->
          <message>${getText("name.regex")}</message>
    </validator>
    <!-- 配置必填字符串的校验器 -->
    <validator type="requiredstring">
          <!-- 使用该校验器校验pass属性 -->
          <param name="fieldName">pass</param>
          <param name="trim">true</param>
          <!-- 指定校验失败后输出pass.required对应的国际化信息 -->
          <message>${getText("pass.requried")}</message>
    </validator>
    <!-- 配置正则表达式的校验器 -->
    <validator type="regex">
          <!-- 使用该校验器校验pass属性 -->
          <param name="fieldName">pass</param>
          <param name="trim">true</param>
          <param name="expression"><![CDATA[(\w{4,25})]]></param>
          <!-- 指定校验失败后输出pass.regex对应的国际化信息 -->
          <message>${getText("pass.regex")}</message>
    </validator>
    <!-- 配置整数校验器 -->
    <validator type="int">
          <!-- 使用该校验器校验age属性 -->
          <param name="fieldName">age</param>
          <!-- 指定整数校验器的范围-->
          <param name="min">1</param>
          <param name="max">150</param>
          <!-- 指定校验失败后输出age.range对应的国际化信息 -->
          <message>${getText("age.range")}</message>
    </validator>
    <!-- 配置日期校验器 -->
    <validator type="date">
          <!-- 使用该校验器校验birth属性 -->
          <param name="fieldName">birth</param>
          <!-- 指定日期校验器的范围-->
          <param name="min">1900-01-01</param>
          <param name="max">2050-02-21</param>
          <!-- 指定校验失败后输出birth.range对应的国际化信息 -->
          <message>${getText("birth.range")}</message>
    </validator>
</validators>

相比之下,在一个<field .../>元素内定义字段校验器,比使用带有一个 fieldName 参数的<validator .../>元素好得多,而且XML代码本身也清晰得多(字段分组更清晰了)。因此,笔者更倾向于使用字段校验器风格。