零基础学Struts
上QQ阅读APP看书,第一时间看更新

5.3 内建校验器

Struts 2提供了非常多的默认校验器。在开发中使用内建的校验器能满足大部分的校验需求。Struts 2提供的校验器包括必填校验器、必填字符串校验器、整数校验器、日期校验器和字段表达式校验器等。

5.3.1 Struts 2默认校验器

Struts 2提供了非常多的默认校验器。在开发中使用内建的校验器能满足大部分的校验需求。对于这些内建的校验器来说,只需知道校验器名称以及参数就能实现对应的校验功能,底层的校验细节则可以不用了解。下面来看Struts 2到底提供了哪些内建的校验器。

首先找到导入的库文件“xwork-2.0.4.jar”。依次展开其中的com目录、opensymphony目录、xwork2目录、validator目录和validators目录,如图5.3所示。

图5.3 “xwork-2.0.4.jar”文件目录

在validators目录下可以看到一个“default.xml”文件,该文件为Struts 2默认校验器注册文件,在该文件中注册了Struts 2中所有的内建校验器,打开该文件可以看到如下代码。

        <validators>
            <! -- 必填校验器 -->
        <validator name="required"
                    class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
        <! -- 必填字符串校验器 -->
        <validator name="requiredstring"
                    class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
        <! --整数校验器 -->
        <validator name="int"
        class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
        <! --双精度小数校验器 -->
        <validator name="double"
                    class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
        <! --日期校验器 -->
        <validator name="date"
                    class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
        <! --表达式校验器 -->
        <validator name="expression"
                    class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
        <! --字段表达式校验器 -->
        <validator name="fieldexpression"
                    class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
        <! --邮箱地址校验器 -->
        <validator name="email"
                    class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
        <! --网址校验器 -->
        <validator name="url"
                    class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
        <! -- Vistor校验器 -->
        <validator name="visitor"
                    class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
        <! --转换校验器 -->
        <validator name="conversion"
                    class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
        <! --字符串长度校验器 -->
        <validator name="stringlength"
                    class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
        <! --正则表达式校验器 -->
        <validator name="regex"
                    class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
        </validators>

注意

可以到“http://repo1.maven.org/maven2/com/opensymphony/xwork/2.0.4”站点下载xwork-2.0.4的源代码,方便学习时参考使用。

5.3.2 必填校验器

从“default. xml”注册文件中可以知道必填校验器的名称为required。对应的处理类为com.opensymphony. xwork2. validator.validators.RequiredFieldValidator,其中RequiredFieldValidator类源代码如下。

        * <! -- START SNIPPET: parameters -->
          * <ul>
          *           <li>fieldName - field name if plain-validator syntax is used, not needed
        if field-validator syntax is used</li>
          * </ul>
          * <! -- END SNIPPET: parameters -->
        ...
        public class RequiredFieldValidator extends FieldValidatorSupport {
            public void validate(Object object) throws ValidationException {
                  String fieldName = getFieldName();
                  Object value = this.getFieldValue(fieldName, object);
                  if (value == null) {
                      addFieldError(fieldName, object);
                  }
            }
        }

必填校验器要求指定的字段必须非空。必填校验器接受一个fieldName参数,该参数用来指定被校验的Action属性名。如果使用字段校验器风格,则无需指定该参数;如果为非字段校验器风格,则必须指定该参数。同时从RequiredFieldValidator类代码中可以看出,只有当Action属性值为null时才会校验错误,并添加校验错误信息。

下面分别使用字段校验器配置风格以及非字段校验器风格来配置校验规则文件,用来校验用户注册页面中的用户名是否输入。

❑ 使用字段校验器配置风格。

        <validators>
              <! -- 使用字段校验器风格来配置,指定校验username属性 -->
              <field name="username">
                      <! -- 指定使用哪个校验器 -->
                      <field-validator type="required">
                            <! -- 指定校验失败提示信息 -->
                            <message>请输入用户名</message>
                    </field-validator>
              </field>
        </validators>

❑ 使用非字段校验器风格。

        <validators>
              <! -- 使用非字段校验器风格来配置,指定使用哪个校验器 -->
              <validator type="required">
                    <! -- 指定需要校验的字段名 -->
                    <param name="fieldName">username</param>
                    <! -- 指定校验失败提示信息 -->
                    <message>请输入用户名</message>
              </validator>
        </validators>

如果直接打开注册提交页“http://localhost: 8080/ValidationDemo01/register.action”,那么用户提交的用户名信息肯定为空,因此对应Action中的username属性值为null。校验文件校验失败,添加相应的校验错误信息并返回注册页。在注册页中将提示错误信息,提醒用户输入用户名,如图5.4所示。

