struts2 validate驗證

轉自:https://blog.csdn.net/houpengfei111/article/details/9038233

自定義攔截器

要自定義攔截器須要實現com.opensymphony.xwork2.interceptor.Interceptor接口:html

  1. public class PermissionInterceptor implements Interceptor {  
  2.    private static final long serialVersionUID = -5178310397732210602L;  
  3.    public void destroy() {  
  4.    }  
  5.    public void init() {  
  6.    }  
  7.    public String intercept(ActionInvocation invocation) throws Exception {  
  8.     System.out.println("進入攔截器");      
  9.     if(session裏存在用戶){  
  10.         String result = invocation.invoke();  
  11.     }else{  
  12.         return 「logon」;  
  13.     }  
  14.     //System.out.println("返回值:"+ result);  
  15.     //return result;  
  16.     }  
  17. }  


 

  1. <package name="csdn" namespace="/test" extends="struts-default">  
  2.  <interceptors>  
  3.            <interceptor name=「permission" class="cn.csdn.aop.PermissionInterceptor" />  
  4.            <interceptor-stack name="permissionStack">  
  5.     <interceptor-ref name="defaultStack" />  
  6.    <interceptor-ref name=" permission " />  
  7.             </interceptor-stack>  
  8.   </interceptors>  
  9.  <action name="helloworld_*" class="cn.csdn.action.HelloWorldAction" method="{1}">  
  10.   <result name="success">/WEB-INF/page/hello.jsp</result>  
  11.   <interceptor-ref name="permissionStack"/>  
  12.  </action>  
  13. </package>  


由於struts2中如文件上傳,數據驗證,封裝請求參數到action等功能都是由系統默認的defaultStack中的攔截器實現的,因此咱們定義的攔截器須要引用系統默認的defaultStack,這樣應用才能夠使用struts2框架提供的衆多功能。
若是但願包下的全部action都使用自定義的攔截器,能夠經過<default-interceptor-ref name=「permissionStack」/>把攔截器定義爲默認攔截器。注意:每一個包只能指定一個默認攔截器。另外,一旦咱們爲該包中的某個action顯式指定了某個攔截器,則默認攔截器不會起做用。java

輸入校驗  

在struts2中,咱們能夠實現對action的全部方法進行校驗或者對action的指定方法進行校驗。正則表達式

對於輸入校驗struts2提供了兩種實現方法:
1. 採用手工編寫代碼實現。
2. 基於XML配置方式實現。
express

手工編寫代碼實現對action中全部方法輸入校驗

