111111
精灵王
精灵王
  • 注册日期2010-12-08
  • 发帖数640
  • QQ
  • 火币1103枚
  • 粉丝120
  • 关注75
  • 社区明星
阅读:4286回复:0

WebWork基于正则表达式(regex)的输入验证-JSP教程,资料/其他

楼主#
更多 发布于:2011-01-08 19:54
本文内容
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})$拿来改了了才行的。。。(要说的是学习相同东西就要学透了,不要只懂三分。)

更多黑客技术 黑客软件 计算机技术 编程技术 网站技术 qq技术 IT新闻 黑客基地 请访问 灯火安全联盟  灯火黑客 www.hack8888.com/bbs

喜欢0 评分0
游客

返回顶部