图5.4 注册页面

5.3.3 必填字符串校验器

同样从“default.xml”注册文件中可以知道必填字符串校验器的名称为requiredstring。对应的处理类为com.opensymphony.xwork2. validator. validators. RequiredStringValidator,其中RequiredString Validator类源代码如下。

        * <! -- START SNIPPET: parameters -->
          * <ul>
          *           <li>fieldName - The field name this validator is validating. Required if using
          Plain-Validator Syntax otherwise not required</li>
          *        <li>trim - trim the field name value before validating (default is true)</li>
          * </ul>
          * <! -- END SNIPPET: parameters -->
        ...
        public class RequiredStringValidator extends FieldValidatorSupport {
            private boolean doTrim = true;
            public void setTrim(boolean trim) {
                  doTrim = trim;
            }
            public boolean getTrim() {
                  return doTrim;
            }
            public void validate(Object object) throws ValidationException {
                  String fieldName = getFieldName();
                  Object value = this.getFieldValue(fieldName, object);
                  if (! (value instanceof String)) {
                      addFieldError(fieldName, object);
                  } else {
                      String s = (String) value;
                      if (doTrim) {
                          s = s.trim();
                      }
                      if (s.length() == 0) {
                          addFieldError(fieldName, object);
                      }
                  }
              }
        }

必填字符串校验器要求被校验的字段非空且长度大于0。同样必填字符串校验器接受两个参数,分别为fieldName和trim。fieldName参数用来指定被校验的Action属性名。如果使用字段校验器风格,则无需指定该参数;如果为非字段校验器风格,则必须指定该参数。同时从RequiredStringValidator类代码中可以看出,trim参数用来指定是否截断被校验属性值前后的空白,该参数是可选的,默认值为true。只有当Action属性值字符串长度为0时才会校验错误,并添加校验错误信息。

下面分别使用字段校验器配置风格以及非字段校验器风格来配置校验规则文件。用来校验用户注册页面中的用户名是否输入为空或输入全部为空格。

❑ 使用字段校验器风格。

        <validators>
              <! -- 使用字段校验器风格来配置,指定校验username属性 -->
              <field name="username">
                      <! -- 指定使用哪个校验器 -->
                      <field-validator type="requiredstring">
                              <! -- 指定是否截断被校验属性中前后空白 -->
                              <param name="trim">true</param>
                              <! -- 指定校验失败提示信息 -->
                              <message>用户名不能为空</message>
                    </field-validator>
            </field>
        </validators>

❑ 使用非字段校验器风格。

        <validators>
              <! -- 使用非字段校验器风格来配置,指定使用哪个校验器 -->
              <validator type="requiredstring">
                      <! -- 指定需要校验的字段名 -->
                      <param name="fieldName">username</param>
                      <! -- 指定是否截断被校验属性中前后空白 -->
                      <param name="trim">true</param>
                      <! -- 指定校验失败提示信息 -->
                      <message>用户名不能为空</message>
              </validator>
        </validators>

打开用户注册页,不输入用户名或者在“用户名”文本框中输入空格,单击“注册”按钮进行注册。这时用户提交的用户名信息肯定为空或者全部为空格,校验文件校验失败,添加相应的校验错误信息并返回注册页。在注册页中将提示错误信息,提醒用户用户名不能为空,如图5.5所示。

图5.5 注册页面

5.3.4 整数校验器

同样从“default.xml”注册文件中可以知道整数校验器的名称为int。对应的处理类为com. opensymphony.xwork2. validator.validators.IntRangeFieldValidator,其中IntRangeFieldValidator类源代码如下。

        * <! -- START SNIPPET: parameters -->
          * <ul>
          *           <li>fieldName - The field name this validator is validating. Required if using
        Plain-Validator Syntax otherwise not required</li>
          *           <li>min - the minimum value (if none is specified, it will not be checked) </li>
          *           <li>max - the maximum value (if none is specified, it will not be checked) </li>
          * </ul>
          * <! -- END SNIPPET: parameters -->
        ...
        public class IntRangeFieldValidator extends AbstractRangeValidator {
            Integer max = null;
            Integer min = null;
            public void setMax(Integer max) {
                  this.max = max;
            }
            public Integer getMax() {
                  return max;
            }
            public Comparable getMaxComparatorValue() {
                  return max;
            }
            public void setMin(Integer min) {
                  this.min = min;
            }
            public Integer getMin() {
                  return min;
            }
            public Comparable getMinComparatorValue() {
                  return min;
              }
        }

整数校验器要求字段的整数值必须在指定范围中。同样整数校验器接受3个参数,分别为fieldName、min和max。fieldName参数用来指定被校验的Action属性名。如果使用字段校验器风格,则无需指定该参数;如果为非字段校验器风格,则必须指定该参数。min参数用来指定该属性的最小值,该参数为可选参数。max参数用来指定该属性的最大值,该参数同样为可选参数。