經過重寫validate() 方法實現, validate()方法會校驗action中全部與execute方法簽名相同的方法。當某個數據校驗失敗時,咱們應該調用addFieldError()方法往系統的fieldErrors添加校驗失敗信息(爲了使用addFieldError()方法,action能夠繼承ActionSupport ),若是系統的fieldErrors包含失敗信息,struts2會將請求轉發到名爲input的result。在input視圖中能夠經過<s:fielderror/>顯示失敗信息。
validate()使用例子:
session

  1. public void validate() {  
  2.        if(this.mobile==null || "".equals(this.mobile.trim())){  this.addFieldError("username", "手機號不能爲空");  
  3.         }else{  if(!Pattern.compile("^1[358]\\d{9}").matcher(this.mobile.trim()).matches()){  
  4.         this.addFieldError(「mobile", "手機號的格式不正確"); }  
  5.        }  
  6. }  


另外一個:框架

  1. public void validate() {  
  2.         List<String> args =  new ArrayList<String>();  
  3.         args.add("chrp");  
  4.         args.add("紅豆");  
  5.           
  6.         System.out.println(getText("wel",args));  
  7.         System.out.println(getText("wel", new String[]{"deep","朋友網!"}));  
  8.         System.out.println(getText("nameerror"));  
  9.         if ("".equals(name) || this.name == null) {  
  10.             addFieldError("name", getText("nameerror"));  
  11.         }  
  12.     }  


 

驗證失敗後,請求轉發至input視圖:
<result name="input">/WEB-INF/page/addUser.jsp</result>jsp

在addUser.jsp頁面中使用<s:fielderror/>顯示失敗信息。
ui

手工編寫代碼實現對action指定方法輸入校驗

經過validateXxx()方法實現, validateXxx()只會校驗action中方法名爲Xxx的方法。其中Xxx的第一個字母要大寫。當某個數據校驗失敗時,咱們應該調用addFieldError()方法往系統的fieldErrors添加校驗失敗信息(爲了使用addFieldError()方法,action能夠繼承ActionSupport ),若是系統的fieldErrors包含失敗信息,struts2會將請求轉發到名爲input的result。在input視圖中能夠經過<s:fielderror/>顯示失敗信息。this

validateXxx()方法使用例子:
url

  1. public String add() throws Exception{  return "success";}   
  2. public void validateAdd(){  
  3.           if(username==null && "".equals(username.trim()))  this.addFieldError("username", "用戶名不能爲空");  
  4. }  


 

驗證失敗後,請求轉發至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的全部方法進行輸入校驗

使用基於XML配置方式實現輸入校驗時,Action也須要繼承ActionSupport,而且提供校驗文件,校驗文件和action類放在同一個包下,文件的取名格式爲:ActionClassName-validation.xml,其中ActionClassName爲action的簡單類名,-validation爲固定寫法。若是Action類爲cn.csdn.UserAction,那麼該文件的取名應爲:UserAction-validation.xml。下面是校驗文件的模版:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">   
  3. <validators>  
  4.     <field name="username">  
  5.         <field-validator type="requiredstring">  
  6.             <param name="trim">true</param>  
  7.             <message>用戶名不能爲空!</message>  
  8.         </field-validator>  
  9.     </field>  
  10. </validators>  


<field>指定action中要校驗的屬性,<field-validator>指定校驗器,上面指定的校驗器requiredstring是由系統提供的,系統提供了能知足大部分驗證需求的校驗器,這些校驗器的定義能夠在xwork-2.x.jar中的com.opensymphony.xwork2.validator.validators下的default.xml中找到。
<message>爲校驗失敗後的提示信息,若是須要國際化,能夠爲message指定key屬性,key的值爲資源文件中的key。
在這個校驗文件中,對action中字符串類型的username屬性進行驗證,首先要求調用trim()方法去掉空格,而後判斷用戶名是否爲空。

struts2提供的校驗器列表

系統提供的校驗器以下:
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時校驗經過,不然不經過,該校驗器不可用在字段校驗器風格的配置中)

校驗器的使用例子

  1. required  必填校驗器  
  2. <field-validator type="required">  
  3.        <message>性別不能爲空!</message>  
  4. </field-validator>  
  5.   
  6. requiredstring  必填字符串校驗器  
  7. <field-validator type="requiredstring">  
  8.        <param name="trim">true</param>  
  9.        <message>用戶名不能爲空!</message>  
  10. </field-validator>  
  11.   
  12. stringlength:字符串長度校驗器  
  13. <field-validator type="stringlength">  
  14.  <param name="maxLength">10</param>  
  15.  <param name="minLength">2</param>  
  16.  <param name="trim">true</param>  
  17.  <message><![CDATA[產品名稱應在2-10個字符之間]]></message>  
  18. </field-validator>  


 

  1. email:郵件地址校驗器  
  2. <field-validator type="email">  
  3.     <message>電子郵件地址無效</message>  
  4. </field-validator>  
  5.   
  6. regex:正則表達式校驗器  
  7. <field-validator type="regex">  
  8.      <param name="expression"><![CDATA[^1[358]\d{9}$]]></param>  
  9.      <message>手機號格式不正確!</message>  
  10. </field-validator>  


 

  1. int:整數校驗器  
  2. <field-validator type="int">  
  3.     <param name="min">1</param>  
  4.     <param name="max">150</param>  
  5.     <message>年齡必須在1-150之間</message>  
  6. </field-validator>  
  7.   
  8. 字段OGNL表達式校驗器  
  9. <field name="imagefile">  
  10.     <field-validator type="fieldexpression">  
  11.         <param name="expression"><![CDATA[imagefile.length() <= 0]]></param>  
  12.         <message>文件不能爲空</message>  
  13.     </field-validator>  
  14. </field>  


基於XML配置方式對指定action方法實現輸入校驗

當校驗文件的取名爲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

基於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的校驗規則爲這四個文件的總和。

相關文章
相關標籤/搜索