在struts2中,我們可以實(shí)現對action的所有方法進(jìn)行校驗或者對action的指定方法進(jìn)行校驗。
對于輸入校驗struts2提供了兩種實(shí)現方法:
1. 采用手工編寫(xiě)代碼實(shí)現。
2. 基于XML配置方式實(shí)現。
通過(guò)重寫(xiě)validate() 方法實(shí)現, validate()方法會(huì )校驗action中所有與execute方法簽名相同的方法。當某個(gè)數據校驗失敗時(shí),我們應該調用addFieldError()方法往系統的fieldErrors添加校驗失敗信息(為了使用addFieldError()方法,action可以繼承ActionSupport ),如果系統的fieldErrors包含失敗信息,struts2會(huì )將請求轉發(fā)到名為input的result。在input視圖中可以通過(guò)<s:fielderror/>顯示失敗信息。
validate()使用例子:
另一個(gè):
驗證失敗后,請求轉發(fā)至input視圖:
<result name="input">/WEB-INF/page/addUser.jsp</result>
在addUser.jsp頁(yè)面中使用<s:fielderror/>顯示失敗信息。
通過(guò)validateXxx()方法實(shí)現, validateXxx()只會(huì )校驗action中方法名為Xxx的方法。其中Xxx的第一個(gè)字母要大寫(xiě)。當某個(gè)數據校驗失敗時(shí),我們應該調用addFieldError()方法往系統的fieldErrors添加校驗失敗信息(為了使用addFieldError()方法,action可以繼承ActionSupport ),如果系統的fieldErrors包含失敗信息,struts2會(huì )將請求轉發(fā)到名為input的result。在input視圖中可以通過(guò)<s:fielderror/>顯示失敗信息。
validateXxx()方法使用例子:
驗證失敗后,請求轉發(fā)至input視圖:
<result name="input">/WEB-INF/page/addUser.jsp</result>
在addUser.jsp頁(yè)面中使用<s:fielderror/>顯示失敗信息。
1、類(lèi)型轉換器對請求參數執行類(lèi)型轉換,并把轉換后的值賦給action中的屬性。
2、如果在執行類(lèi)型轉換的過(guò)程中出現異常,系統會(huì )將異常信息保存到ActionContext,conversionError攔截器將異常信息添加到fieldErrors里。不管類(lèi)型轉換是否出現異常,都會(huì )進(jìn)入第3步。
3、系統通過(guò)反射技術(shù)先調用action中的validateXxx()方法,Xxx為方法名。
4、再調用action中的validate()方法。
5、經(jīng)過(guò)上面4步,如果系統中的fieldErrors存在錯誤信息(即存放錯誤信息的集合的size大于0),系統自動(dòng)將請求轉發(fā)至名稱(chēng)為input的視圖。如果系統中的fieldErrors沒(méi)有任何錯誤信息,系統將執行action中的處理方法。
使用基于XML配置方式實(shí)現輸入校驗時(shí),Action也需要繼承ActionSupport,并且提供校驗文件,校驗文件和action類(lèi)放在同一個(gè)包下,文件的取名格式為:ActionClassName-validation.xml,其中ActionClassName為action的簡(jiǎn)單類(lèi)名,-validation為固定寫(xiě)法。如果Action類(lèi)為cn.csdn.UserAction,那么該文件的取名應為:UserAction-validation.xml。下面是校驗文件的模版:
<field>指定action中要校驗的屬性,<field-validator>指定校驗器,上面指定的校驗器requiredstring是由系統提供的,系統提供了能滿(mǎn)足大部分驗證需求的校驗器,這些校驗器的定義可以在xwork-2.x.jar中的com.opensymphony.xwork2.validator.validators下的default.xml中找到。
<message>為校驗失敗后的提示信息,如果需要國際化,可以為message指定key屬性,key的值為資源文件中的key。
在這個(gè)校驗文件中,對action中字符串類(lèi)型的username屬性進(jìn)行驗證,首先要求調用trim()方法去掉空格,然后判斷用戶(hù)名是否為空。
系統提供的校驗器如下:
required (必填校驗器,要求field的值不能為null)
requiredstring (必填字符串校驗器,要求field的值不能為null,并且長(cháng)度大于0,默認情況下會(huì )對字符串去前后空格)
stringlength(字符串長(cháng)度校驗器,要求field的值必須在指定的范圍內,否則校驗失敗,minLength參數指定最小長(cháng)度,maxLength參數指定最大長(cháng)度,trim參數指定校驗field之前是否去除字符串前后的空格)
regex(正則表達式校驗器,檢查被校驗的field是否匹配一個(gè)正則表達式.expression參數指定正則表達式,caseSensitive參數指定進(jìn)行正則表達式匹配時(shí),是否區分大小寫(xiě),默認值為true)
int(整數校驗器,要求field的整數值必須在指定范圍內,min指定最小值,max指定最大值)
double(雙精度浮點(diǎn)數校驗器,要求field的雙精度浮點(diǎn)數必須在指定范圍內,min指定最小值,max指定最大值)
fieldexpression(字段OGNL表達式校驗器,要求field滿(mǎn)足一個(gè)ognl表達式,expression參數指定ognl表達式,該邏輯表達式基于ValueStack進(jìn)行求值,返回true時(shí)校驗通過(guò),否則不通過(guò))
email(郵件地址校驗器,要求如果field的值非空,則必須是合法的郵件地址)
url(網(wǎng)址校驗器,要求如果field的值非空,則必須是合法的url地址)
date(日期校驗器,要求field的日期值必須在指定范圍內,min指定最小值,max指定最大值)
conversion(轉換校驗器,指定在類(lèi)型轉換失敗時(shí),提示的錯誤信息)
visitor(用于校驗action中的復合屬性,它指定一個(gè)校驗文件用于校驗復合屬性中的屬性)
expression(OGNL表達式校驗器,expression參數指定ognl表達式,該邏輯表達式基于ValueStack進(jìn)行求值,返回true時(shí)校驗通過(guò),否則不通過(guò),該校驗器不可用在字段校驗器風(fēng)格的配置中)
當校驗文件的取名為ActionClassName-validation.xml時(shí),會(huì )對 action中的所有處理方法實(shí)施輸入驗證。如果你只需要對action中的某個(gè)action方法實(shí)施校驗,那么,校驗文件的取名應為:ActionClassName-ActionName-validation.xml,其中ActionName為struts.xml中action的名稱(chēng)。例如:在實(shí)際應用中,常有以下配置:
<action name="user_*" class="cn.csdn.action.UserAction" method="{1}“ >
<result name="success">/WEB-INF/page/message.jsp</result>
<result name="input">/WEB-INF/page/addUser.jsp</result>
</action>
UserAction中有以下兩個(gè)處理方法:
public String add() throws Exception{
....
}
public String update() throws Exception{
....
}
要對add()方法實(shí)施驗證,校驗文件的取名為: UserAction-user_add-validation.xml
要對update()方法實(shí)施驗證,校驗文件的取名為: UserAction-user_update-validation.xml
當為某個(gè)action提供了ActionClassName-validation.xml和ActionClassName-ActionName-validation.xml兩種規則的校驗文件時(shí),系統按下面順序尋找校驗文件:
1。AconClassName-validation.xml
2。ActionClassName-ActionName-validation.xml
系統尋找到第一個(gè)校驗文件時(shí)還會(huì )繼續搜索后面的校驗文件,當搜索到所有校驗文件時(shí),會(huì )把校驗文件里的所有校驗規則匯總,然后全部應用于action方法的校驗。如果兩個(gè)校驗文件中指定的校驗規則沖突,則只使用后面文件中的校驗規則。
當action繼承了另一個(gè)action,父類(lèi)action的校驗文件會(huì )先被搜索到。
假設UserAction繼承BaseAction:
<action name="user" class="cn.csdn.action.UserAction" method="{1}">
</action>
訪(fǎng)問(wèn)上面action,系統先搜索父類(lèi)的校驗文件:BaseAction-validation.xml, BaseAction-user-validation.xml,接著(zhù)搜索子類(lèi)的校驗文件: UserAction-validation.xml, UserAction-user-validation.xml。應用于上面action的校驗規則為這四個(gè)文件的總和。
聯(lián)系客服