`

《研磨struts2》第十章 验证框架 之 10.5 自定义验证器

 
阅读更多

10.5  自定义验证器

10.5.1概述

虽然Struts2的内建验证器可以完成绝大多数的验证需求,但是,有的时候还是需要个性化定制一些自定义的验证器。

       以一个示例来说明吧。来实现一个不接受中文字符的验证器,比如,在一个网站上进行注册,在填入账号的时候,必须填入英文字符或者是数字等,而不接受中文字符,同时还要求验证器可以分辨以下三种情况:

  • 全是非中文字符
  • 全是中文字符
  • 既有非中文字符又有中文字符

       该怎么实现呢?通常在做自定义验证器的时候,需要考虑如下几个问题:

  • 如何编写自定义验证器的代码。
  • 如何注册自定义验证器。
  • 程序中如何引用自定义验证器。

接下来就来看看如何实现自定义验证器吧。

10.5.2实现自定义验证器

要验证一个字符串是否含有中文字符,可以使用比较字符串的字节数和字符数的方式,也就是比较byte的长度和char的长度。

调用字符串的length方法,可以返回字符串的长度,这时候,无论是中文字符还是引文字符都会按照一个字符来返回,也就是得到了字符串的字符数。

如果把字符串转换为byte[],然后取其length,就可以得到字符串的字节数,这时候,中文字符在数组中占2个位置而英文字符在数组中占1个位置。

因此,比较字符串的字节数和字符数,就可以知道字符串中是否有中文字符了,如果字节数大于字符数,那么肯定包含了中文字符。示例代码如下:

 

java代码:
  1. package cn.javass.validate;  
  2.   
  3. import com.opensymphony.xwork2.validator.ValidationException;  
  4. import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;  
  5.   
  6. public class ChineseValidator  extends FieldValidatorSupport{  
  7.     /** 
  8.      * 表示是否包含有中文。现在有三种模式: 
  9.      * none 没有中文字符 
  10.      * some 含有中文字符,默认值 
  11.      * all 全是中文字符 
  12.      */  
  13.     private String mode = "some";  
  14.     public void setMode(String mode) {  
  15.         this.mode = mode;  
  16.     }  
  17.       
  18.     public void validate(Object object) throws ValidationException {            //获取字段名  
  19.         final String fieldName = this.getFieldName();  
  20.         //获取字段值  
  21.         final String fieldValue = (String) this.getFieldValue(fieldName, object);         
  22.         //字节数  
  23.         final int bytes = fieldValue.getBytes().length;  
  24.         //字符数  
  25.         final int chars = fieldValue.length();  
  26.           
  27.         if (mode.equals("none")){  
  28.             //现在要求全是非中文字符  
  29.             //所以字节数和字符数,两个数字必须相等,不相等则出错  
  30.             if (chars!=bytes){  
  31.                 this.addFieldError(fieldName, object);  
  32.             }  
  33.         }else if(mode.equals("some")){  
  34.             //现在要求包含有中文字符  
  35.             //所以字节数与字节数必然不相等,相等则出错  
  36.             //另外,如果字节数是字符数的2倍,表示全是中文字符,也出错  
  37.             if (chars==bytes||chars*2==bytes){  
  38.                 this.addFieldError(fieldName, object);  
  39.             }  
  40.         }else if(mode.equals("all")){  
  41.             //现在要求全是中文字符  
  42.             //所以字节数应该是字符数的2倍,否则出错  
  43.             if (chars*2!=bytes){  
  44.                 this.addFieldError(fieldName, object);  
  45.             }  
  46.         }  
  47.     }  
  48. }  

 

java代码:
  1. 通过上面的示例可以看出,要实现自定义得验证器的基本方式是:写一个类来继承FieldValidatorSupport 这个类,它提供很多方法来供我们调用,其中比较重要的是:  
  2.    getFieldName方法用来获取被验证的字段名;  
  3.    getFieldValue方法用来获取用户输入的参数;  
  4.    还有一个抽象方法validate等待我们来实现,在这个方法中,如果我们调用了addFieldError,说明发生了字段验证错误,如果我们调用了addActionError,说明发生了动作验证错误。  
  5. 在上面示例中除了validate方法外,还有一个字符串类型的mode属性和它对应的setter,这是为了在引用这个验证器的时候,可以通过使用<param>子元素来设置mode属性,从而切换需要验证器实现的功能。  

10.5.3声明自定义验证器

自定义的验证器,只需要在classpath的根路径上,即放在src文件夹下(会被Eclipse自动拷贝到classpath的根下去),仿照default.xml的声明方式,写一个validators.xml即可。示例如下:

 

java代码:
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE validators PUBLIC  
  3.         "-//OpenSymphony Group//XWork Validator Config 1.0//EN"        "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">  
  4.   
  5. <validators>  
  6.     <validator name="chinese" class="cn.javass.validate.ChineseValidator"/>  
  7. </validators>  

不过要注意一点,在Struts2的2.0.8版本之前,一旦自己定义了validators.xml文件,系统就不会再加载默认的Validators文件,所以在Validators.xml中需要拷贝默认的内容。

10.5.4引用自定义验证器

在应用中引用自定义验证器的时候,和引用内建验证器的方式是完全一样的。修改RegisterAction-validation.xml中验证用户填入的账号(user.account)属性的验证器,设置为上面配置的“chinese”,示例代码如下:

 

java代码:
  1. <validators>  
  2.     <field name="user.account">  
  3.         <field-validator type="chinese">  
  4.             <param name="mode">none</param>  
  5.             <message>用户账号,只能输入非中文的字符</message>  
  6.         </field-validator>  
  7.     </field>  
  8. </validators>  

这时候,再访问用户注册页面,在帐号上输入中文,会发现不能通过验证,运行页面如下:

图10.6 引用自定义验证器

       通过上面示例可以看出,自定义的验证器和所有内置验证器的使用是完全一样的,因此,任何人都可以为Struts2添砖加瓦,贡献出自己的验证器,来让其他人使用。

 

私塾在线网站原创《研磨struts2》系列

转自请注明出处:【http://sishuok.com/forum/blogPost/list/4094.html

欢迎访问http://sishuok.com获取更多内容

分享到:
评论
1 楼 changyang 2014-03-06  
引用
中文字符在数组中占2个位置而英文字符在数组中占1个位置。


如果是UTF-8编码,中文就是3个字节了吧..........

相关推荐

    研磨Struts2配书视频对应的演示源代码

    2. **拦截器(Interceptors)**:Struts2的核心之一是其拦截器机制,它们在Action执行前后执行一系列预定义或自定义的操作。这些拦截器可以用于登录验证、日志记录、性能监控等。源代码中可能包含了不同类型的拦截器...

    研磨Struts2

    ### 知识点一:Struts2入门(MVC HelloWorld) #### 1.1 Struts2简介 ...以上就是关于“研磨Struts2”的主要知识点梳理,通过深入学习这些内容,开发者可以更好地掌握Struts2框架的核心技术和实践技巧。

    《研磨Struts 2》PDF版本下载.txt

    为了更好地理解和概括这份资料所涉及的知识点,我们先来了解一下Struts 2框架及其重要性,然后深入探讨《研磨Struts 2》这本书的主要内容。 ### Struts 2框架简介 Struts 2是Apache Struts的一个版本,它是用于...

    研磨Struts2配书视频对应的PPT

    Struts2框架的拦截器是其一大特色,它允许开发者定义一系列预定义或自定义的行为,这些行为在请求被处理前和后执行。例如,登录验证、日志记录、性能监控等都可以通过拦截器实现。通过灵活的拦截器链,开发者可以...

    研磨struts2 高清版

    由于文件较大,我把这个文档切割为2部分,这是第一部分,请下载完第一部分后一定要下载第二部分,否则不能阅读。

    研磨struts

    Struts2是一个强大的Java web应用程序框架,用于构建...通过《研磨Struts2》,读者可以系统地学习Struts2框架的各个方面,从而熟练掌握这个强大的Web开发工具,提高开发效率,构建出结构清晰、易于维护的Java Web应用。

    研磨Struts2 高清完整版.part2

    研磨Struts2 高清完整版,请和第一部分一起下载啊

    研磨Struts2_12859679_高清完整版.part2.rar

    研磨Struts2_12859679_高清完整版

    研磨Struts2-高清-完整目录-2011年10月

    研磨Struts2-高清-完整目录-2011年10月,分享给所有需要的人

    Java工程师三大框架面试题.pdf

    Java工程师三大框架面试题.pdf

    第十章多功能敏感陶瓷.ppt

    【第十章多功能敏感陶瓷】 多功能敏感陶瓷是一种集多种传感功能于一体的新型材料,旨在满足现代科技发展和实际应用的需求。从20世纪80年代初开始,国内外科研人员开始研究这类陶瓷,以期将不同功能的传感器集成在一...

    研磨设计模式(完整带书签).part2.pdf

    本电子书一共两个压缩文档,本文件为part2. 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,...

    2017_2018学年九年级化学下册第十章第三节中档难度提升题含解析北京课改版

    例如,NH4Cl与KCl可通过观察外观区别,而(NH4)2SO4与K2SO4可通过加熟石灰研磨后闻气味来区分。 11. 鉴别化肥的实用方法:如(NH4)2SO4与KCl可通过加熟石灰粉末研磨后闻气味,前者会产生氨气,后者无明显气味。 12. ...

    研磨设计模式.part2

    研磨设计模式.part2 一定要下载5部分

Global site tag (gtag.js) - Google Analytics