首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

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

2012-06-27 
《研磨struts2》第十章 验证框架 之 10.5 自定义验证器10.5??自定义验证器10.5.1概述虽然Struts2的内建验证

《研磨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>??

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

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

      图10.6 引用自定义验证器

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

      ?

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

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

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

热点排行