内建校验器3

简介:

9Visitor校验器

Visitor校验器主要用于检测Action里的复合属性,例如一个Action里包含了User类型的属性。假设有下面的Action类。

程序清单:codes\04\4.2\visitor\WEB-INF\src\org\crazyit\app\action\RegistAction.java

 
  1. public class RegistAction extends ActionSupport  
  2. {  
  3.     //Action里包含了一个User类型的参数  
  4.     private User user;  
  5.     //user属性的setter和getter方法  
  6.     public void setUser(User user)  
  7.     {  
  8.         this.user = user;   
  9.     }  
  10.     public User getUser()   
  11.     {  
  12.         return (this.user);   
  13.     }  
  14. }  

上面的User类是一个最普通的Java类,仅仅提供了4个属性,以及每个属性的settergetter方法。该User类的代码片段如下。

程序清单:codes\04\4.2\visitor\WEB-INF\src\org\crazyit\app\domain\User.java

 
  1. public class User  
  2. {  
  3.     //User类里包含的4个基本数据类型的属性  
  4.     private String name;  
  5.     private String pass;  
  6.     private int age;  
  7.     private Date birth;  
  8.     //此处省略了4个属性的setter和getter方法  
  9.     ...  
  10. }  

为了校验上面RegistAction里的User属性,显然不能通过其他校验器完成,因为那些普通校验器都只能校验基本数据类型和字符串类型。此时,为了校验该User类型属性里的其他属性,则应该使用Visitor校验器。

下面给出校验RegistAction的校验规则文件。

程序清单:codes\04\4.2\visitor\WEB-INF\src\org\crazyit\app\action\RegistAction-validation.xml

 

 
  1. <?xml version="1.0" encoding="GBK"?>  
  2. <!-- 指定校验规则文件的DTD信息 -->  
  3. <!DOCTYPE validators PUBLIC "  
  4.     -//OpenSymphony Group//XWork Validator 1.0.3//EN"  
  5.     "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">  
  6. <!-- 校验规则文件的根元素 -->  
  7. <validators>  
  8.     <!-- 指定校验user字段 -->  
  9.     <field name="user">  
  10.         <!-- 使用Visitor校验器 -->  
  11.         <field-validator type="visitor">  
  12.             <!-- 指定校验规则文件的context -->  
  13.             <param name="context">userContext</param>  
  14.             <!-- 指定校验失败后提示信息是否添加下面前缀 -->  
  15.             <param name="appendPrefix">true</param>  
  16.             <!-- 指定校验失败的提示信息前缀 -->  
  17.             <message>用户的:</message>  
  18.         </field-validator>  
  19.     </field>  
  20. </validators>  

显然,上面的校验规则并未指定User类里各字段应该遵守怎样的校验规则。因此,我们还必须为User类指定对应的校验规则文件。在默认情况下,该校验文件的规则文件名为User-validation.xml,因为配置Visitor校验器时指定了contextuserContext,则该校验文件的文件名为User-userContext-validation.xml(该文件不是放在与Action相同的路径,而是应该放在与User.class相同的路径)。该文件的代码如下。

