下面是我的筆記,復制上來不好看,但是我在筆記軟件上整理的很好。
struts2提供了兩種校驗方式:服務器端校驗(更重要)和客戶端校驗
也分為:validate()校驗方法、自定方法的義校驗方法、校驗框架校驗方法三種,其中校驗框架校驗方法又分為兩種:校驗器優先校驗器和字段優先校驗器.(沒有業務邏輯的校驗)
1、通過validate()校驗方法進行校驗
我們只寫錯誤的情況,正確的情況我們不做處理。
註意:struts2當輸入校驗發生錯誤的時候,struts2會默認轉到壹個name為input的這樣壹個<result>,其實就是當輸入錯誤的時候應該,用戶應該嘗試著再壹次提供輸入信息,因此轉到input頁面。
當發生錯誤時,struts2給出來各種錯誤級別的提示:
(1) action級別this.addActionError(anErrorMessage)
addActionError(放的是錯誤的提示信息),它應該是壹個集合,每次都忘這個集合中添加錯誤信息。
?頁面使用<s:actionerror/>標簽顯示錯誤信息,指如果存在action的錯誤信息,就把錯誤信息顯示出來。
?<s:actionerror/>標簽還有許多的屬性,如cssStyle="";定義錯誤信息的cssStyle,如:cssStyle="color:red";錯誤信息為紅色.
(2) 字段級別this.addFieldError(fieldName, errorMessage)
addFieldError(字段名, 錯誤提示信息),它應該是壹個Map類型,有name和errorMessage兩個參數。
頁面使用<s:fielderror cssStyle="color:blue"></s:fielderror> 標簽來顯示錯誤信息。
註意:當頁面使用的是struts2自己的標簽庫的時候,它能自動顯示field級別的錯誤信息,是struta2標簽自帶的功能。
?若不需要這樣的功能,把theme的值設為simple即可。
(3) ActionSupport類的addActionError方法的實現:首先創建壹個ArrayList對象,然後將錯誤信息添加到該對象中。
(4) 當調用getActionError()方法返回Action級別的錯誤信息列表時,返回的實際上是集合的壹個副本而不是集合本身,因此對集合副本的調用clear()方法清除的依舊是副本中懂得元素而非原集合中的元素,此時原集合中的內容沒有受到任何的影響。換句話說,Action級別的錯誤信息列別對開發者來說是只讀的。
(5) FiledError級別的錯誤信息底層是用LinkHashMap實現的,該Map的key是String類型,value是List<String>類型,這就表示壹個FieldName可以對應多條錯誤信息,這些錯誤信息都放置在List<String>集合當中。所以在頁面中壹個字段可能有多個錯誤信息。
(6) 判斷是否有Action級別或者Field級別的錯誤根據hasActionError和hasFieldError兩個方法的返回值,他們的返回值為布爾型,有錯誤返回true,沒錯誤返回false。
(7) clearActionErrors();清除所有的Action錯誤
clearFieldErrors();清除所有的Filed錯誤
clearError();相當於上面兩個方法的集合
例子:如下圖,age為int類型。birthday和graduate是Date類型
為什麽action級別中會出現age invoked!,birthday invoked!,graduate invoked!三個錯誤信息?答:因為我們輸入的都是字符串,因此在action中找不到對應的參數類型為String的setAge,setBirthday,setGraduate方法,因此就不能給這三個成員變量賦值,但是age,birthday,graduate在實例化對象時已經有默認的初始化值0,null,null,這樣的值均滿足if條件判斷。
下面的前三個field錯誤信息是因為我們輸入的字符格式錯誤,它是發生在類型轉換階段,不是發生在輸入校驗階段。
知識點:類型轉換的錯誤信息放置到field中。
2、執行流程
(1)首先進行類型轉換 (2)然後再進行輸入校驗(執行validate方法)。 (3)如果上述過程中出現任何錯誤,都不會再執行execute或自定義方法。會轉向struts.xml中對應action中name為input的<result>標簽對應的頁面。當field級別錯誤和action級別錯誤都沒有任何的錯誤才會執行execute方法。
3、自定義方法的校驗方法
(1) 對於壹個自定義的方法來說(如:上面的myExecute()),它的validate()方法在自定義方法之前被調用,即:先進行校驗,再執行自定義方法。
(2) 自定義方法的自定義輸入校驗方式(action中method所指定的自定義方法)
? public String myExecute() throws Exception{ ?return SUCCESS; ?} ?壹個自定義方法;
校驗方法的壹般格式:public void validateMyExecute(){} 方法名為validate開頭,再加上方法的名字,且方法名首字母大寫。底層通過反射來實現的。我們稱validateMyExecute()為myExecute()的輸入校驗的方法。
(3) 當Action中既有自定義方法的校驗方法也有validate方法,則先執行自定義方法的校驗方法,然後再執行validate方法,若兩個校驗方法有action或field級別錯誤,則都不會執行execute或自定義execute方法。
? 若把method中自定義方法刪掉,則不會執行自定義發的校驗方法,而validate方法是會壹定會執行的(Action中寫了這個方法),因此,validate是用來校驗execute方法的。
4、Field級別錯誤的自定義錯誤提示
在Action同級目錄下建壹個以Action名字命名的properties文件,配置文件名的格式:Action名字.properties
如:RegisterAction.properties
配置文件內容寫法格式:invalid.fieldvalue.字段名=錯誤提示信息 如:invalid.fieldvalue.age
其中字段名是Action中的屬性名,即當那個屬性發生Field錯誤時所提示的錯誤信息。
5、Struts2的校驗框架(有效的xml文件)
(1) 校驗框架xml文件和被校驗的action在同壹個包下
(2) 校驗框架xml文件命名格式:Action名字-validation.xml 如:RegisterAction-validation.xml
(3) 具體來說分為字段優先校驗器(field)與校驗器優先校驗器(validator)
6、字段優先校驗器(先有字段再有校驗器)
? xwork內置校驗器在com.opensympony.xwork2.validator.validators目錄下的default.xml文件中。
? 有以下幾中校驗器分類:
? required、requiredstring 、int、long、short、double、date、fieldexpression、expression、email
? url、visitor、conversion、stringlength、regex、conditionalvisitor
(5) Struts2的校驗框架xml文件標簽及標簽屬性分析
?① <field name=""></field> 校驗器類型,name屬性值為Action中待校驗的屬性值(成員變量)?
?如:<field name="username"></field>
?②<field-validator type=""></field-validator>校驗規則或校驗器,在<field>裏面可以有多個<field-validator>
如:<field-validator type="requiredstring"></field-validator> 指username只能為字符串,不能為空
若:type="required" ?指除了string之外的其他類型
type="stringlength" ?指字符串的長度
type="int" ? 指待檢驗的值必須為int類型
type="date" ?指定帶檢驗的值為date類型,且<param></param>標簽中的字符串值必須寫成日期的樣 式,因為<param>標簽中我們寫的是字符串的日期樣式,而在xmwork內部校驗器的對應屬 ?性是Date類型,所以這裏用到了類型轉換器。
③ <message>username</message>當發生錯誤的時候的提示信息標簽
如:<message>username can't be blank!</message>
<message>標簽屬性key ?如:<message key="username.invalid"></message>
註意:這個key變量的值是在配置文件中的,配置文件和Action在同壹包下
? 書寫格式:英文 package_en_US.properties ?中文 package_zh_CN.properties
? package.properties為默認的資源文件,當所要找的資源文件不存在時找默認的資源文件。
配置文件中的key和message中的key名字必須壹樣,若不壹樣,則會把message中的key值作為錯誤提示信息顯 示在頁面。
*. 通過修改瀏覽器顯示語言的首選項來切換瀏覽器使用什麽語言顯示頁面內容。
?④ <param name=""></param> <param name=""></param> ?是<field-validator>子標簽,可選.
param中的屬性名都必須和源代碼對應的類中的屬性名壹致,這樣才能正確賦值。
如:<param name="minLength">4</param>設置字符串最大長度?
<param name="maxLength">6</param>設置字符串最小長度
<param name="trim">false</param> 設置是否去掉字符串兩邊的空格
? 拿minLength和maxLength的引用:
? ${minLength}取得是minLength的值,${maxLength}${minLength}取得是maxLength的值?
? 如:<message>username should be between ${minLength} and ${maxLength}!</message>?
7、校驗器優先校驗器(先有校驗器再有字段)
?<validator type="requiredstring"> ?-->這是壹個校驗器
?<param name="fieldName">username</param> -->定義待校驗的字段名,這裏的name值是固定為fieldName
?</validator>
校驗器優先校驗器和字段優先校驗器可以混合使用.
struts2輸入校驗總結:struts2框架校驗執行的先後順序:
? 1) 首先進行類型轉換(只有類型轉換好後才能進行校驗)
? 2) 首先執行校驗框架的校驗方法(xml文件)
? 3) 執行自定義方法的校驗方法
? 4) 執行validate()校驗方法
? 當validate()方法執行完以後,struts2框架才會檢查Field級別或者Action級別有沒有任何的錯誤消息,當出現任何壹條錯誤消息的時候,struts2都不會執行自定義的execute方法和execute()方法,進而轉向struts.xml中<result>標簽中name為input所對應的頁面。?
推薦使用validate()校驗方法。 ?