下面分别使用字段校验器配置风格以及非字段校验器风格来配置校验规则文件。用来校验用户注册页面中用户年龄是否合法。

❑ 使用字段校验器风格。

        <validators>
              <! -- 使用字段校验器风格来配置,指定校验age属性 -->
              <field name="age">
                      <! -- 指定使用哪个校验器 -->
                      <field-validator type="int">
                            <! -- 指定age属性最小值 -->
                            <param name="min">1</param>
                            <! -- 指定age属性最大值 -->
                            <param name="max">120</param>
                            <! -- 指定校验失败提示信息 -->
                            <message>年龄必须在${min}${max}之间</message>
                      </field-validator>
            </field>
        </validators>

❑ 使用非字段校验器风格。

        <validators>
              <! -- 使用非字段校验器风格来配置,指定使用哪个校验器 -->
              <validator type="int">
                      <! -- 指定需要校验的字段名 -->
                      <param name="fieldName">age</param>
                      <! -- 指定age属性最小值 -->
                      <param name="min">1</param>
                      <! -- 指定age属性最大值 -->
                      <param name="max">120</param>
                      <! -- 指定校验失败提示信息 -->
                      <message>年龄必须在${min}${max}之间</message>
            </validator>
        </validators>

打开用户注册页,输入非法年龄,单击“注册”按钮。校验文件校验失败,添加相应的校验错误信息并返回注册页。页面将提示错误信息,提醒用户年龄必须在指定范围中,如图5.6所示。

图5.6 注册页面

5.3.5 双精度浮点数校验器

同样从“default.xml”注册文件中可以知道双精度浮点数校验器的名称为double。对应的处理类为com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidato,其中DoubleRange-FieldValidator类源代码如下。

        * <! -- START SNIPPET: parameters -->
          * <ul>
         *                   <li>fieldName - The field name this validator is validating. Required if using
        Plain-Validator Syntax otherwise not required</li>
          *                    <li>minInclusive - the minimum inclusive value in FloatValue format
          specified by Java language (if none is specified, it will not be checked) </li>
          *                   <li>maxInclusive - the maximum inclusive value in FloatValue format
          specified by Java language (if none is specified, it will not be checked) </li>
          *                   <li>minExclusive - the minimum exclusive value in FloatValue format
        specified by Java language (if none is specified, it will not be checked) </li>
          *                   <li>maxExclusive - the maximum exclusive value in FloatValue format
        specified by Java language (if none is specified, it will not be checked) </li>
          * </ul>
          * <! -- END SNIPPET: parameters -->
        ...
                if ((maxInclusiveValue ! = null && value.compareTo(maxInclusiveValue) > 0) ——
                        (minInclusiveValue ! = null && value.compareTo(minInclusiveValue) < 0) ——
                        (maxExclusiveValue ! = null && value.compareTo(maxExclusiveValue) >= 0) ——
                        (minExclusiveValue ! = null && value.compareTo(minExclusiveValue) <= 0)) {
                    addFieldError(fieldName, object);
                  }

双精度浮点数校验器要求字段的浮点数值必须在指定范围中。同样双精度浮点数校验器接受5个参数,分别为fieldName、minInclusive、maxInclusive、minExclusive以及maxExclusive。fieldName参数用来指定被校验的Action属性名。如果使用字段校验器风格,则无需指定该参数;如果为非字段校验器风格,则必须指定该参数。minInclusive参数用来指定该属性的最小值,该参数为可选参数。maxInclusive参数用来指定该属性的最大值,该参数同样为可选参数。minExclusive同minInclusive类似,但不包括minExclusive设定值,也就是说如果对应属性值等于该minExclusive设定值时,也会认为是校验错误。MaxExclusive和minExclusive类似,不包括maxExclusive设定值。

下面分别使用字段校验器配置风格以及非字段校验器风格来配置校验规则文件,用来校验用户注册页面中用户收入是否合法。首先通过设定minExclusive和maxExclusive参数来设定属性取值范围。

❑ 使用字段校验器风格。

        <validators>
              <! -- 使用字段校验器风格来配置,指定校验age属性 -->
              <field name="income">
                      <field-validator type="double">
                              <! -- 配置income属性最小值 -->
                              <param name="minExclusive">0.01</param>
                              <! -- 配置income属性最大值 -->
                              <param name="maxExclusive">1000.00</param>
                              <! -- 指定校验失败提示信息 -->
                              <message>
                                  年收入必须在${minExclusive}
                                  ${maxExclusive}之间,不包括两端值
                              </message>
                      </field-validator>
            </field>
        </validators>