程序清单:codes\04\4.2\visitor\WEB-INF\src\org\crazyit\app\domain\User-userContext-validation.xml

 
  1. <?xml version="1.0" encoding="GBK"?>  
  2. <!-- 指定校验配置文件的DTD信息 -->  
  3. <!DOCTYPE validators PUBLIC   
  4.     "-//OpenSymphony Group//XWork Validator 1.0.3//EN" 
  5.     "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">  
  6. <!-- 校验文件的根元素 -->  
  7. <validators>  
  8.     <!-- 校验User属性的name属性 -->  
  9.     <field name="name">  
  10.         <!-- 指定name属性必须满足必填规则 -->  
  11.         <field-validator type="requiredstring">  
  12.             <param name="trim">true</param>  
  13.             <!-- 如果校验失败,输出name.requried对应的国际化信息 -->  
  14.             <message key="name.requried"/>  
  15.         </field-validator>  
  16.         <!-- 指定name属性必须匹配正则表达式 -->  
  17.         <field-validator type="regex">  
  18.             <param name="expression"><![CDATA[(\w{4,25})]]></param>  
  19.             <!-- 如果校验失败,输出name.regex对应的国际化信息 -->  
  20.             <message key="name.regex"/>  
  21.         </field-validator>  
  22.     </field>  
  23.     <!-- 校验User属性的pass属性 -->  
  24.     <field name="pass">  
  25.         <!-- 指定pass属性必须满足必填规则 -->  
  26.         <field-validator type="requiredstring">  
  27.             <param name="trim">true</param>  
  28.             <!-- 如果校验失败,输出pass.requried对应的国际化信息 -->  
  29.             <message key="pass.requried"/>  
  30.         </field-validator>  
  31.         <!-- 指定pass属性必须满足匹配指定的正则表达式 -->  
  32.         <field-validator type="regex">  
  33.             <param name="expression"><![CDATA[(\w{4,25})]]></param>  
  34.             <!-- 如果校验失败,输出pass.regex对应的国际化信息 -->  
  35.             <message key="pass.regex"/>  
  36.         </field-validator>  
  37.     </field>  
  38.     <!-- 指定User属性的age属性必须在指定范围内-->  
  39.     <field name="age">  
  40.         <field-validator type="int">  
  41.             <param name="min">1</param>  
  42.             <param name="max">150</param>  
  43.             <!-- 如果校验失败,输出age.range对应的国际化信息 -->  
  44.             <message key="age.range"/>  
  45.         </field-validator>  
  46.     </field>  
  47.     <!-- 指定User属性的birth属性必须在指定范围内-->  
  48.     <field name="birth">  
  49.         <field-validator type="date">  
  50.             <!-- 下面指定日期字符串时,必须使用本Locale的日期格式 -->  
  51.             <param name="min">1900-01-01</param>  
  52.             <param name="max">2050-02-21</param>  
  53.             <!-- 如果校验失败,输出birth.range对应的国际化信息 -->  
  54.             <message key="birth.range"/>  
  55.         </field-validator>  
  56.     </field>  
  57. </validators>  

从上面的配置文件中可以看出,这个User-userContext-validation.xml文件的内容与之前校验Action的校验文件完全相同,通过这种方式就可以对Action里复合类型的属性进行校验了。

因为Action里的属性不再是基本数据类型,而是User类型的属性,则将JSP页面进行简单的修改:将表单域直接绑定到user属性的属性。修改后JSP页面的表单部分代码如下:

 
  1. <s:form action="registPro">  
  2.     <s:textfield name="user.name" label="用户名"/>  
  3.     <s:textfield name="user.pass" label="密码"/>  
  4.     <s:textfield name="user.age" label="年龄"/>  
  5.     <s:textfield name="user.birth" label="生日"/>  
  6.     <s:submit value="注册"/>  
  7. </s:form>  

在上面表单域的name属性中,指定了这些表单域的名字为user.passuser.age等,这就意味着将这些属性直接绑定到Action实例的user属性的passage属性。

如果浏览者的输入不能通过输入校验,将看到如图4.18所示的页面。

 

 在图4.18中看到校验提示信息是:“用户名:必须输入名字”等。其中“用户的:”字符串是在配置Visitor校验器时指定的<message .../>元素的内容,如果我们指定appendPrefix属性值为true,则会在提示信息中增加该前缀,否则将不会添加该前缀。

10.转换校验器

转换校验器的名称是conversion,它检查被校验字段在类型转换过程中是否出现错误。它可以接受如下两个参数。

Ø  fieldName:该参数指定校验的Action属性名,如果采用字段校验器风格,则无须指定该参数。

Ø  repopulateField:该参数指定当类型转换失败后,返回input页面时,类型转换失败的表单域是否保留原来的错误输入。

