Struts2之Validator驗證框架的詳細介紹
Struts2中提供了資料校驗驗證資料例如驗證郵件、數字等。驗證方式有3種:
一是通過validate()方法,
二是通過Xml,
三是使用註解方式。
一、初始化
首先定義一個User類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
.name = name;
|
二、validate()方法驗證
可以在繼承了ActionSupport的Action中重寫validate()來進行驗證。validate()方法會在execute()方法執行前執行,僅當資料校驗正確,才執行execute()方法, 如錯誤則將錯誤新增到fieldErrors域中,如果定義的Action中存在多個邏輯處理方法,且不同的處理邏輯需要不同的校驗規則,這種情況下validate()會對所有處理邏輯使用相同的校驗規則,為了實現不同的校驗邏輯,需要通過validateX()方法,其中X表示處理邏輯的方法名,如果有錯誤系統會返回result name="input"的頁面,所以需要在action中定義一個input的result。我昨天就困在這個地方好久。問了我大學同學才解決,為了這個validate()驗證昨晚一點多都沒睡,雖然SSH框架現在不流行,特別是前幾天struts2報了一個遠端bug,不過想著既然學java了,就係統的學一遍吧。
1.validate()方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
|
struts.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
2.validateX()方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
|
struts.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
JSP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
二、XML驗證
使用validate方法校驗時,如果Web應用中存在大量Action就需要多次重寫validate方法,因此可以使用XWork的validator框架來對Struts2進行資料校驗,減少程式碼量。在action包下建立驗證檔案XXX-validation.xml,注:當一個Action中有多個業務處理方法是,命名規則為:actionName-methodName-validation.xml,其中actionName為Action類名,methodName為Action中某個業務處理方法的方法名,並且檔案的搜尋順序與方式一種validate()和validateX()一樣。
這裡先註釋掉Action的驗證方法,然後新增一個xml驗證檔案,最後要在form中增加validate="true"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
這裡遺留了兩個問題,一是錯誤資訊不是一次全部顯示出來,如上面兩個圖先顯示兩個錯誤提示,然後將顯示的修改正確之後又顯示其他的,這為什麼不是全部顯示出來呢?二是在Xml中使用正則表示式驗證怎麼不起作用,這個也是個遺留的問題,先把這兩個問題放在這裡,等以後再問下其他人,如果哪位讀者知道原因也希望留言告訴博主,先謝過了。
三、註解
1.Validations Annotation的使用
Validations中定義了一些驗證器的陣列,用於存放驗證規則,定義如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
RequiredStringValidator —— 必填字串校驗器
校驗要求:指定欄位不能為null且字串長度大於0
引數:
- fieldName:校驗欄位名
- trim:校驗時取出字串兩邊的空格,預設為true
- message:校驗失敗時的訊息
- key:校驗失敗時返回i18n中指定名稱的訊息
RequiredFieldValidator —— 必填校驗器
校驗要求:指定欄位不能為null
引數:
- fieldName:校驗欄位名
- message:校驗失敗時的訊息
- key:校驗失敗時返回i18n中指定名稱的訊息
IntRangeFieldValidator —— 整數範圍校驗器
校驗要求:int、long、short欄位的整數值在指定的範圍內
引數:
- min:指定最小值,可選,沒有則不檢查最小值
- max:指定最大值,可選,沒有則不檢查最大值
- fieldName:校驗欄位名
- message:校驗失敗時的訊息
- key:校驗失敗時返回i18n中指定名稱的訊息
DateRangeFieldValidator —— 日期範圍校驗器
校驗要求:日期在指定的範圍內
引數:
- min:指定最小值,可選,沒有則不檢查最小值
- max:指定最大值,可選,沒有則不檢查最大值
- fieldName:校驗欄位名
- message:校驗失敗時的訊息
- key:校驗失敗時返回i18n中指定名稱的訊息
EmailValidator —— Email地址校驗器
校驗要求:指定的欄位為Email地址
引數:
- fieldName:校驗欄位名
- message:校驗失敗時的訊息
- key:校驗失敗時返回i18n中指定名稱的訊息
ExpressionValidator —— 表示式校驗器
校驗要求:指定的ONGL表示式返回true。
引數:
- expression:ONGL表示式
- message:校驗失敗時的訊息
- key:校驗失敗時返回i18n中指定名稱的訊息
UrlValidator —— URL校驗器
校驗要求:校驗指定的欄位值是否為合法的URL
引數:
- fieldName:校驗欄位名
- message:校驗失敗時的訊息
- key:校驗失敗時返回i18n中指定名稱的訊息
StringLengthFieldValidator —— 字串長度校驗器
校驗要求:字串長度在指定的範圍內
引數:
- minLength:指定最小長度,可選,沒有則不檢查最小長度
- maxLength:指定最大長度,可選,沒有則不檢查最大長度
- trim:校驗時取出字串兩邊的空格,預設為true
- fieldName:校驗欄位名
- message:校驗失敗時的訊息
- key:校驗失敗時返回i18n中指定名稱的訊息
ConversionErrorFieldValidator —— 轉換錯誤校驗器
校驗要求:校驗指定欄位是否發生型別轉換錯誤
引數:
- fieldName:校驗欄位名
- message:校驗失敗時的訊息
- key:校驗失敗時返回i18n中指定名稱的訊息
VisitorFieldValidator —— Vistor校驗器
說明:普通校驗器只能校驗基本資料型別和字串型別,該校驗器可以校驗物件裡面的屬性。
引數:
- context:用於校驗的context
- appendPrefix: 校驗發生錯誤時是否在錯誤資訊中新增前最訊息
- fieldName:校驗欄位名
- message:校驗失敗時的訊息
- key:校驗失敗時返回i18n中指定名稱的訊息
RegexFieldValidator —— 正則表示式校驗器
校驗要求:指定欄位匹配指定的正則表示式
引數:
- expression:正則表示式
- fieldName:校驗欄位名
- message:校驗失敗時的訊息
- key:校驗失敗時返回i18n中指定名稱的訊息
ConditionalVisitorFieldValidator —— 帶條件的Vistor校驗器
驗證要求:在條件不滿足時,和Vistor校驗器功能一樣,條件滿足則不執行Vistor校驗
引數:
- fieldName:校驗欄位名
- message:校驗失敗時的訊息
- key:校驗失敗時返回i18n中指定名稱的訊息
CustomValidator —— 自定義校驗器
校驗器:自定義校驗器
舉例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
|
結論:
1.Action類中使用Validations Annotation定義驗證。
2.Action中,可以在方法上、類上定義驗證Annotations,所有的驗證器都將同時作用在對映為Action的方法上。
3.Action中有多個方法被對映為Action時,類上和方法上所有定義的驗證Annotations都將作用在每個對映為Action的方法上。
4.Action中校驗失敗時,返回input邏輯檢視
5.可以使用@SkipValidation跳過所有的驗證檢查,包括自身方法定義的校驗器。
6.可以在Action對映中使用如下程式碼跳過校驗檢查
1 2 3 |
|
遺留問題修改:
上面遺留了一個問題,在xml中來做驗證時正則表示式不起作用,儲存之後突然想到在註解中用下面的程式碼來表示的
regexFields={@RegexFieldValidator(regexExpression="^[A-Za-z][A-Za-z1-9_-]+$",fieldName="user.name",message="使用者名稱(字母開頭 + 數字/字母/下劃線)")}
看著引數名和xml中配置的不一樣,會不會是引數名錯誤呢?因為我在網上查的有的用regex或expression,不過都說在提問說不起作用,我懷疑是不是引數名有問題,報著試一試的態度用regexExpression試一試,沒想到還成功了。應該將上面用xml驗證name的地方改成這樣子。
1 2 3 4 5 6 |
|
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援。