9.Visitor校验器
Visitor校验器主要用于检测Action里的复合属性,例如一个Action里包含了User类型的属性。假设有下面的Action类。
程序清单:codes\04\4.2\visitor\WEB-INF\src\org\crazyit\app\action\RegistAction.java
- public class RegistAction extends ActionSupport
- {
-
- private User user;
-
- public void setUser(User user)
- {
- this.user = user;
- }
- public User getUser()
- {
- return (this.user);
- }
- }
上面的User类是一个最普通的Java类,仅仅提供了4个属性,以及每个属性的setter和getter方法。该User类的代码片段如下。
程序清单:codes\04\4.2\visitor\WEB-INF\src\org\crazyit\app\domain\User.java
- public class User
- {
-
- private String name;
- private String pass;
- private int age;
- private Date birth;
-
- ...
- }
为了校验上面RegistAction里的User属性,显然不能通过其他校验器完成,因为那些普通校验器都只能校验基本数据类型和字符串类型。此时,为了校验该User类型属性里的其他属性,则应该使用Visitor校验器。
下面给出校验RegistAction的校验规则文件。
程序清单:codes\04\4.2\visitor\WEB-INF\src\org\crazyit\app\action\RegistAction-validation.xml
- <?xml version="1.0" encoding="GBK"?>
- <!-- 指定校验规则文件的DTD信息 -->
- <!DOCTYPE validators PUBLIC "
- -
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
- <!-- 校验规则文件的根元素 -->
- <validators>
- <!-- 指定校验user字段 -->
- <field name="user">
- <!-- 使用Visitor校验器 -->
- <field-validator type="visitor">
- <!-- 指定校验规则文件的context -->
- <param name="context">userContext</param>
- <!-- 指定校验失败后提示信息是否添加下面前缀 -->
- <param name="appendPrefix">true</param>
- <!-- 指定校验失败的提示信息前缀 -->
- <message>用户的:</message>
- </field-validator>
- </field>
- </validators>
显然,上面的校验规则并未指定User类里各字段应该遵守怎样的校验规则。因此,我们还必须为User类指定对应的校验规则文件。在默认情况下,该校验文件的规则文件名为User-validation.xml,因为配置Visitor校验器时指定了context为userContext,则该校验文件的文件名为User-userContext-validation.xml(该文件不是放在与Action相同的路径,而是应该放在与User.class相同的路径)。该文件的代码如下。
程序清单:codes\04\4.2\visitor\WEB-INF\src\org\crazyit\app\domain\User-userContext-validation.xml
- <?xml version="1.0" encoding="GBK"?>
- <!-- 指定校验配置文件的DTD信息 -->
- <!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.3//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
- <!-- 校验文件的根元素 -->
- <validators>
- <!-- 校验User属性的name属性 -->
- <field name="name">
- <!-- 指定name属性必须满足必填规则 -->
- <field-validator type="requiredstring">
- <param name="trim">true</param>
- <!-- 如果校验失败,输出name.requried对应的国际化信息 -->
- <message key="name.requried"/>
- </field-validator>
- <!-- 指定name属性必须匹配正则表达式 -->
- <field-validator type="regex">
- <param name="expression"><![CDATA[(\w{ 4,25})]]></param>
- <!-- 如果校验失败,输出name.regex对应的国际化信息 -->
- <message key="name.regex"/>
- </field-validator>
- </field>
- <!-- 校验User属性的pass属性 -->
- <field name="pass">
- <!-- 指定pass属性必须满足必填规则 -->
- <field-validator type="requiredstring">
- <param name="trim">true</param>
- <!-- 如果校验失败,输出pass.requried对应的国际化信息 -->
- <message key="pass.requried"/>
- </field-validator>
- <!-- 指定pass属性必须满足匹配指定的正则表达式 -->
- <field-validator type="regex">
- <param name="expression"><![CDATA[(\w{ 4,25})]]></param>
- <!-- 如果校验失败,输出pass.regex对应的国际化信息 -->
- <message key="pass.regex"/>
- </field-validator>
- </field>
- <!-- 指定User属性的age属性必须在指定范围内-->
- <field name="age">
- <field-validator type="int">
- <param name="min">1</param>
- <param name="max">150</param>
- <!-- 如果校验失败,输出age.range对应的国际化信息 -->
- <message key="age.range"/>
- </field-validator>
- </field>
- <!-- 指定User属性的birth属性必须在指定范围内-->
- <field name="birth">
- <field-validator type="date">
- <!-- 下面指定日期字符串时,必须使用本Locale的日期格式 -->
- <param name="min">1900-01-01</param>
- <param name="max">2050-02-21</param>
- <!-- 如果校验失败,输出birth.range对应的国际化信息 -->
- <message key="birth.range"/>
- </field-validator>
- </field>
- </validators>
从上面的配置文件中可以看出,这个User-userContext-validation.xml文件的内容与之前校验Action的校验文件完全相同,通过这种方式就可以对Action里复合类型的属性进行校验了。
因为Action里的属性不再是基本数据类型,而是User类型的属性,则将JSP页面进行简单的修改:将表单域直接绑定到user属性的属性。修改后JSP页面的表单部分代码如下:
- <s:form action="registPro">
- <s:textfield name="user.name" label="用户名"/>
- <s:textfield name="user.pass" label="密码"/>
- <s:textfield name="user.age" label="年龄"/>
- <s:textfield name="user.birth" label="生日"/>
- <s:submit value="注册"/>
- </s:form>
在上面表单域的name属性中,指定了这些表单域的名字为user.pass、user.age等,这就意味着将这些属性直接绑定到Action实例的user属性的pass、age属性。
如果浏览者的输入不能通过输入校验,将看到如图4.18所示的页面。
在图4.18中看到校验提示信息是:“用户名:必须输入名字”等。其中“用户的:”字符串是在配置Visitor校验器时指定的<message .../>元素的内容,如果我们指定appendPrefix属性值为true,则会在提示信息中增加该前缀,否则将不会添加该前缀。
10.转换校验器
转换校验器的名称是conversion,它检查被校验字段在类型转换过程中是否出现错误。它可以接受如下两个参数。
Ø fieldName:该参数指定校验的Action属性名,如果采用字段校验器风格,则无须指定该参数。
Ø repopulateField:该参数指定当类型转换失败后,返回input页面时,类型转换失败的表单域是否保留原来的错误输入。
采用非字段校验器配置风格时,该校验器的配置示例如下:
- <validators>
- <!-- 使用非字段校验器风格来配置转换校验器 -->
- <validator type="conversion">
- <!-- 指定需要校验的字段名:age -->
- <param name="fieldName">age</param>
- <!-- 指定类型转换失败后,返回输入页面不保留原来的错误输入 -->
- <param name="repopulateField">false</param>
- <!-- 指定校验失败的提示信息 -->
- <message>你的年龄必须是一个整数</message>
- </validator>
- ..
- <validators>
采用字段校验器配置风格时,该校验器的配置示例如下:
- <validators>
- <!-- 使用字段校验器风格来配置转换校验器,校验age属性 -->
- <field name="age">
- <field-validator type="conversion">
- <!-- 指定类型转换失败后,返回输入页面依然保留原来的错误输入 -->
- <param name="repopulateField">true</param>
- <!-- 指定校验失败的提示信息 -->
- <message>你的年龄必须是一个整数</message>
- </ field-validator>
- ...
- </field>
- ..
- <validators>
11.字符串长度校验器
字符串长度校验器的名称是stringlength,它要求被校验字段的长度必须在指定的范围之内,否则就算校验失败。该校验器可以接受如下几个参数。
Ø fieldName:该参数指定校验的Action属性名,如果采用字段校验器风格,则无须指定该参数。
Ø maxLength:该参数指定字段值的最大长度,该参数可选,如果不指定该参数,则最大长度不受限制。
Ø minLength:该参数指定字段值的最小长度,该参数可选,如果不指定该参数,则最小长度不受限制。
Ø trim:指定校验该字段之前是否截断该字段值前后的空白。该参数可选,默认是true。
采用非字段校验器配置风格时,该校验器的配置示例如下:
- <validators>
- <!-- 使用非字段校验器风格来配置字符串长度校验器 -->
- <validator type="stringlength">
- <!-- 指定需要校验的字段名:user -->
- <param name="fieldName">user</param>
- <!-- 指定user属性字符串的最小长度 -->
- <param name="minLength">4</param>
- <!-- 指定user属性字符串的最大长度 -->
- <param name="maxLength">20</param>
- <!-- 指定校验失败的提示信息 -->
- <message>你的用户名长度必须在4到20之间</message>
- </validator>
- ..
- <validators>
采用字段校验器配置风格时,该校验器的配置示例如下:
- <validators>
- <!-- 使用字段校验器风格来配置字符串长度校验器,校验user属性 -->
- <field name="user">
- <field-validator type="stringlength">
- <!-- 指定user属性字符串的最小长度 -->
- <param name="minLength">4</param>
- <!-- 指定user属性字符串的最大长度 -->
- <param name="maxLength">20</param>
- <!-- 指定校验失败的提示信息 -->
- <message>你的用户名长度必须在4到20之间</message>
- </ field-validator>
- ...
- </field>
- ..
- <validators>
12.正则表达式校验器
正则表达式校验器的名称是regex,它检查被校验字段是否匹配一个正则表达式。该校验器可以接受如下几个参数。
Ø fieldName:该参数指定校验的Action属性名,如果采用字段校验器风格,则无须指定该参数。
Ø expression:该参数是必需的,该参数指定匹配用的正则表达式。
Ø caseSensitive:该参数指明进行正则表达式匹配时,是否区分大小写。该参数是可选的,默认是true。
采用非字段校验器配置风格时,该校验器的配置示例如下:
- <validators>
- <!-- 使用非字段校验器风格来配置正则表达式校验器 -->
- <validator type="regex">
- <!-- 指定需要校验的字段名:user -->
- <param name="fieldName">user</param>
- <!--指定匹配的正则表达式-->
- <param name="expression"><![CDATA[(\w{ 4,20})]]></param>
- <!-- 指定校验失败的提示信息 -->
- <message>你的用户名长度必须在4到20之间,且必须是字母和数字</message>
- </validator>
- ...
- <validators>
采用字段校验器配置风格时,该校验器的配置示例如下:
- <validators>
- <!-- 使用字段校验器风格来配置正则表达式校验器,校验user属性 -->
- <field name="user">
- <field-validator type="regex">
- <!-- 指定匹配的正则表达式 -->
- <param name="expression"><![CDATA[(\w{ 4,20})]]></param>
- <!-- 指定校验失败的提示信息 -->
- <message>你的用户名长度必须在4到20之间,且必须是字母和数字</message>
- </ field-validator>
- ...
- </field>
- ...
- <validators>