目錄
Validate
1、校驗類型
2、輸入校驗
1)採用手工編寫代碼實現。
2)基於XML配置方式實現。
3、系統校驗器
4、校驗器的使用例子
1、校驗類型
從Struts2 校驗框架在驗證的場所上可以分爲:客戶端校驗和服務端校驗
1)客戶端校驗
在HTML畫面上自動生成JavaScript校驗代碼,在用戶提交到服務器之前在客戶端瀏覽器中進行校驗默認位客戶端校驗。
驗證方式:JavaScript---> js
優點:效率高,不會佔用服務器端太多資源;
缺點:不安全;
注: xwork驗證框架可以在客戶端自動產生js代碼
2)服務端校驗
在數據提交到服務器上之後,在Action處理之前,對客戶但提交的數據進行校驗
a、編碼:編寫java代碼(Java代碼需寫在一個名爲validate的驗證方法內)
注:當Action中只有一個處理請求的方法execute時,則只需要
提供一個validate驗證方法;如果Action中有多個處理請求的方法,那麼需要爲每個方法定義一個validateXxx方法(命名規則爲validate+處理請求的方法名);這些驗證方法在執行的時候只要產生FieldError,就認爲驗證不通過,struts2框架就會將請求轉發到"input"結果上。
b、xwork框架:編寫驗證文件"*-validation.xml"
當Action中只有一個execute的時候:ActionClassNamevalidation.xml
XML配置文件配置是指,使用XML配置文件配置需要校驗的內容和校驗方式。
當Action中有多個方法時:ActionClassName-ActionMethodvalidation.xml
2、輸入校驗
在struts2中,我們可以實現對action的所有方法進行校驗或者對action的指定方法進行校驗。
對於輸入校驗struts2提供了兩種實現方法:
2採用手工編寫代碼實現。
2基於XML配置方式實現。
1)採用手工編寫代碼實現。
a、手工編寫代碼實現對action中所有方法輸入校驗
通過重寫validate()方法實現, validate()方法會校驗action中所有與execute方法簽名相同的方法。當某個數據校驗失敗時,我們應該調用addFieldError()方法往系統的fieldErrors添加校驗失敗信息(爲了使用addFieldError()方法,action可以繼承ActionSupport),如果系統的fieldErrors包含失敗信息,struts2會將請求轉發到名爲input的result。在input視圖中可以通過<s:fielderror/>顯示失敗信息。
@Override
public void validate() {//會對action中所有方法校驗
if(this.username==null ||"".equals(this.username.trim())){
this.addFieldError("username", "用戶名不能爲空");
}
}
驗證失敗後,請求轉發至input視圖:
<struts>
<packagename="v"namespace=""extends="struts-default">
<actionname="login_*"class="com.action.Action"method="{1}">
<resultname="input">/message.jsp</result>
<resultname="success">/index.jsp</result>
</action>
</package>
</struts>
在message.jsp頁面中使用<s:fielderror/>顯示失敗信息。
b、對action指定方法進行校驗
通過validateXxx()方法實現,validateXxx()只會校驗action中方法名爲Xxx的方法。其中Xxx的第一個字母要大寫。當某個數據校驗失敗時,我們應該調用addFieldError()方法往系統的fieldErrors添加校驗失敗信息(爲了使用addFieldError()方法,action可以繼承ActionSupport ),如果系統的fieldErrors包含失敗信息,struts2會將請求轉發到名爲input的result。在input視圖中可以通過<s:fielderror/>顯示失敗信息。
public String add() throws Exception{
return"success";
}
public void validateAdd(){
if(this.username==null|| "".equals(this.username.trim())){
this.addFieldError("username", "用戶名不能爲空");
}
}
校驗流程:
1)類型轉換器對請求參數執行類型轉換,並把轉換後的值賦給action中的屬性。
2)如果在執行類型轉換的過程中出現異常,系統會將異常信息保存到ActionContext,
conversionError攔截器將異常信息添加到fieldErrors裏。不管類型轉換是否出現異常,都會進入第3步。
3)系統通過反射技術先調用action中的validateXxx()方法,Xxx爲方法名。
4)再調用action中的validate()方法。
5)經過上面4步,如果系統中的fieldErrors存在錯誤信息(即存放錯誤信息的集合的size大於0),系統自動將請求轉發至名稱爲input的視圖。如果系統中的fieldErrors沒有任何錯誤信息,系統將執行action中的處理方法。
2)基於XML配置方式實現。
A、對Action所有方法校驗
使用基於XML配置方式實現輸入校驗時,Action也需要繼承ActionSupport,並且提供校驗文件,校驗文件和action類放在同一個包下,文件的取名格式爲:
ActionClassName-validation.xml,其中ActionClassName爲action的簡單類名,-validation爲固定寫法。如果Action類爲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>爲校驗失敗後的提示信息,如果需要國際化,可以爲message指定key屬性,key的值爲資源文件中的key。
在這個校驗文件中,對action中字符串類型的username屬性進行驗證,首先要求調用trim()方法去掉空格,然後判斷用戶名是否爲空。
B、對Action指定方法校驗
當校驗文件的取名爲ActionClassName-validation.xml時,會對 action中的所有處理方法實施輸入驗證。如果你只需要對action中的某個action方法實施校驗,那麼,校驗文件的取名應爲:ActionClassName-ActionName-validation.xml,其中ActionName爲struts.xml中action的名稱。例如:在實際應用中,常有以下配置:
<action name="user_*"class="com.action.UserAction" method="{1}“ >
<result name="success">/WEB-INF/message.jsp</result>
<result name="input">/WEB-INF/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兩種規則的校驗文件時,系統按下面順序尋找校驗文件:
a、AconClassName-validation.xml
b、ActionClassName-ActionName-validation.xml
系統尋找到第一個校驗文件時還會繼續搜索後面的校驗文件,當搜索到所有校驗文件時,會把校驗文件裏的所有校驗規則彙總,然後全部應用於action方法的校驗。如果兩個校驗文件中指定的校驗規則衝突,則只使用後面文件中的校驗規則。
當action繼承了另一個action,父類action的校驗文件會先被搜索到。
3、系統校驗器
系統提供的校驗器如下:
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時校驗通過,否則不通過,該校驗器不可用在字段校驗器風格的配置中)。
4、校驗器的使用例子
required 必填校驗器
<field-validator type="required">
<message>性別不能爲空!</message>
</field-validator>
requiredstring 必填字符串校驗器
<field-validator type="requiredstring">
<paramname="trim">true</param>
<message>用戶名不能爲空!</message>
</field-validator>
stringlength:字符串長度校驗器
<field-validator type="stringlength">
<paramname="maxLength">10</param>
<paramname="minLength">2</param>
<paramname="trim">true</param>
<message><![CDATA[產品名稱應在2-10個字符之間]]></message>
</field-validator>
email:郵件地址校驗器
<field-validator type="email">
<message>電子郵件地址無效</message>
</field-validator>
regex:正則表達式校驗器
<field-validator type="regex">
<paramname="expression"><![CDATA[^1[358]\d{9}$]]></param>
<message>手機號格式不正確!</message>
</field-validator>
int:整數校驗器
<field-validator type="int">
<paramname="min">1</param>
<paramname="max">150</param>
<message>年齡必須在1-150之間</message>
</field-validator>
字段OGNL表達式校驗器
<field name="imagefile">
<field-validatortype="fieldexpression">
<paramname="expression"><![CDATA[imagefile.length() <=0]]></param>
<message>文件不能爲空</message>
</field-validator>
</field>