天天看點

struts2學習筆記之校驗器

struts校驗主要是用于表單輸入的校驗,為action指定校驗規則,當校驗不通過時,将不執行action的目标方法,而是傳回input的結果。

為了良好的實作校驗,請讓Action繼承于ActionSupport

一、實作校驗的方式

1  指定類的校驗xml檔案

    支援繼承,也支援對指定邏輯進行校驗,假如RegistAction繼承于BaseAction,此外BaseAction有login方法,那麼對于login方法,整個校驗的檔案搜尋順序如下:

      BaseAction-validation.xml

      BaseAction-login-validation.xml

      RegistAction-validation.xml

      RegistAction-login-validation.xml

      如果全部存在,那麼上面的所有檔案的校驗規将都被執行。

配置檔案:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWrok Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<validators>
   <!-- 校驗器的寫法分字段風格和非字段風格 -->
   
   <!-- 字段風格的校驗*************************** -->
   
   <field name="name">
     <!-- 非空校驗 -->
     <field-validator type="requiredstring"> 
        <param name="trim">true</param>
        <message key="name.required"></message>
        <!-- key屬性是資源檔案中的鍵,屬于國際化的做法,另外也可以使用getText方法:
        <message>${getText("name.required")}</message>
         -->
     </field-validator>
     <!-- 正規表達式校驗 -->
     <field-validator type="regex" >
       <param name="expression"><![CDATA[(\w{4,25})]]></param>
       <message key="name.length"></message>
     </field-validator>
     
     <!-- 
            注:對于一個字段有多個校驗的情況,某些關鍵校驗可以設定short-circuit="true"來開啟短路特性。該特性将使得
            目前校驗失敗的情況下終止後面關于該字段的字段風格校驗的執行。
      -->
   </field>
   
   <field name="pass">
     <field-validator type="requiredstring">
        <param name="trim">true</param>
        <message key="pass.required"></message>
     </field-validator>
     
     <field-validator type="regex">
       <param name="expression"><![CDATA[(\w{4,25})]]></param>
       <message key="pass.length"></message>
     </field-validator>
   </field>
   
   <field name="confirm">
   <!-- 字段表達式校驗 -->
     <field-validator type="fieldexpression">
       <param name="expression"><![CDATA[(pass==confirm)]]></param>
        <message key="pass.confirm"></message>
     </field-validator>
   </field>
   
   <field name="age">
     <!-- 數值校驗 -->
     <field-validator type="int">
       <param name="min">1</param>
       <param name="max">150</param>
       <message key="age.range"></message>
      </field-validator>
   </field>
   
   <!-- 非字段風格校驗 ************************-->
   
   <!-- 日期校驗 -->
   <validator type="date">
   <param name="fieldName">birth</param>
   <param name="min">1900-01-01</param>
   <param name="max">2050-02-21</param>
   <message key="birth.range"></message>
   </validator>
   
   <!-- 所有非字段風格的校驗都将優先于字段風格的校驗 -->
   <!-- 短路校驗器如果在非字段風格校驗中,會被優先執行,如果是字段風格,則還是按順序來 -->
   <!-- 短路校驗器的失敗會導緻後續關于該字段的字段風格校驗不執行,而對于非字段風格的校驗則無影響 -->
   
</validators>
      

2  使用注解

   @RequiredStringValidator(type=ValidatorType.FIELD,key="name.required", message="")

     public void setName(String name)...

   更多參考:

http://struts.apache.org/2.2.3/docs/validation-annotation.html

3  覆寫ActionSupport的validate方法或validateXXX方法

   對于後者,如果調用的方法是login那麼就為validateLogin方法。

   這兩者中validate會先被調用,validateXXX在後面被調用。

   在重寫的方法中,可以調用ActionSupport提供的便利方法如:

   addFieldError("user","使用者名稱輸入不正确"); --- 添加一條校驗錯誤,一旦執行過這樣的操作,便表示校驗未通過(傳回結果input)

   getText("user.required")根據key擷取資源檔案的内容

二、關于校驗過程的描述

  1   類型轉換,如果出錯,将錯誤資訊儲存到ActionContext裡,由conversionError攔截器負責将其轉換為fieldError,然後繼續執行校驗;否則直接進入校驗過程

    2  配置檔案校驗 -> 注解校驗

    3  執行validate

    4  執行validateXXX

    5  判斷是否存在fieldError,如果有則傳回input結果,否則調用action的目标方法

    6   處理結果..

 三、關于内建校驗器

conversion validator

date validator

double validator

email validator

expression validator

fieldexpression validator

int validator

regex validator

required validator

requiredstring validator

stringlength validator

url validator

visitor validator

參考:

http://struts.apache.org/2.2.3/docs/validation.html#Validation-RegisteringValidators

四、關于用戶端校驗

   用戶端校驗即是struts通過擷取服務端action的校驗配置自動在jsp頁面中生成校驗的js代碼的功能。

   由于興趣原因,試驗了一下用戶端校驗,發現這部分功能就是雞肋..:

   用的是2.3.3版本,用戶端校驗的實作過程如下:

   1 使用<s:form>要求設定屬性 validate為"true",内部的表單元素一律采用struts的标簽

   2 jsp頁面不能是直接通路,否則會報異常(NullPointer之類..),需要通過action映射到jsp資源:

     <action name="*"><result>/{1}.jsp</result>

   3 <s:form>的action必須是action的名稱,而不能是**.action 否則會直接送出給背景action驗證;

   4 在<head>内加入<s:head/>可以看到一點點css效果。

   用後感覺:功能太弱,容易出錯;許多校驗器都支援不了;出錯情況下再次送出出錯會顯示重複的錯誤提示(上次送出的錯誤提示并未消除)

最好的資源來自官方文檔:

http://struts.apache.org/2.2.3/docs/validation.html
struts2學習筆記之校驗器

作者:

zale

出處:

http://www.cnblogs.com/littleatp/

, 如果喜歡我的文章,請

關注我的公衆号

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出

原文連結

 如有問題, 可留言咨詢.