1. 程式人生 > >Struts2快速後臺驗證 使用

Struts2快速後臺驗證 使用

為了和前臺基於JavaScript的開源驗證框架RapidValidation使用統一的驗證規則, 最大限度的減少重複的後臺驗證程式碼, 使用方式簡便, 擴充套件方便.

https://blog.csdn.net/autojoke/article/details/5192534

本框架依賴於:

Struts 2

Java 5或者更高版本

GET/POST協議(支援帶檔案上傳的表單, 依賴於Commons-Upload元件)

整合步驟
1. 將檔案struts2-quickvalidation-plugin-1.0.jar 放入WEB-INF/lib目錄下;

2. 修改您自己的程式碼的src/struts.xml中的package定義繼承自quickValidation;

示例程式碼:

 

3. 使用註解加入驗證規則表示式;

在每個需要呼叫的Action的入口方法處, 加入@FormValidator 註解.

註解的完整語法如下:

@common.validation.FormValidator(input="出錯時需要返回的result別名", enabled=true/false , value="表單引數名稱1,表單引數中文提示資訊1,規則1 規則2…; 表單引數名稱2,表單引數中文提示資訊2,規則1 規則2…;更多欄位驗證資訊")

input 引數: 可選 . 如果不指定, 則出錯時仍然繼續進入到Action方法中; 如果指定, 則在表單驗證出錯時, 返回到給定的result中, 例如: 原始表單輸入頁面或者統一的錯誤輸出頁面;

enabled 引數: 可選 . 是否啟用此驗證規則, 如果不指定, 則忽略解析註解, 不進行任何驗證;

value 引數: 必填選項 , 可輸入一個或者多個表單引數驗證規則. 簡單說就是: [欄位1驗證配置];[欄位2驗證配置];…. 雖然不建議, 然而欄位驗證配置可以留空, 此時不會進行任何驗證處理.

而每個驗證配置 的格式如下:

表單引數名稱: 必填選項 . 指向輸入的表單控制元件的名稱(input的name);

表單引數中文提示資訊: 可選 . 如果為空, 則和表單引數名稱相同. 不為空時, 則顯示在出錯時的資訊提示的開頭位置;

規則1 規則2…: 可選. 理論上可加入任意多個驗證規則, 以單個空格 隔開. 在驗證開始後, 依次進行每個規則的驗證並加入提示資訊. 需要注意的是, 除required規則之外的所有規則只有當用戶輸入的欄位值非空時, 才進行有效性驗證, 如此便可避免所有欄位都成為必填欄位的問題發生.

每個規則 本身則由兩部分組成: 規則名-規則子名-引數1-引數2-引數3-….

規則名和規則子名是固定名稱, 不能任意填寫, 這兩個名稱對應一個具體的規則實現類.

其中引數 是必填選項 , 引數的意義則需要參考下一節的驗證規則表示式 中的說明. 下面舉例說明若干驗證規則:

required 這是特殊規則, 不帶規則子名;

float-range-1-20 其中float-range分別是規則名和規則子名, 而1和20則分別是兩個引數.

特別需要注意的是有負數時的情況此時引數列表變為: float-range--1 --20, 此時引數值分別為-1和-20.

如果需要給另一欄位加入驗證規則, 則以分號 隔開.

下面是若干驗證的示例及其解釋:

規則

解釋

@FormValidator

空的驗證規則, 不進行任何操作

@FormValidator("username,使用者名稱,required min-length-5")

對username欄位進行驗證, 規則為 必填, 最小長度為5; 出錯時分別提示:

使用者名稱不能為空

使用者名稱的長度不能小於5, 當前長度為1.

由於沒有指定input引數, 所以當驗證失敗時, 仍然會繼續進入到業務邏輯處理, 相關的錯誤資訊則存入request的attribute中.

@FormValidator("username, ,required min-length-5")

由於沒有指定欄位的中文提示, 因此出錯時將提示:

username的長度不能小於5, 當前長度為1.

