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();
*/
}