❑ 使用非字段校验器风格。

        <validators>
              <! -- 使用非字段校验器风格来配置,指定使用哪个校验器 -->
              <validator type="double">
                    <! -- 指定需要校验的字段名 -->
                    <param name="fieldName">income</param>
                    <! -- 指定income属性最小值 -->
                    <param name="minExclusive">0.01</param>
                    <! -- 指定income属性最大值 -->
                    <param name="maxExclusive">1000.00</param>
                    <! -- 指定校验失败提示信息 -->
                    <message>
                            年收入必须在${minExclusive} ${maxExclusive}之间,不包括两端值
                    </message>
            </validator>
        </validators>

打开用户注册页,输入年收入信息为“0.01”,单击“注册”按钮。因为校验规则文件中minExclusive和maxExclusive参数来设定属性取值范围,所以不包括两端值。校验文件校验失败,添加相应的校验错误信息并返回注册页。页面将提示错误信息,提醒年收入必须在指定范围中,如图5.7所示。

如果通过设定minInclusive和maxInclusive参数来设定属性取值范围,取值范围将包括两端值。

图5.7 注册页面

❑ 使用字段校验器风格。

    <validators>
          <! -- 使用字段校验器风格来配置,指定校验age属性 -->
          <field name="income">
                  <field-validator type="double">
                        <! -- 配置income属性最小值 -->
                        <param name="minInclusive">0.01</param>
                        <! -- 配置income属性最大值 -->
                        <param name="maxInclusive">1000.00</param>
                        <! -- 指定校验失败提示信息 -->
                        <message>
                              年收入必须在${minExclusive}
                              ${maxExclusive}之间,包括两端值
                        </message>
                  </field-validator>
          </field>
    </validators>

❑ 使用非字段校验器风格。

    <validators>
          <! -- 使用非字段校验器风格来配置,指定使用哪个校验器 -->
          <validator type="double">
                <! -- 指定需要校验的字段名 -->
                <param name="fieldName">income</param>
                <! -- 指定income属性最小值 -->
                <param name="minInclusive">0.01</param>
                <! -- 指定income属性最大值 -->
                <param name="maxInclusive">1000.00</param>
                <! -- 指定校验失败提示信息 -->
                <message>
                        年收入必须在${minExclusive} ${maxExclusive}之间,包括两端值
                </message>
          </validator>
    </validators>

这时再输入年收入为“0.01”,单击“注册”按钮进行注册,校验文件校验成功,页面跳转到用户信息显示页,如图5.8所示。

图5.8 用户的信息页面

5.3.6 日期校验器

同样从“default.xml”注册文件中可以知道日期校验器的名称为date。对 应 的 处 理 类 为com.opensymphony.xwork2. validator. validators.DateRangeFieldValidator,其中DateRangeFieldValidator类源代码如下。

        * <! -- START SNIPPET: parameters -->
          * <ul>
          *           <li>fieldName - The field name this validator is validating. Required if
          using Plain-Validator Syntax otherwise not required</li>
          *        <li>min - the min date range. If not specified will not be checked.</li>
          *        <li>max - the max date range. If not specified will not be checked.</li>
          * </ul>
          * <! -- END SNIPPET: parameters -->
        ...
        public class DateRangeFieldValidator extends AbstractRangeValidator {
            private Date max;
            private Date min;
        ...
        }

日期校验器要求字段的日期值必须在指定范围中。同样日期校验器接受3个参数,分别为fieldName、min和max。fieldName参数用来指定被校验的Action属性名。如果使用字段校验器风格,则无需指定该参数;如果为非字段校验器风格,则必须指定该参数。min参数用来指定该属性的最小值,该参数为可选参数。max参数用来指定该属性的最大值,该参数同样为可选参数。

下面分别使用字段校验器配置风格以及非字段校验器风格来配置校验规则文件,用来校验用户注册页面中用户出生日期是否合法。

❑ 使用字段校验器风格。

        <validators>
              <! -- 使用字段校验器风格来配置,指定校验birth属性 -->
              <field name="birth">
                      <field-validator type="date">
                            <! -- 配置birth属性最小值 -->
                            <param name="min">1900-01-01</param>
                            <! -- 配置birth属性最小值 -->
                            <param name="max">2010-01-01</param>
                            <! --指定校验失败提示信息-->
                            <message>出生日期必须在${min}${max}之间</message>
                      </field-validator>
              </field>
        </validators>
        <validators>