@FormValidator(input="index" ,value=" username,使用者名稱,required min-length-5”)

這大概是最常用格式的驗證規則的寫法了. 此例和上例的區別為: 所以當驗證失敗時, 將進入input引數所指定的出錯資訊顯示頁面.

@FormValidator(input="index",enabled=false, value=" username,使用者名稱,required min-length-5”)

忽略所有驗證規則處理, 常用於除錯階段.

@FormValidator(input="index",value=" username,使用者名稱,required min-length-5;password2,重複密碼 ,required equals-password-原始密碼 ;”)

此規則加入了對重複密碼欄位的驗證, 出錯時將提示:

重複密碼 和原始密碼 的輸入不一致

@FormValidator(input="index",value="username,使用者名稱,required min-length-5;password2,重複密碼 ,required equals-password;”)

此規則省略了另一欄位的中文描述, 出錯時將提示:

重複密碼 和前面 的輸入不一致

   
   
以下為一個完整的Action類示例程式碼:

 

4. 修改前臺顯示驗證結果.

根據Action的不同, 前臺的顯示劃分為兩類:

普通的錯誤顯示:

所有錯誤資訊: ${validationErrors}

返回的內容是一個字串, 顯示了所有的出錯資訊, 而出錯字型的顏色則需要使用者自己去設定.

出錯資訊的顯示格式是以<br>分開的, 例如:

使用者名稱不能為空<br>密碼不能為空<br>重複密碼不能為空<br>性別必須至少選中一項<br>

另一種推薦的做法是讓Action繼承自Struts2中的ActionSupport, 此時則可用Struts 2的標籤來顯示出錯資訊, 可定位到具體的欄位:

 

或者使用純JSP來編寫頁面來定位到單條錯誤:

使用者名稱: <input name=username value=${param.username}> ${errors.username[0]}

下面給出這兩種寫法的完整示例:

 

<%@ page pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<mce:style><!--
.errorMessage {color:red;}
.errorLabel {font-weight:bold}
--></mce:style><style mce_bogus="1">.errorMessage {color:red;}
.errorLabel {font-weight:bold}</style>
<title>測試頁面</title>
</head>
<body>
<s:actionerror />
<form action="helloworld.action" method=post enctype="multipart/form-data">
使用者名稱: <input name=username value=${param.username}> ${errors.username[0]} <br>
年齡: <input name=age value=${param.age}><br>
密碼: <input name=password><br>
密碼重複: <input name=password2><br>
郵件: <input name=email><br>
性別: <input type=checkbox name=a>男 <input type=checkbox name=a>女<br>
IP地址: <input name=ip><br>
數字1: <input name=num1> 數字2: <input name=num2> <br>
日期:<input name=date><br>
附件: <input name=file type=file><br>
<input type=submit value="提交">
</form>
<span class="errorMessage">
${validationErrors}
</span>
Struts 2表單標籤示例:
<s:fielderror/>
<s:form action="helloworld.action" method="post">
<s:textfield name="username" label="使用者名稱" />
<s:password name="password" label="密碼" />
<s:submit/>
</s:form>
</body>
</html>

驗證規則表示式詳解
說明: 加紅色背景的部分是目前尚不支援的驗證規則; 加黃色背景的是增加了第二個可選引數的規則.

驗證表示式

描述

示例

required

非空域,全部空格也算空

 
validate-number

一個有效數

 
validate-digits

只能包含0-9任意個數字

 
validate-alpha

只能是字母a-z, A-Z

 
validate-alphanum

只能是字母和數字的組合

 
validate-email

只能是有效的email

 
validate-url

只能是有效的url地址

 
validate-one-required

至少有一個被選中,例如一組checkbox, radiobutton,它們最好包含在一個div和span中

 
validate-integer

只能是整數,可以有正負號

 
validate-ip

有效的IP地址

 
min-length-$number

最小長度是$number ( 此處$some表示一個特定的值)

最小長度為8: min-length-8

max-length-$number

最大長度是$number

最大長度為8: max-length-8

max-value-$number

輸入域的最大值是$number

最大值為8.1: max-value-8.1

min-value-$number

輸入域的最小值是$number

最大值為-8.1: max-value--8.1

equals-$otherInputId-$otherInputLabel

必須和某個input field相等,用於密碼兩次輸入驗證等,$otherInputLabel是可選項,用來描述另一欄位資訊

equals-password

重複密碼和原始密碼輸入不一致:

equals-password-原始密碼

less-than-$otherInputId-$otherInputLabel

小於某個input field less-than-otherInputId,多用於結束日期不能小於開始日期的需求,$otherInputLabel是可選項,用來描述另一欄位資訊

注:相等時也不能通過

great-than-$otherInputId-$otherInputLabel

大於某個input field less-than-otherInputId,$otherInputLabel是可選項,用來描述另一欄位資訊

 
validate-date-$dateFormat

只能是日期,$dateFormat為日期格式,$dateFormat的可選,預設格式為yyyy-MM-DD

validate-date-yyyy年MM月dd日

validate-file-$type1-$type2-$typeX

驗證檔案輸入域選擇的檔案型別只能為宣告的$type1 – $typeX中的一種

validate-file-png-jpeg

float-range-$minValue-$maxValue

必須是$minValue到$maxValue的一個浮點數

1至20: float-range-1-20

int-range-$minValue-$maxValue

必須是$minValue到$maxValue的一個整數

 
length-range-$minLength-$maxLength

輸入字串的長度必須在$minLength到$maxLength之間

 
validate-pattern-$RegExp

通過自定義正則表示式$RegExp來驗證輸入域的正確性

vaidate-pattern-/a/gi

validate-chinese

只能是中文(以下為中國的相關驗證)

 
validate-phone

有效的電話

 
validate-mobile-phone

有效的手機號

 
validate-id-number

驗證是否有效的身份證號碼

 
validate-zip

驗證郵政編碼

 
validate-qq

驗證QQ號碼

 
和RapidValidation 配合實現前後臺一致驗證
RapidValidation是專注於前臺的驗證框架, 例如下面的例子:

 

<!-- 為form增加required-validate class,標識需要驗證form -->
<form id='helloworld' action="#" class='required-validate'>
helloworld:</br>
<!--通過class新增驗證: required表示不能為空,min-length-15表示最小長度為15 -->
<textarea name='content' class='required min-length-15'>


其對應的後臺驗證規則為:

@FormValidator(input="index" ,value=" content ,helloworld ,required min-length-15 ”)

請注意比較異同, 不同部分已經以紅色粗體 進行了區分, 相同部分則以綠色粗體 標識.

大家可以看到, 兩者很容易就實現了一致的前後臺驗證規則.

如何擴充套件驗證規則?
要擴充套件驗證只需要實現IValidator即可即可, 並將實現類放入包 common.quickvalid.validators 下. 下面是IValidator 介面定義:

 

package common.quickvalid.validators;
import java.util.Map;
/**
* 驗證器介面.
* @author beansoft
* 日期: 2009-12-20
*/
public interface IValidator {
/**
* 實現驗證方法.
* @param fieldName 欄位name
* @param fieldDescription 出錯時的欄位描述資訊
* @param params 引數列表 <String key, String[] values> 表單引數Map
* @param args 引數列表
* @return 驗證資訊, 為空時表示沒有任何出錯資訊, 通過驗證
*/
public String doValidation(String fieldName, String fieldDescription, Map<String, String[]> params, String... args) ;
public String[] getArgs();
/**
* 設定引數列表
* @param args
*/
public void setArgs(String[] args);
public String getExpression();
/**
* 設定原始表示式, 用於日期, 正則等驗證方式, 避免和 - 號衝突.
* @param Expression
*/
public void setExpression(String expression);
}

類名有一定規則, 將第一個減號替換為下劃線即可, 例如:

length-range-$minLength-$maxLength 對應的類名是: length_range .

下面則給出一個實現類, 供參考:

package common.quickvalid.validators;
import java.util.Map;
/**
* 單個表單域驗證
*
* 非空域時才進行字串驗證.
* 最大長度驗證
* @author beansoft
*
*/
public class max_length implements IValidator {
public String doValidation(String fieldName, String fieldDescription,
Map<String, String[]> params, String... args) {
super.setParams(params);
String value = params.getValue(fieldName)[0];
int length = 0;
try {
length = Integer.parseInt(args[0]);
} catch(Exception ex) {}
if(value != null && value.length() > 0 && value.trim().length() > 0) {
if(value.trim().length() > length) {
return fieldDescription + "的長度不能大於" + length + ", 當前長度為" + value.trim().length();
}
}
return null;
}
/**
忽略getter和setter,和普通Java類無區別.
getXx();
setXxx();
*/
}