struts2框架------驗證機制
對於輸入校驗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種訊息標籤
手工編寫程式碼實現對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。如果在執行型別轉換的過程中出現異常,系統會將異常資訊儲存到ActionContext,conversionError攔截器將異常資訊新增到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
系統提供的校驗器如下:
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,其中ActionName為struts.xml中action的名稱。例如:在實際應用中,常有以下配置:
<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引數區分即可