❑ 使用非字段校验器风格。

              <! -- 使用非字段校验器风格来配置,指定使用哪个校验器 -->
              <validator type="date">
                    <! -- 指定需要校验的字段名 -->
                    <param name="fieldName">birth</param>
                    <! -- 配置birth属性最小值 -->
                    <param name="min">1900-01-01</param>
                    <! -- 配置birth属性最小值 -->
                    <param name="max">2010-01-01</param>
                    <! --指定校验失败提示信息-->
                    <message>出生日期必须在${min}${max}之间</message>
              </validator>
        </validators>

打开用户注册页,输入用户出生日期为“1000-02-03”,单击“注册”按钮。因为用户输入的日期不再设定范围内,所以校验文件校验失败,添加相应的校验错误信息并返回注册页。页面将提示错误信息,提醒出生日期必须在指定范围中,如图5.9所示。

图5.9 注册页面

5.3.7 字段表达式校验器

同样从“default.xml”注册文件中可以知道字段校验器的名称为fieldexpression。对应的处理类为com. opensymphony. xwork2. validator. validators. Field ExpressionValidatorr,其中FieldExpression Validatorr类源代码如下。

        * <! -- START SNIPPET: parameters -->
          * <ul>
         *     <li>fieldName - The field name this validator is validating. Required if using Plain-
        Validator Syntax otherwise not required</li>
         *     <li>expression - The Ognl expression (must evaluate to a boolean) which is to be
         evalidated the stack</li>
          * </ul>
          * <! -- END SNIPPET: parameters -->
        ...
        public class FieldExpressionValidator extends FieldValidatorSupport {
            private String expression;
            public void setExpression(String expression) {
                  this.expression = expression;
        }
        ...

字段表达式校验器要求字段满足一个逻辑表达式。字段表达式校验器接受两个参数,分别为fieldName和expression。fieldName参数用来指定被校验的Action属性名。如果使用字段校验器风格,则无需指定该参数;如果为非字段校验器风格,则必须指定该参数。expression参数指定一逻辑表达式,如果返回为true则表示校验通过,否则校验失败。

下面分别使用字段校验器配置风格以及非字段校验器风格来配置校验规则文件,用来校验用户注册页面中用户输入的密码和确认密码是否相同。

❑ 使用字段校验器风格。

        <validators>
              <! -- 使用字段校验器风格来配置,指定校验password属性 -->
              <field name="password">
                      <field-validator type="fieldexpression">
                            <! --指定逻辑表达式 -->
                            <param name="expression"><! [CDATA[(password==repassword)]]></param>
                            <! --指定校验失败提示信息-->
                            <message>密码和确认密码必须一致</message>
                      </field-validator>
              </field>
        </validators>

注意

在XML文档中的所有文本都会被解析器解析。只有在CDATA部件之内的文本会被解析器忽略。如果文本包含了很多的“<”字符和“&”字符—就像程序代码一样,那么最好把它们都放到CDATA部件中。一个CDATA部件以“<! [CDATA[”标记开始,以“]]>”标记结束。

❑ 使用非字段校验器风格。

        <validators>
              <! -- 使用非字段校验器风格来配置,指定使用哪个校验器 -->
              <validator type="fieldexpression">
                    <! -- 指定需要校验的字段名 -->
                    <param name="fieldName">password</param>
                    <! --指定逻辑表达式 -->
                    <param name="expression"><! [CDATA[(password==repassword)]]></param>
                    <! --指定校验失败提示信息-->
                    <message>密码和确认密码必须一致</message>
              </validator>
        </validators>

打开用户注册页,输入不同的密码和确认密码,单击“注册”按钮。因为用户输入的两次密码不同,所以表达式返回false,校验文件校验失败,添加相应的校验错误信息并返回注册页。页面将提示错误信息,提醒用户密码和确认密码必须一致,如图5.10所示。

图5.10 注册页面

5.3.8 邮箱地址校验器

从“default.xml”注册文件中可以知道日期校验器的名称为email。对应的处理类为com.opensymphony. xwork2. validator. validators. EmailValidator,其中EmailValidator类源代码如下。

        * <! -- START SNIPPET: parameters -->
          * <ul>
                      *           <li>fieldName - The field name this validator is validating. Required if using
                      Plain-Validator Syntax otherwise not required</li>
                      * </ul>
                      * <! -- END SNIPPET: parameters -->
                    ...
                    public class EmailValidator extends RegexFieldValidator {
                        // see XW-371
                          public static final String emailAddressPattern =
                                "\\b(^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-])+(\\.[A-Za-z0-9-
                    ]+)*((\\.[A-Za-z0-9]{2, })—(\\.[A-Za-z0-9]{2, }\\.[A-Za-z0-9]{2, }))$)\\b";
                          public EmailValidator() {
                              setExpression(emailAddressPattern);
                              setCaseSensitive(false);
                          }
                    }

