WebWork基於正則表達式(regex)的輸入驗證

本文內容
1.開發動機。
2.開發過程及示例程序代碼
3.遇到的問題及思考。
4.引用內容


一:動機
    前天學習了webwork的服務器端validation,不過xwork提供的幾個驗證類不能很符合開發的需要,特別是對於輸入輸出特殊字符的過濾功能,比如說用戶名密碼只能由字母和數字組成,而如果針對每種類型寫一個驗證類,那會很辛苦,不是嗎?如果有一個通用的驗證類該有多好啊。別急,有辦法,文本處理和匹配正是正則表達式的長處,上午查了一下xwork文檔中關於validation的描述和示例沒找到相關的內容,所以決定自己寫一個類,來實現正則表達式檢驗功能。經過實現和測試基本符合要求,不過使用了jdk1.4的regex庫,低版本jdk不能使用。不知別人有什麼其它辦法?

由於剛轉做java沒幾天對junit不是很熟悉,不知道像本文中寫到的validation類如何進行單元測試,請高手指點。

版權聲明:可以任意轉載,轉載時請務必標明文章原始出處、作者及本聲明:http://www.upulife.com

[email protected]

二:開發過程及示例程序代碼
先想一下我需要了解什麼
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文檔。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章