新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论Java, J2SE, J2ME, J2EE, 以及Eclipse, NetBeans, JBuilder等Java开发环境,还有JSP, JavaServlet, JavaBean, EJB以及struts, hibernate, spring, webwork2, Java 3D, JOGL等相关技术。
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 Java/Eclipse 』 → WebWork基于正则表达式(regex)的输入验证 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 4166 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: WebWork基于正则表达式(regex)的输入验证 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     npuhetao 帅哥哟,离线,有人找我吗?
      
      
      威望:5
      头衔:骨灰级菜鸟
      等级:大二(研究C++)
      文章:230
      积分:2708
      门派:XML.ORG.CN
      注册:2004/3/18

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给npuhetao发送一个短消息 把npuhetao加入好友 查看npuhetao的个人资料 搜索npuhetao在『 Java/Eclipse 』的所有贴子 引用回复这个贴子 回复这个贴子 查看npuhetao的博客楼主
    发贴心情 WebWork基于正则表达式(regex)的输入验证

    本文内容
    1.开发动机。
    2.开发过程及示例程序代码
    3.遇到的问题及思考。
    4.引用内容


    一:动机
        前天学习了webwork的服务器端validation,不过xwork提供的几个验证类不能很符合开发的需要,特别是对于输入输出特殊字符的过滤功能,比如说用户名密码只能由字母和数字组成,而如果针对每种类型写一个验证类,那会很辛苦,不是吗?如果有一个通用的验证类该有多好啊。别急,有办法,文本处理和匹配正是正则表达式的长处,上午查了一下xwork文档中关于validation的描述和示例没找到相关的内容,所以决定自己写一个类,来实现正则表达式检验功能。经过实现和测试基本符合要求,不过使用了jdk1.4的regex库,低版本jdk不能使用。不知别人有什么其它办法?

    由于刚转做java没几天对junit不是很熟悉,不知道像本文中写到的validation类如何进行单元测试,请高手指点。

    二:开发过程及示例程序代码
    先想一下我需要了解什么
    1.由于对java不是很熟悉,首先要知道java中如何使用正则表达式。
    2.如何实现一个validator类,可以在xwork中使用?


    对于第二个问题很容易解决,因为我们有xwork的源代码嘛(赫赫,开源真是好啊。)
    找到xwork源代码中StringLengthFieldValidator.java看一下人家是怎么实现的,xwork中实现 验证倒是不难,继承com.opensymphony.xwork.validator.validators.FieldValidatorSupport类就可以了,期间我又找到它们的父类以及实现的接口看了看,,也没细看(以后有时间慢慢看。)就开始考虑下一个问题了。。

    如何在java中使用regex呢?不是很清楚,以前jdk中没这方面的库,据说oralily还是worx有一个实现,于上google搜索了一下,找到一个jdk的api,没想到jdk1.4已经开始支持regex了(看来regex魅力真是大呀,到处都有实现,unix下的工具我最喜欢的就属grep了。),怎么用呢?又找到csdn上的一篇文章<<JAVA与正则表达式>>http://dev.csdn.net/article/60/60832.shtm,呵呵,挺简单的(反正我也只用简单功能)

    用是开始动手写validator类了:

    /*
    * Created on 2005-2-4
    * hjleochen@hotmail.com
    * GPL
    */
    package com.xxxxxx.validator;

    import java.util.regex.*;

    import com.opensymphony.xwork.validator.validators.FieldValidatorSupport;
    import com.opensymphony.xwork.validator.ValidationException;

    /**
    * @author leo
    *
    *使用正则表达式来检验输入字段是否符合条件,如果找到匹配则检验通过,不匹配则检验失败
    *在xwork的validators体系中使用。
    *使用了java的regex包,需要在jdk1.4及以上版本才能运行。
    *
    */
    public class StringRegexValidator extends FieldValidatorSupport  {

    private String regex="";
    private boolean doTrim = true;

    public void validate( Object object )throws ValidationException{
      
      String fieldName = getFieldName();
      String value = (String)this.getFieldValue( fieldName, object );
      
            if (doTrim) {
             value = value.trim();
            }
            
            System.out.println("N:"+fieldName+"v:"+value+"reg:"+regex);
      
      Pattern pattern = Pattern.compile( regex );
      Matcher matcher = pattern.matcher( value );
      
      if ( !matcher.find() ){
       System.out.println("error");
       addFieldError( fieldName, object );
      }
      
      System.out.print("done");
      
    }

    /**
      * @return Returns the regex.
      */
    public String getRegex() {
      return regex;
    }
    /**
      * @param regex The regex to set.
      */
    public void setRegex(String regex) {
      this.regex = regex;
    }
    /**
      * @return Returns the trim.
      */
    public boolean isTrim() {
      return doTrim;
    }
    /**
      * @param trim The trim to set.
      */
    public void setTrim(boolean trim) {
      doTrim = trim;
    }
    }

    编译测试通过。。。

    (以下配置及代码应该结合本人前一篇log<Webwork服务器端validation>阅读)

    配置/WEB-INF/classes/validators.xml

        <validator name="stringregex"
            class="com.longshine.validator.StringRegexValidator"/>  
            
    将上次的登陆的示例的LoginAction-validator.xml修改一下。。。

        <field name="UserName">
            <field-validator type="stringregex">
                <param name="regex">^([a-zA-Z0-9_]+)$</param>
                <message>用户名只能由字母、数字及下划线组成。</message>
            </field-validator>       
        </field>
        <field name="Password">
          <field-validator type="stringregex">
           <param name="regex">^([a-zA-Z0-9_]{6,15})$</param>
                <message>密码只能由字母、数字及下划线组成且长度必须在6-15 之间.</message>
            </field-validator>      
        </field>
        
    呵呵,是不是比昨天的短多了,灵活多了。功能也强大了很多吧。哈哈。

    测试:

    输入不符合条件的内容输出:
    ERROR:
    UserName=[用户名只能由字母、数字及下划线组成。]
    Password=[密码只能由字母、数字及下划线组成且长度必须在6-15 之间.]

    符合预期要求。。。


    三.遇到的问题及思考。
    第一个遇到的问题就是对于regex库不熟悉,所以对写出的代码没有信心。第一次运行时没出结果
    (注意了Xwork文档中写到:
    Bear in mind that the ValidationInterceptor only performs validation. The Action will still be executed even if there are any validation errors. )
    所以以为程序出错了(后来查一下原来是正则表达式写错了。。。),于是写了一个小的main程序对
    regex库写了几个小示例,基本了解过程重新检查regex发现表达式写错。呵呵,又是老问题遇事盲目测试!这次还想说的就是一个新的事物不要因为简单而不去实验就马上用,否则会打击信心,对系统全局没有把握。

    第二个问题就是正则表达式如何书写的问题,说来惭愧在unix下写了一年多程序regex也没能好好掌握,而且早就下决心学,可还是没学好。。学了又忘记了。。。
    (?!^[0-9]*$)(?!^[a-zA-Z_@]*$)(?!^[0-9_@]{1})^([a-zA-Z0-9_@]{6,16})$
    这个表达式什么意思,你明白吗? 其中的 !  表示什么你知道吗?
    我现在知道了。呵呵。
    匹配用户密码的regex老是写的不正确后来在http://www.regexlib.com/上找到(?!^[0-9]*$)(?!^[a-zA-Z_@]*$)(?!^[0-9_@]{1})^([a-zA-Z0-9_@]{6,16})$拿来改了了才行的。。。(要说的是学习一样东西就要学透了,不要只懂三分。)


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    你硬要把单纯的事情看得很严重,那样子你会很痛苦。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/3/7 16:47:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Java/Eclipse 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2025/9/13 19:44:59

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    125.000ms