邮箱地址校验器要求字段必须是合法的邮件地址。同样邮箱地址校验器接受一个参数为fieldName。fieldName参数用来指定被校验的Action属性名。如果使用字段校验器风格,则无需指定该参数;如果为非字段校验器风格,则必须指定该参数。

下面分别使用字段校验器配置风格以及非字段校验器风格来配置校验规则文件,用来校验用户注册页面中用户输入的邮箱地址是否合法。

❑ 使用字段校验器风格。

        <validators>
              <! -- 使用字段校验器风格来配置,指定校验email属性 -->
              <field name="email">
                    <field-validator type="email">
                            <! --指定校验失败提示信息-->
                            <message>请输入有效的电子邮箱地址</message>
                    </field-validator>
              </field>
        </validators>

❑ 使用非字段校验器风格。

        <validators>
              <! -- 使用非字段校验器风格来配置,指定使用哪个校验器 -->
              <validator type="email">
                    <! -- 指定需要校验的字段名 -->
                    <param name="fieldName">email</param>
                    <! --指定校验失败提示信息-->
                    <message>请输入有效的电子邮箱地址</message>
              </validator>
        </validators>

打开用户注册页,输入一个非法的邮箱地址信息,单击“注册”按钮。因为输入邮箱地址不合法,所以校验文件校验失败,添加相应的校验错误信息并返回注册页。页面将提示错误信息,提醒输入有效的电子邮箱地址,如图5.11所示。

图5.11 注册页面

5.3.9 网址校验器

从“default.xml”注册文件中可以知道网址校验器的名称为url。对应的处理类为com. opensymphony. xwork2.validator.validators.URLValidator。其中URLValidator类源代码如下。

        * <! -- START SNIPPET: parameters -->
          *
          * <ul>
          *           <li>fieldName - The field name this validator is validating. Required if
          using Plain-Validator Syntax otherwise not required</li>
          * </ul>
          *
          * <! -- END SNIPPET: parameters -->
        ...
        public class URLValidator extends FieldValidatorSupport {
            public void validate(Object object) throws ValidationException {
                  String fieldName = getFieldName();
                  Object value = this.getFieldValue(fieldName, object);
                  // if there is no value - don' t do comparison
                  // if a value is required, a required validator should be added to the field
                  if (value == null —— value.toString().length() == 0) {
                      return;
                  }
                if (! (value.getClass().equals(String.class)) —— ! TextUtils.verifyUrl((String) value)) {
                      addFieldError(fieldName, object);
                  }
            }
        }

网址校验器要求字段必须是合法的URL地址。同样,fieldName参数用来指定被校验的Action属性名。如果使用字段校验器风格,则无需指定该参数;如果为非字段校验器风格,则必须指定该参数。

下面分别使用字段校验器配置风格以及非字段校验器风格来配置校验规则文件,用来校验用户注册页面中用户输入的个人主页地址是否合法。

❑ 使用字段校验器风格。

        <validators>
              <! -- 使用字段校验器风格来配置,指定校验myUrl属性 -->
              <field name="myUrl">
                    <field-validator type="url">
                          <! --指定校验失败提示信息-->
                          <message>请输入有效的个人主页地址</message>
                    </field-validator>
              </field>
        </validators>

❑ 使用非字段校验器风格。

        <validators>
              <! -- 使用非字段校验器风格来配置,指定使用哪个校验器 -->
              <validator type="url">
                    <! -- 指定需要校验的字段名 -->
                    <param name="fieldName">myUrl</param>
                    <! --指定校验失败提示信息 -->
                    <message>请输入有效的个人主页地址</message>
              </validator>
        </validators>

打开用户注册页,输入一个非法的个人主页地址信息,单击“注册”按钮。因为输入个人首页地址不合法,所以校验文件校验失败,添加相应的校验错误信息并返回注册页。页面将提示错误信息,提醒输入有效的个人主页地址,如图5.12所示。

图5.12 注册页面

5.3.10 转换校验器

从“default. xml”注册文件中可以知道转换校验器的名称为conversion。对应的处理类为com.opensymphony. xwork2. validator. validators.ConversionErrorFieldValidator,其中Conversion ErrorField Validator类源代码如下。

        * <! -- START SNIPPET: parameters -->
          * <ul>
          *       <li>fieldName - The field name this validator is validating. Required if
          using Plain-Validator Syntax otherwise not required</li>
          * </ul>
          * <! -- END SNIPPET: parameters -->
        ...
        public class ConversionErrorFieldValidator extends RepopulateConversion ErrorField ValidatorSupport {
            public void doValidate(Object object) throws ValidationException {
                  String fieldName = getFieldName();
                  String fullFieldName = getValidatorContext().getFullFieldName(fieldName);
                  ActionContext context = ActionContext.getContext();
                  Map conversionErrors = context.getConversionErrors();
                  if (conversionErrors.containsKey(fullFieldName)) {
                        if ((defaultMessage == null) —— (defaultMessage.trim().equals(""))) {
                            defaultMessage = XWorkConverter.getConversionErrorMessage(fullFieldName,
          context.getValueStack());
                       }
                        addFieldError(fieldName, object);
                    }
              }
          }

