分享
 
 
 

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

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

本文内容

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文档。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有