采用非字段校验器配置风格时,该校验器的配置示例如下:

 

 
  1. <validators>  
  2.     <!-- 使用非字段校验器风格来配置转换校验器 -->  
  3.     <validator type="conversion">  
  4.         <!-- 指定需要校验的字段名:age -->  
  5.         <param name="fieldName">age</param>  
  6.         <!-- 指定类型转换失败后,返回输入页面不保留原来的错误输入 -->  
  7.         <param name="repopulateField">false</param>  
  8.         <!-- 指定校验失败的提示信息 -->  
  9.         <message>你的年龄必须是一个整数</message>  
  10.     </validator>  
  11.     ..  
  12. <validators>  

采用字段校验器配置风格时,该校验器的配置示例如下:

 

 
  1. <validators>  
  2.     <!-- 使用字段校验器风格来配置转换校验器,校验age属性 -->  
  3.     <field name="age">  
  4.         <field-validator type="conversion">  
  5.             <!-- 指定类型转换失败后,返回输入页面依然保留原来的错误输入 -->  
  6.             <param name="repopulateField">true</param>  
  7.             <!-- 指定校验失败的提示信息 -->  
  8.             <message>你的年龄必须是一个整数</message>  
  9.         </ field-validator>  
  10.         ...  
  11.     </field>  
  12.     ..  
  13. <validators>  

11.字符串长度校验器

字符串长度校验器的名称是stringlength,它要求被校验字段的长度必须在指定的范围之内,否则就算校验失败。该校验器可以接受如下几个参数。

Ø  fieldName:该参数指定校验的Action属性名,如果采用字段校验器风格,则无须指定该参数。

Ø  maxLength:该参数指定字段值的最大长度,该参数可选,如果不指定该参数,则最大长度不受限制。

Ø  minLength:该参数指定字段值的最小长度,该参数可选,如果不指定该参数,则最小长度不受限制。

Ø  trim:指定校验该字段之前是否截断该字段值前后的空白。该参数可选,默认是true

采用非字段校验器配置风格时,该校验器的配置示例如下:

 
  1. <validators>  
  2.     <!-- 使用非字段校验器风格来配置字符串长度校验器 -->  
  3.     <validator type="stringlength">  
  4.         <!-- 指定需要校验的字段名:user -->  
  5.         <param name="fieldName">user</param>  
  6.         <!-- 指定user属性字符串的最小长度 -->  
  7.         <param name="minLength">4</param>  
  8.         <!-- 指定user属性字符串的最大长度 -->  
  9.         <param name="maxLength">20</param>  
  10.         <!-- 指定校验失败的提示信息 -->  
  11.         <message>你的用户名长度必须在420之间</message>  
  12.     </validator>  
  13.     ..  
  14. <validators>  

采用字段校验器配置风格时,该校验器的配置示例如下:

 
  1. <validators>  
  2.     <!-- 使用字段校验器风格来配置字符串长度校验器,校验user属性 -->  
  3.     <field name="user">  
  4.         <field-validator type="stringlength">  
  5.             <!-- 指定user属性字符串的最小长度 -->  
  6.             <param name="minLength">4</param>  
  7.             <!-- 指定user属性字符串的最大长度 -->  
  8.             <param name="maxLength">20</param>  
  9.             <!-- 指定校验失败的提示信息 -->  
  10.             <message>你的用户名长度必须在420之间</message>  
  11.         </ field-validator>  
  12.         ...  
  13.     </field>  
  14.     ..  
  15. <validators>  

12.正则表达式校验器

正则表达式校验器的名称是regex,它检查被校验字段是否匹配一个正则表达式。该校验器可以接受如下几个参数。

Ø  fieldName:该参数指定校验的Action属性名,如果采用字段校验器风格,则无须指定该参数。

Ø  expression:该参数是必需的,该参数指定匹配用的正则表达式。

Ø  caseSensitive:该参数指明进行正则表达式匹配时,是否区分大小写。该参数是可选的,默认是true