转换校验器用来检查指定字段在类型转换过程中是否出现转换错误。转换校验器接受两个参数,分别为fieldName和repopulateField。fieldName参数用来指定被校验的Action属性名。如果使用字段校验器风格,则无需指定该参数;如果为非字段校验器风格,则必须指定该参数。repopulateField参数用来指定类型转换失败后跳转回输入页面,在输入页面表单中是否保留原来的错误输入。

下面分别使用字段校验器配置风格以及非字段校验器风格来配置校验规则文件。用来校验用户输入的年龄信息,如果类型转换失败。页面将跳转回输入页面,并在输入页面表单中保留原来的错误输入。

❑ 使用字段校验器风格。

<validators>

              <! -- 使用字段校验器风格来配置,指定校验age属性 -->
              <field name="age">
                      <field-validator type="conversion">
                            <! --指定类型转换失败,跳转回输入页面,在输入页面表单中保留原来的错误输入 -->
                            <param name="repopulateField">true</param>
                            <! --指定校验失败提示信息 -->
                            <message>年龄必须为整数</message>
                      </field-validator>
              </field>
        </validators>

❑ 使用非字段校验器风格。

        <validators>
              <! -- 使用非字段校验器风格来配置,指定使用哪个校验器 -->
              <validator type="conversion">
                    <! -- 指定需要校验的字段名 -->
                    <param name="fieldName">age</param>
                    <! --指定类型转换失败,跳转回输入页面,在输入页面表单中保留原来的错误输入 -->
                    <param name="repopulateField">true</param>
                    <! --指定校验失败提示信息 -->
                    <message>年龄必须为整数</message>
              </validator>
        </validators>

打开用户注册页,输入一个非法的年龄信息,如“ome”,单击“注册”按钮。因为输入的年龄信息无法完成类型转换,类型转换失败将添加类型转换错误提示信息。同时转换校验器校验失败将添加相应的校验错误信息并返回注册页。页面将提示错误信息,提醒用户输入年龄必须为整数,如图5.13所示。

图5.13 注册页面

5.3.11 字符串长度校验器

从“default.xml”注册文件中可以知道字符串长度校验器的名称为stringlength。对应的处理类为com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator,其中StringLength-FieldValidator类源代码如下。

        * <! -- START SNIPPET: parameters -->
          * <ul>
          *    <li>fieldName - The field name this validator is validating. Required if using
          Plain-Validator Syntax otherwise not required</li>
          *     <li>maxLength - The max length of the field value. Default ignore.</li>
          *     <li>minLength - The min length of the field value. Default ignore.</li>
          *     <li>trim - Trim the field value before evaluating its min/max length. Default true</li>
          * </ul>
          * <! -- END SNIPPET: parameters -->
        ...
        public class StringLengthFieldValidator extends FieldValidatorSupport {
            private boolean doTrim = true;
            private int maxLength = -1;
            private int minLength = -1;
        ...
            public void validate(Object object) throws ValidationException {
                  String fieldName = getFieldName();
                  String val = (String) getFieldValue(fieldName, object);
                  if (val == null —— val.length() <= 0) {
                      // use a required validator for these
                      return;
                  }
                  if (doTrim) {
                      val = val.trim();
                      if (val.length() <= 0) {
                            // use a required validator
                            return;
                      }
                  }
                  if ((minLength > -1) && (val.length() < minLength)) {
                      addFieldError(fieldName, object);
                  } else if ((maxLength > -1) && (val.length() > maxLength)) {
                      addFieldError(fieldName, object);
                  }
              }
        }

字符串长度校验器用来校验指定的字段值长度是否在指定的长度范围中。同样,字符串长度校验器接受4个参数,分别为fieldName、maxLength、minLength和trim。fieldName参数用来指定被校验的Action属性名。如果使用字段校验器风格,则无需指定该参数;如果为非字段校验器风格,则必须指定该参数。maxLength用来指定该字段值最大长度,如果不指定该参数,默认最大长度不受限制。minLength用来指定该字段值最小长度,如果不指定该参数,默认最小长度不受限制。trim参数用来指定是否截断被校验属性值前后的空白,该参数是可选的,默认值为true。

下面分别使用字段校验器配置风格以及非字段校验器风格来配置校验规则文件,用来校验用户输入的用户名长度是否合法。

