1. 程式人生 > >struts2框架------驗證機制

struts2框架------驗證機制

在struts2中,我們可以實現對action類的所有方法進行校驗或者對action的指定方法進行校驗。
對於輸入校驗struts2提供了兩種實現方法:
1. 採用手工編寫程式碼實現(程式設計式)。

2. 基於XML配置方式實現(宣告式)。

手工校驗機制 在Struts2 中手工校驗是使用ActionSupport類的validate方法。 ActionSupport類實現了一個Validateable介面。這個介面只 有一個validate方法。如果Action類繼承了ActionSupport類 ,Struts2 會在呼叫execute 方法之前自動呼叫這個方法,我們可以在validate方法中編寫伺服器端驗證程式碼 如果發生錯誤,可以根據錯誤的level選擇欄位級(fielderror)錯誤,還是動作級(actionerror)錯誤。並且可使用addFieldError或addActionError加入相應的錯誤資訊,如果存在Action或Field錯誤,Struts2 會返回“input”(這個並不用開發人員寫,由Struts2 自動返回) 如果返回了“input”,Struts2 就不會再呼叫execute 方法了。如果不存在錯誤資訊,Struts2在最後會呼叫execute 方法。
Struts2中的3種訊息標籤
<s:actionerror>承載Action級別錯誤資訊 <s:fielderror>承載欄位級別錯誤資訊 <s:actionmessage>承載動作訊息 這三種訊息本質上都是儲存在響應集合裡的 呼叫標籤時,如果相應訊息集合裡的內容為空,則什麼都不顯示。如果不為空,則依次迭代顯示在頁面上

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

通過validateXxx()方法實現, validateXxx()只會校驗action中方法名為Xxx的方法。其中Xxx的第一個字母要大寫。當某個資料校驗失敗時,我們應該呼叫addFieldError()方法往系統的fieldErrors新增校驗失敗資訊(為了使用addFieldError()方法,action可以繼承ActionSupport ),如果系統的fieldErrors包含失敗資訊,struts2會將請求轉發到名為input的result。在input檢視中可以通過<s:fielderror/>顯示失敗資訊。

validateXxx()方法使用例子:

public String add() throws Exception{  return "success";} 

public void validateAdd(){

          if(username==null &&"".equals(username.trim())) this.addFieldError("username","使用者名稱不能為空");

}

驗證失敗後,請求轉發至input檢視:

<resultname="input">/WEB-INF/page/addUser.jsp</result>

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

輸入校驗的流程

型轉換器對請求引數執行型別轉換,並把轉換後的值賦給action中的屬性。

2。如果在執行型別轉換的過程中出現異常,系統會將異常資訊儲存到ActionContextconversionError攔截器將異常資訊新增到fieldErrors裡。不管型別轉換是否出現異常,都會進入第3步。

3。系統通過反射技術先呼叫action中的validateXxx()方法,Xxx為方法名。

4。再呼叫action中的validate()方法。

5。經過上面4步,如果系統中的fieldErrors存在錯誤資訊(即存放錯誤資訊的集合的size大於0),系統自動將請求轉發至名稱為input的檢視。如果系統中的fieldErrors沒有任何錯誤資訊,系統將執行action中的處理方法。


使用Validation框架驗證資料 用validate方法校驗資料會將驗證程式碼和正常的邏輯程式碼混在一起,但這樣做並不利於程式碼維護,而且也不能實現程式碼複用 在Struts2中提供了一個Validation框架,這個框架和Struts1.x提供的Validation框架類似,也是通過XML檔案進行配置。 Validation框架可以實現伺服器端驗證和客戶端驗證
Validation伺服器端驗證 1.建立Action類 2. 配置Action類 3.編寫驗證規則配置檔案 4. 編寫資料錄入JSP

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


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> 
<validators>
    <field name="username">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>使用者名稱不能為空!</message>
        </field-validator>
    </field>
</validators>


<field>指定action中要校驗的屬性,<field-validator>指定校驗器,上面指定的校驗器requiredstring是由系統提供的,系統提供了能滿足大部分驗證需求的校驗器,這些校驗器的定義可以在xwork-2.x.jar中的com.opensymphony.xwork2.validator.validators下的default.xml中找到。
<message>為校驗失敗後的提示資訊

編寫校驗檔案時,不能出現幫助資訊
在編寫ActionClassName-validation.xml校驗檔案時,如果出現不了幫助資訊,可以按下面方式解決:
windwos->preferences->myeclipse->files and editors->xml->xmlcatalog
點“add”,在出現的視窗中的location中選“File system”,然後在xwork-2.1.2解壓目錄的src\java目錄中選擇xwork-validator-1.0.3.dtd,回到設定視窗的時候不要急著關閉視窗,應把視窗中的Key Type改為URI 。Key改為http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd

Validation客戶端驗證 其他步驟和伺服器端驗證一致 額外只需要在<s:form>中加入一個validate屬性,值為true,即可 如<s:form validate="true" ... > ... </form> 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時校驗通過,否則不通過,該校驗器不可用在欄位校驗器風格的配置中)

校驗器的使用例子

required 必填校驗器

<field-validatortype="required">

       <message>性別不能為空!</message>

</field-validator>

requiredstring必填字串校驗器(先去掉空格)

<field-validator type="requiredstring">

       <param name="trim">true</param>

       <message>使用者名稱不能為空!</message>

</field-validator>

stringlength字串長度校驗器

<field-validator type="stringlength">

  <param name="maxLength">10</param>

  <param name="minLength">2</param>

  <param name="trim">true</param>

  <message><![CDATA[產品名稱應在2-10個字元之間]]></message>

</field-validator>

email:郵件地址校驗器

<field-validatortype="email">

  <message>電子郵件地址無效</message>

</field-validator>

int:整數校驗器

<field-validator type="int">

  <param name="min">1</param>

  <param name="max">150</param>

  <message>年齡必須在1-150之間</message>

</field-validator>

Validation框架對指定action方法實現校驗

校驗檔案的取名為ActionClassName-validation.xml時,會對 action中的所有處理方法實施輸入驗證。如果你只需要對action中的某個action方法實施校驗那麼,校驗檔案的取名應為:ActionClassName-ActionName-validation.xml其中ActionNamestruts.xmlaction的名稱。例如:在實際應用中,常有以下配置:

<actionname="user_*"class="cn.itcast.action.UserAction"method="{1}“ >

  <resultname="success">/WEB-INF/page/message.jsp</result>

  <resultname="input">/WEB-INF/page/addUser.jsp</result>

</action>

UserAction中有以下兩個處理方法:

public String add() throwsException{

   ....

}

public String update() throwsException{

   ....

}

要對add()方法實施驗證,校驗檔案的取名為:UserAction-user_add-validation.xml

要對update()方法實施驗證,校驗檔案的取名為:UserAction-user_update-validation.xml


複合屬性驗證 有一類特殊的屬性,即這個屬性的型別是另外一個JavaBean,對於複合屬性的驗證,需要使用visitor型別 其中context引數將作為驗證User類屬性的檔名的一部分,如context設為abc,複合屬性的驗證檔名為User-abc-validation.xml 該引數是可選的,如果不設定,則複合屬性驗證檔名就是ClassName-validation.xml 如果另一個Action對同類複合屬性使用另一個校驗規則,可以建立新的驗證檔案,並且使用context引數區分即可