资讯   |   开发   |   选机中心   |   产品大全 | IBM | 惠普 | 联想 | 戴尔 | 苹果 | 神舟
更多: | 华硕 | 明基 | 方正 | 紫光 | TCL | 夏新 | 联宝 | 宏碁 | 七喜 | 长城 | 清华同方 | 海尔 | 三星 | 东芝 | 索尼 | 富士通 | LG | 技术 | ddnoon
当前位置:笔记本 > 编程开发 >
Advertisement
文章正文

WebWork基于正则表达式(regex)的输入验证 _编程

类型:转载   责任编辑:asp.net   日期:2007/05/23


热门软件下载:


   
  • Spring下的业务层Unit Test修正版  
  • JSF Fundamental  
  • 简化Spring--View层  
  • 从SP提供给CP的接口看SP的实力  
  • 利用java IDE(Jbuilder ,Eclipse)快速生成代码(1)--JavaBean  
  • 始终会用上的Common BeanUtils  
  • GuestBook Test  
  • PackageTest  
  • 每个初学JAVA者都应该搞懂的问题  
  • JDBC连接数据库格式  
  • 页面导航:

    正文内容:

    本文内容
    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})$拿来改了了才行的。。。(要说的是学习一样东西就要学透了,不要只懂三分。)


    四.引用内容
    文中相关的代码及示例完整内容:http://blog.csdn.net/leocdpadmin/archive/2005/02/02/278345.aspx
    文中使用的正则表达式原始出处:http://www.regexlib.com/redetails.aspx?regexp_id=515
    文使java中用regex教程:http://dev.csdn.net/article/60/60832.shtm
    还使用了xwork,java相关api文档。



     

     
    热门推荐笔记本: 清华同方笔记本
    相关文章:
    笔记本相关:
    IT技术文章:
    webmaster:popbb@126.com   最佳浏览:1024X768 MSIE
    ©2007 popbb.net All Rights Reserved