要自定義攔截器須要實現com.opensymphony.xwork2.interceptor.Interceptor接口:html
由於struts2中如文件上傳,數據驗證,封裝請求參數到action等功能都是由系統默認的defaultStack中的攔截器實現的,因此咱們定義的攔截器須要引用系統默認的defaultStack,這樣應用才能夠使用struts2框架提供的衆多功能。
若是但願包下的全部action都使用自定義的攔截器,能夠經過<default-interceptor-ref name=「permissionStack」/>把攔截器定義爲默認攔截器。注意:每一個包只能指定一個默認攔截器。另外,一旦咱們爲該包中的某個action顯式指定了某個攔截器,則默認攔截器不會起做用。java
在struts2中,咱們能夠實現對action的全部方法進行校驗或者對action的指定方法進行校驗。正則表達式
對於輸入校驗struts2提供了兩種實現方法:
1. 採用手工編寫代碼實現。
2. 基於XML配置方式實現。
express
經過重寫validate() 方法實現, validate()方法會校驗action中全部與execute方法簽名相同的方法。當某個數據校驗失敗時,咱們應該調用addFieldError()方法往系統的fieldErrors添加校驗失敗信息(爲了使用addFieldError()方法,action能夠繼承ActionSupport ),若是系統的fieldErrors包含失敗信息,struts2會將請求轉發到名爲input的result。在input視圖中能夠經過<s:fielderror/>顯示失敗信息。
validate()使用例子:
session
另外一個:框架
驗證失敗後,請求轉發至input視圖:
<result name="input">/WEB-INF/page/addUser.jsp</result>jsp
在addUser.jsp頁面中使用<s:fielderror/>顯示失敗信息。
ui
經過validateXxx()方法實現, validateXxx()只會校驗action中方法名爲Xxx的方法。其中Xxx的第一個字母要大寫。當某個數據校驗失敗時,咱們應該調用addFieldError()方法往系統的fieldErrors添加校驗失敗信息(爲了使用addFieldError()方法,action能夠繼承ActionSupport ),若是系統的fieldErrors包含失敗信息,struts2會將請求轉發到名爲input的result。在input視圖中能夠經過<s:fielderror/>顯示失敗信息。this
validateXxx()方法使用例子:
url
驗證失敗後,請求轉發至input視圖:
<result name="input">/WEB-INF/page/addUser.jsp</result>
在addUser.jsp頁面中使用<s:fielderror/>顯示失敗信息。
一、類型轉換器對請求參數執行類型轉換,並把轉換後的值賦給action中的屬性。
二、若是在執行類型轉換的過程當中出現異常,系統會將異常信息保存到ActionContext,conversionError攔截器將異常信息添加到fieldErrors裏。無論類型轉換是否出現異常,都會進入第3步。
三、系統經過反射技術先調用action中的validateXxx()方法,Xxx爲方法名。
四、再調用action中的validate()方法。
五、通過上面4步,若是系統中的fieldErrors存在錯誤信息(即存放錯誤信息的集合的size大於0),系統自動將請求轉發至名稱爲input的視圖。若是系統中的fieldErrors沒有任何錯誤信息,系統將執行action中的處理方法。
使用基於XML配置方式實現輸入校驗時,Action也須要繼承ActionSupport,而且提供校驗文件,校驗文件和action類放在同一個包下,文件的取名格式爲:ActionClassName-validation.xml,其中ActionClassName爲action的簡單類名,-validation爲固定寫法。若是Action類爲cn.csdn.UserAction,那麼該文件的取名應爲:UserAction-validation.xml。下面是校驗文件的模版:
<field>指定action中要校驗的屬性,<field-validator>指定校驗器,上面指定的校驗器requiredstring是由系統提供的,系統提供了能知足大部分驗證需求的校驗器,這些校驗器的定義能夠在xwork-2.x.jar中的com.opensymphony.xwork2.validator.validators下的default.xml中找到。
<message>爲校驗失敗後的提示信息,若是須要國際化,能夠爲message指定key屬性,key的值爲資源文件中的key。
在這個校驗文件中,對action中字符串類型的username屬性進行驗證,首先要求調用trim()方法去掉空格,而後判斷用戶名是否爲空。
系統提供的校驗器以下:
required (必填校驗器,要求field的值不能爲null)
requiredstring (必填字符串校驗器,要求field的值不能爲null,而且長度大於0,默認狀況下會對字符串去先後空格)
stringlength(字符串長度校驗器,要求field的值必須在指定的範圍內,不然校驗失敗,minLength參數指定最小長度,maxLength參數指定最大長度,trim參數指定校驗field以前是否去除字符串先後的空格)
regex(正則表達式校驗器,檢查被校驗的field是否匹配一個正則表達式.expression參數指定正則表達式,caseSensitive參數指定進行正則表達式匹配時,是否區分大小寫,默認值爲true)
int(整數校驗器,要求field的整數值必須在指定範圍內,min指定最小值,max指定最大值)
double(雙精度浮點數校驗器,要求field的雙精度浮點數必須在指定範圍內,min指定最小值,max指定最大值)
fieldexpression(字段OGNL表達式校驗器,要求field知足一個ognl表達式,expression參數指定ognl表達式,該邏輯表達式基於ValueStack進行求值,返回true時校驗經過,不然不經過)
email(郵件地址校驗器,要求若是field的值非空,則必須是合法的郵件地址)
url(網址校驗器,要求若是field的值非空,則必須是合法的url地址)
date(日期校驗器,要求field的日期值必須在指定範圍內,min指定最小值,max指定最大值)
conversion(轉換校驗器,指定在類型轉換失敗時,提示的錯誤信息)
visitor(用於校驗action中的複合屬性,它指定一個校驗文件用於校驗複合屬性中的屬性)
expression(OGNL表達式校驗器,expression參數指定ognl表達式,該邏輯表達式基於ValueStack進行求值,返回true時校驗經過,不然不經過,該校驗器不可用在字段校驗器風格的配置中)
當校驗文件的取名爲ActionClassName-validation.xml時,會對 action中的全部處理方法實施輸入驗證。若是你只須要對action中的某個action方法實施校驗,那麼,校驗文件的取名應爲:ActionClassName-ActionName-validation.xml,其中ActionName爲struts.xml中action的名稱。例如:在實際應用中,常有如下配置:
<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中有如下兩個處理方法:
public String add() throws Exception{
....
}
public String update() throws Exception{
....
}
要對add()方法實施驗證,校驗文件的取名爲: UserAction-user_add-validation.xml
要對update()方法實施驗證,校驗文件的取名爲: UserAction-user_update-validation.xml
當爲某個action提供了ActionClassName-validation.xml和ActionClassName-ActionName-validation.xml兩種規則的校驗文件時,系統按下面順序尋找校驗文件:
1。AconClassName-validation.xml
2。ActionClassName-ActionName-validation.xml
系統尋找到第一個校驗文件時還會繼續搜索後面的校驗文件,當搜索到全部校驗文件時,會把校驗文件裏的全部校驗規則彙總,而後所有應用於action方法的校驗。若是兩個校驗文件中指定的校驗規則衝突,則只使用後面文件中的校驗規則。
當action繼承了另外一個action,父類action的校驗文件會先被搜索到。
假設UserAction繼承BaseAction:
<action name="user" class="cn.csdn.action.UserAction" method="{1}">
</action>
訪問上面action,系統先搜索父類的校驗文件:BaseAction-validation.xml, BaseAction-user-validation.xml,接着搜索子類的校驗文件: UserAction-validation.xml, UserAction-user-validation.xml。應用於上面action的校驗規則爲這四個文件的總和。