本文內容
1.開發動機。
2.開發過程及示例程序代碼
3.遇到的問題及思考。
4.引用內容
一:動機
前天學習了webwork的服務器端validation,不過xwork提供的幾個驗證類不能很符合開發的需要,特別是對於輸入輸出特殊字符的過濾功能,比如說用戶名密碼只能由字母和數字組成,而如果針對每種類型寫一個驗證類,那會很辛苦,不是嗎?如果有一個通用的驗證類該有多好啊。別急,有辦法,文本處理和匹配正是正則表達式的長處,上午查了一下xwork文檔中關於validation的描述和示例沒找到相關的內容,所以決定自己寫一個類,來實現正則表達式檢驗功能。經過實現和測試基本符合要求,不過使用了jdk1.4的regex庫,低版本jdk不能使用。不知別人有什麼其它辦法?
由於剛轉做java沒幾天對junit不是很熟悉,不知道像本文中寫到的validation類如何進行單元測試,請高手指點。
版權聲明:可以任意轉載,轉載時請務必標明文章原始出處、作者及本聲明:http://www.upulife.com
二:開發過程及示例程序代碼
先想一下我需要了解什麼
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
* [email protected]
* 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文檔。