采用非字段校验器配置风格时,该校验器的配置示例如下:

 
  1. <validators>  
  2.     <!-- 使用非字段校验器风格来配置正则表达式校验器 -->  
  3.     <validator type="regex">  
  4.         <!-- 指定需要校验的字段名:user -->  
  5.         <param name="fieldName">user</param>  
  6.         <!--指定匹配的正则表达式-->  
  7.         <param name="expression"><![CDATA[(\w{4,20})]]></param>  
  8.         <!-- 指定校验失败的提示信息 -->  
  9.         <message>你的用户名长度必须在420之间,且必须是字母和数字</message>  
  10.     </validator>  
  11.     ...  
  12. <validators>  

采用字段校验器配置风格时,该校验器的配置示例如下:

 

 
  1. <validators>  
  2.     <!-- 使用字段校验器风格来配置正则表达式校验器,校验user属性 -->  
  3.     <field name="user">  
  4.         <field-validator type="regex">  
  5.             <!-- 指定匹配的正则表达式 -->  
  6.             <param name="expression"><![CDATA[(\w{4,20})]]></param>  
  7.             <!-- 指定校验失败的提示信息 -->  
  8.             <message>你的用户名长度必须在420之间,且必须是字母和数字</message>  
  9.         </ field-validator>  
  10.         ...  
  11.     </field>  
  12.     ...  
  13. <validators>  

  

本文转自 

fkJava李刚 51CTO博客,原文链接:http://blog.51cto.com/javaligang/884518 ,如需转载请自行联系原作者

相关文章
|
4月前
|
开发框架 .NET C#
C# 10.0中的扩展属性与模式匹配:深入解析
【1月更文挑战第20天】C# 10.0引入了众多新特性,其中扩展属性与模式匹配的结合为开发者提供了更强大、更灵活的类型检查和代码分支能力。通过这一特性,开发者可以在不修改原始类的情况下,为其添加新的行为,并在模式匹配中利用这些扩展属性进行更精细的控制。本文将详细探讨C# 10.0中扩展属性与模式匹配的工作原理、使用场景以及最佳实践,帮助读者更好地理解和应用这一新功能。
|
4月前
|
前端开发 JavaScript 安全
对象属性值的黑魔法:ES8的简化语法让你的代码更简洁
对象属性值的黑魔法:ES8的简化语法让你的代码更简洁
|
10月前
|
JavaScript 前端开发 开发者
TypeScript 入门指南:类型注解、接口和泛型
在现代前端开发中,TypeScript 已经成为越来越受欢迎的选择。TypeScript 是 JavaScript 的超集,它为 JavaScript 提供了类型系统和更多功能,帮助开发者在编码阶段发现潜在的错误,提高代码质量和可维护性。本文将深入探讨 TypeScript 中的核心特性:类型注解、接口和泛型。我们会从基础概念出发,循序渐进地讲解,同时提供丰富的代码示例和注释。
108 0
|
9月前
|
关系型数据库 MySQL 数据安全/隐私保护
nest自定义验证类及自定义验证装饰器
nest自定义验证类及自定义验证装饰器
|
10月前
|
Python
【Django学习】(九)自定义校验器_单字段_多字段校验_模型序列化器类
【Django学习】(九)自定义校验器_单字段_多字段校验_模型序列化器类
|
JavaScript API 数据库
使用 Zod 在 TypeScript 中进行自定义模式验证
使用 Zod 在 TypeScript 中进行自定义模式验证
502 0
|
Java
Java注释的三种方式
Java注释的三种方式
80 0
Java注释的三种方式
|
存储 JSON 算法
DO447使用过滤器和插件转换器--使用过滤器处理变量
DO447使用过滤器和插件转换器--使用过滤器处理变量
184 0
DO447使用过滤器和插件转换器--使用过滤器处理变量
|
JavaScript
TypeScript reflect-metadata 结合方法装饰器实现的一个自定义语法检查的例子
TypeScript reflect-metadata 结合方法装饰器实现的一个自定义语法检查的例子
TypeScript reflect-metadata 结合方法装饰器实现的一个自定义语法检查的例子