當校驗邏輯不是十分複雜時,能夠用xml進行校驗;邏輯十分複雜是,能夠經過validate()進行校驗
分類:
【字段校驗】
---- field-validator
---- 字段優先,我去校驗誰(字段),我用誰(校驗器)來校驗
---- field-validator
---- 字段優先,我去校驗誰(字段),我用誰(校驗器)來校驗
【非字段校驗】
---- validator
---- 校驗器優先,我用誰(校驗器)來校驗,我去校驗誰(字段)
---- validator
---- 校驗器優先,我用誰(校驗器)來校驗,我去校驗誰(字段)
****** 這兩種只是
表現形式 不一樣,底層是相同的,都是把錯誤信息放到fielderror中
命名:須要校驗的Action名 +
-validation.xml
位置:要和須要校驗的Action放在同一目錄下
位置:要和須要校驗的Action放在同一目錄下
### 只對action中的某個方法進行校驗
-1-
須要校驗的Action名 + -方法名 + -validation.xml
|
對應xml中<action>的屬性的name值
須要校驗的Action名 + -方法名 + -validation.xml
|
對應xml中<action>的屬性的name值
如: RegisterAction-add-validation.xml
--對應 /add.action --對RegisterAction中的add()方法進行校驗
-2-
在不須要進行驗證的方法加上annotation,即在方法前加上
@SkipValidation。
-3-
<action name=...>
<interceptor-ref name="defaultStack">
<param name="validation.excludeMethods">*</param>
<param name="validation.includeMethods">須要驗證的方法名稱,以逗號分隔</param>
</interceptor-ref>
</action>
<interceptor-ref name="defaultStack">
<param name="validation.excludeMethods">*</param>
<param name="validation.includeMethods">須要驗證的方法名稱,以逗號分隔</param>
</interceptor-ref>
</action>
### 校驗順序
若是 既提供了RegisterAction-validation.xml,又提供了RegisterAction-add-validation.xml
Struts2會先校驗RegisterAction-validation.xml,而後再去校驗RegisterAction-add-validation.xml
這兩個都會被調用
### 建議:
當有多個邏輯方法時,就不要提供RegisterAction-validation.xml
只提供相應方法的xml文件,如:RegisterAction-execute-validation.xml
==============
== 字段校驗 ==
==============
== 字段校驗 ==
==============
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-
validator-1.0.2.dtd">
<validators>
至少提供一個 field 或 validate
name必須提供
1個 field 表示對一個屬性的一次校驗
<field name="username">
至少提供一個 field 或 validate
name必須提供
1個 field 表示對一個屬性的一次校驗
<field name="username">
<field>中至少有一個或多個<field-validator>
1個<field-validator>表示對它校驗的一種方式
type類型必須提供 類型=requiredstring 表示username必填
驗類型來自於 xwork-2.0.4.jar/com/opensymphony/xwork2/validator/validators/deault.xml
short-circuit:表示短路,默認false若設爲true,表示:這個驗證器失敗了,就再也不執行後面的驗證器了
1個<field-validator>表示對它校驗的一種方式
type類型必須提供 類型=requiredstring 表示username必填
驗類型來自於 xwork-2.0.4.jar/com/opensymphony/xwork2/validator/validators/deault.xml
short-circuit:表示短路,默認false若設爲true,表示:這個驗證器失敗了,就再也不執行後面的驗證器了
<field-validator type="requiredstring" short-circuit="true">
<field-validator>中有若干個(0 ~ N)<param>子元素 和 一個<message>子元素
這裏的trim對應到requiredstring對應類RequiredStringValidator中的setTrim(boolean trim)方法設置的屬性doTrim
requiredstring這種校驗類型,doTrim默認設爲true,因此這裏寫與不寫trim設爲true都是同樣的
這裏的trim對應到requiredstring對應類RequiredStringValidator中的setTrim(boolean trim)方法設置的屬性doTrim
requiredstring這種校驗類型,doTrim默認設爲true,因此這裏寫與不寫trim設爲true都是同樣的
<param name="trim">true</param>
<message>用戶名不能爲空!</message>
</field-validator>
<message>用戶名不能爲空!</message>
</field-validator>
驗證字符串長度
<field-validator type="stringlength">
<param name="minLength">6</param> 最小長度,默認-1
<param name="maxLength">10</param> 最大長度,默認-1
<message>用戶名應該在 ${minLength} 和 ${maxLength} 之間</message>
也能夠用國際化的方式:<message key="error.password.required"/>
<field-validator type="stringlength">
<param name="minLength">6</param> 最小長度,默認-1
<param name="maxLength">10</param> 最大長度,默認-1
<message>用戶名應該在 ${minLength} 和 ${maxLength} 之間</message>
也能夠用國際化的方式:<message key="error.password.required"/>
</field-validator>
</field>
@@@ 驗證必填&字符串長度 @@@@@@@@@@@@@@@@@@@@@@@
<field name="password">
<field-validator type=" requiredstring">
<message>密碼不能爲空</message>
</field-validator>
<field-validator type=" stringlength">
<param name=" minLength">6</param>
<param name=" maxLength">10</param>
<message>密碼應該在 ${minLength} 和 ${maxLength} 之間</message>
</field-validator>
</field>
<field-validator type=" requiredstring">
<message>密碼不能爲空</message>
</field-validator>
<field-validator type=" stringlength">
<param name=" minLength">6</param>
<param name=" maxLength">10</param>
<message>密碼應該在 ${minLength} 和 ${maxLength} 之間</message>
</field-validator>
</field>
@@@ 驗證數字 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
<field name="age">
<field-validator type="required">
<message>年齡不能爲空</message>
</field-validator>
<field-validator type=" int">
<param name=" min">1</param>
<param name=" max">150</param>
<message>年齡應該在 ${min} 和 ${max} 之間</message>
</field-validator>
</field>
<field-validator type="required">
<message>年齡不能爲空</message>
</field-validator>
<field-validator type=" int">
<param name=" min">1</param>
<param name=" max">150</param>
<message>年齡應該在 ${min} 和 ${max} 之間</message>
</field-validator>
</field>
@@@ 驗證日期 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
<field name="birthday"> 類型爲requiredString用於校驗String類型必填
<field-validator type=" required"> 類型爲required用於驗證String之外的類型必填
<message>生日不能爲空</message>
</field-validator>
<field-validator type=" date">
<param name=" min">2001-01-01</param>
<param name=" max">2008-08-08</param>
<message>生日應該在 ${min} 和 ${max} 之間</message>
</field-validator>
</field>
</validators>
<field-validator type=" required"> 類型爲required用於驗證String之外的類型必填
<message>生日不能爲空</message>
</field-validator>
<field-validator type=" date">
<param name=" min">2001-01-01</param>
<param name=" max">2008-08-08</param>
<message>生日應該在 ${min} 和 ${max} 之間</message>
</field-validator>
</field>
</validators>
========================================
default.xml中提供的校驗類型:
========================================
required 用於檢查值是否爲null
requiredstring 用於檢查string是否爲null或空, 參數trim,可在驗證前對字符串執行trim操做
stringlength 檢查string的長度是否在某個範圍, 參數trim,minLength,maxLength
int/double 檢查某值是否爲int/double且在某個範圍,參數min,max;minInclusive,maxInclusive,minExclusive,maxExclusive
date 檢查date的範圍, 參數min,max
email 檢查輸入是否爲email格式
url 檢查輸入是否爲url格式
conversion 檢查是否將出現數據轉換錯誤
expression/fieldexpression 檢查某個布爾表達式的值是否爲true,後者綁定到某個字段上
參數expression
參數expression
visitor 使用預約義的validators進行驗證,參數context
regex 檢查是否能匹配到正則表達式, 參數regex
@@@@@@@@@@@@@@
正則表達式驗證:
@@@@@@@@@@@@@@
<field name="bar2">
<field-validator type="regex">
<param name="regex">[0-9],[0-9]</param>
<message>
bar2的值必須是"x, y"這樣的格式 而且x、y都在0 ~ 9的範圍內
</message>
</field-validator>
<field-validator type="regex">
<param name="regex">[0-9],[0-9]</param>
<message>
bar2的值必須是"x, y"這樣的格式 而且x、y都在0 ~ 9的範圍內
</message>
</field-validator>
@@@@@@@@@
URL
@@@@@@@@@
<field name="url">
<field-validator type="required" short-circuit="true">
<message>你須要輸入一個URL。</message>
</field-validator>
<field-validator type="url" short-circuit="true">
<message>URL錯誤。</message>
</field-validator>
</field>
URL
@@@@@@@@@
<field name="url">
<field-validator type="required" short-circuit="true">
<message>你須要輸入一個URL。</message>
</field-validator>
<field-validator type="url" short-circuit="true">
<message>URL錯誤。</message>
</field-validator>
</field>
@@@@@@@@@@@@
EMail
@@@@@@@@@@@@
<field name="mail">
<field-validator type="required">
<message>你須要輸入一個電子郵件的地址。</message>
</field-validator>
<field-validator type="email">
<message>非法的email格式。</message>
</field-validator>
</field>
@@@@@@@@@@@@
<field name="mail">
<field-validator type="required">
<message>你須要輸入一個電子郵件的地址。</message>
</field-validator>
<field-validator type="email">
<message>非法的email格式。</message>
</field-validator>
</field>
@@@@@@@@@@@@
表達式
@@@@@@@@@@@@
<validator type="expression">
<param name="expression">name.equals(desc)</param>
<message>name not the same as desc</message>
</validator>
OR
<validator type="expression>
<param name="expression">foo gt bar</param>
<message>foo必須大於bar.</message>
</validator>
OR
<validator type="expression">
<param name="expression">email.equals(email2)</param>
<message>Email不等於email2</message>
</validator>
OR
<validator type="expression" short-circuit="true">
<param name="expression">email.startsWith('mark')</param>
<message>Email沒有以mark開始。</message>
</validator>
表達式
@@@@@@@@@@@@
<validator type="expression">
<param name="expression">name.equals(desc)</param>
<message>name not the same as desc</message>
</validator>
OR
<validator type="expression>
<param name="expression">foo gt bar</param>
<message>foo必須大於bar.</message>
</validator>
OR
<validator type="expression">
<param name="expression">email.equals(email2)</param>
<message>Email不等於email2</message>
</validator>
OR
<validator type="expression" short-circuit="true">
<param name="expression">email.startsWith('mark')</param>
<message>Email沒有以mark開始。</message>
</validator>
================
== 非字段校驗 ==
================
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-
validator-1.0.2.dtd">
<validators>
<validate type="requiredstring"> 用誰來校驗
<validate type="requiredstring"> 用誰來校驗
去校驗誰
validate中的第一個param的name屬性永遠都是固定的fieldName,對應與要去校驗的字段名
validate中的第一個param的name屬性永遠都是固定的fieldName,對應與要去校驗的字段名
<param name="fieldName">username</param>
<message>用戶名爲必填</message>
<message>用戶名爲必填</message>
解釋:用requiredstring校驗器去校驗username字段,若是出錯,顯示<message>中的信息
</validate>
<validate type="stringlength">
<param name="fieldName">username</param>
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>用戶名必須在 ${minLength} 和 ${maxLength} 之間</message>
</validate>
<param name="fieldName">username</param>
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>用戶名必須在 ${minLength} 和 ${maxLength} 之間</message>
</validate>
=====================================
客戶端校驗--功能弱,死板(不建議使用)
=====================================
1.
Struts2的<s:form>的theme必定不能設置爲simple
2.
將<s:form>的validte屬性設置爲true
將<s:form>的validte屬性設置爲true
3.
Struts2的客戶端校驗是基於***-validation.xml中的設置生成js代碼
Struts2的客戶端校驗是基於***-validation.xml中的設置生成js代碼
==========================
自定義客戶端校驗
==========================
<s:form action="register" theme="simple" onsubmit="return validate();">
js:
function validate() {
//document.getElementByName("username")[0] 返回一個全部名爲username的數組
//var usernameValue = document.getElementByName("username")[0].value
//document.getElementByName("username")[0] 返回一個全部名爲username的數組
//var usernameValue = document.getElementByName("username")[0].value
var usernameValue = document.getElementByID("username").value;
if( usernameValue.length == 0 ) {
alert("Username should not be blank!");
return false;
}
...
}
if( usernameValue.length == 0 ) {
alert("Username should not be blank!");
return false;
}
...
}
========
= 補充 =
========
1.
集合裏面存放的並非對象,而是對象的引用
如:
List list = new ArrayList();
Map map = new LinkedHashMap()'
map.put("1", list); //存放的是映射
list.add("string1");
list.add("string2");
list.add("string3");
List list = new ArrayList();
Map map = new LinkedHashMap()'
map.put("1", list); //存放的是映射
list.add("string1");
list.add("string2");
list.add("string3");
2.
若是既有xml校驗,又有validate()校驗
將先校驗xml,而後進行validate()校驗
而後將全部的錯誤添加進fielderror
3.
真正存放field級別錯誤信息的對象是LinkedHashMap
該LinkedHashMap的key是String類型的,value是ArrayList類型的
對於Action級別的錯誤信息,其實是放置在ArrayList中的
4. 不能經過 this.getFieldError().put("...","...");的方法,添加fielderror 由於getFieldError()返回的是一個fieldErrorMap的副本。