❑ 使用字段校验器风格。

        <validators>
              <! -- 使用字段校验器风格来配置,指定校验username属性 -->
              <field name="username">
                      <field-validator type="stringlength">
                            <! --指定字符串最小长度为6-->
                            <param name="minLength">6</param>
                            <! --指定字符串最大长度为20-->
                            <param name="maxLength">20</param>
                            <! --指定校验失败提示信息 -->
                            <message>用户名长度为${minLength}${maxLength}之间</message>
                      </field-validator>
              </field>
        </validators>

❑ 使用非字段校验器风格。

        <validators>
              <! -- 使用非字段校验器风格来配置,指定使用哪个校验器 -->
              <validator type="stringlength">
                    <! -- 指定需要校验的字段名 -->
                    <param name="fieldName">username</param>
                    <! --指定字符串最小长度为6-->
                    <param name="minLength">6</param>
                    <! --指定字符串最大长度为20-->
                    <param name="maxLength">20</param>
                    <! --指定校验失败提示信息 -->
                    <message>用户名长度为${minLength}${maxLength}之间</message>
              </validator>
        </validators>

打开用户注册页,输入一个不符合长度的用户名信息,如“fdfdf”,单击“注册”按钮。因为用户名长度不满足校验要求,所以校验失败。同时将添加相应的校验错误信息并返回注册页。页面将提示错误信息,提醒用户输入符合指定长度范围内的用户名信息,如图5.14所示。

图5.14 注册页面

5.3.12 正则表达式校验器

从“default.xml”注册文件中可以知道正则表达式校验器的名称为regex。对应的处理类为com.opensymphony.xwork2.validator.validators.RegexFieldValidator,其中RegexFieldValidator类源代码如下。

        * <! -- START SNIPPET: parameters -->
          * <ul>
          *    <li>fieldName - The field name this validator is validating. Required if using
          Plain-Validator Syntax otherwise not required</li>
          *     <li>expression - The RegExp expression   REQUIRED</li>
          *     <li>caseSensitive - Boolean (Optional). Sets whether the expression should be
          matched against in a case-sensitive way. Default is <code>true</code>.</li>
          *     <li>trim - Boolean (Optional). Sets whether the expression should be trimed
          before matching. Default is <code>true</code>.</li>
          * </ul>
          * <! -- END SNIPPET: parameters -->
        ...
        public class RegexFieldValidator extends FieldValidatorSupport {
            private String expression;
            private boolean caseSensitive = true;
            private boolean trim = true;
            ...
        }

正则表达式校验器用来校验指定的字段是否匹配指定的正则表达式。同样正则表达式校验器接受4个参数,分别为fieldName、expression、caseSensitive和trim。fieldName参数用来指定被校验的Action属性名。如果使用字段校验器风格,则无需指定该参数;如果为非字段校验器风格,则必须指定该参数。expression参数指定匹配的正则表达式,该参数是必需的。caseSensitive参数用来指定是否区分大小写,该参数为可选的,默认为true。trim参数用来指定是否截断被校验属性值前后的空白,该参数是可选的,默认值为true。

下面分别使用字段校验器配置风格以及非字段校验器风格来配置校验规则文件,用来校验用户输入字符串是否符合要求。

❑ 使用字段校验器风格。

        <validators>
                    <! -- 使用字段校验器风格来配置,指定校验myStrangePostcode属性 -->
                  <field name="myStrangePostcode">
                      <field-validator type="regex">
                      <! -- 使用匹配的正则表达式 -->
                        <param name="expression"><! [CDATA[([aAbBcCdD][123][eEfFgG][456])]]></param>
                      <! --指定校验失败提示信息 -->
                        <message>字符串不匹配</message>
                      </field-validator>
                  </field>
        </validators>

❑ 使用非字段校验器风格。

        <validators>
              <! -- 使用非字段校验器风格来配置,指定使用哪个校验器 -->
              <validator type="regex">
                    <! -- 指定需要校验的字段名 -->
                    <param name="fieldName">myStrangePostcode</param>
                    <! -- 使用匹配的正则表达式 -->
                    <param name="expression"><! [CDATA[([aAbBcCdD][123][eEfFgG][456])]]></param>
                    <! --指定校验失败提示信息 -->
                    <message>字符串不匹配</message>
              </validator>
        </validators>

打开用户注册页,输入一个不匹配正则表达式的字符串信息,如“aaaaaa”,单击“注册”按钮。因为输入的字符串不匹配该正则表达式,所以校验失败。同时将添加相应的校验错误信息并返回注册页。页面将提示错误信息,提醒用户字符串不匹配,如图5.15所示。

图5.15 注册页面