1.普通的處理方式:只需要在action中重寫validate()方法
2.壹個action對應多個邏輯處理方法:指定校驗摸個特定方法的方式:
重寫validateXxxx()方法。Eg:如果,只校驗login方法,則只需重寫validateLogin().
二. 輸入校驗流程:
1. 類型轉換器負責對字符串的請求參數執行類型轉換。並將這些值設置成Action的屬性值。
2. 轉換過程中若出現異常,則將異常信息保存到ActionContext中,conversionError攔截器將其封裝到fieldError中。
3. 通過反射調用validateXxx()方法。
4. 調用validate().
5. 如果未出現異常,則轉入用戶請求的處理方法,如果出現異常,則轉入inout視圖所指定的視圖資源(所以,對於驗證的方法,必須要在配置文件中為其指定input)。
三. 基於驗證框架的輸入校驗
1. 編寫校驗配置文件:命名規則:action類名-validatin.xml.
2. 壹個action對應多個邏輯處理方法:指定校驗摸個特定方法的方式:
action類名-name屬性名-validatin.xml.(name屬性名:在strtus配置文件中的)
3. 配置文件存放位置:放在與Action相同的文件夾內。
4. 驗證規則:先加載action類名-validatin.xml,然後加載action類名-name屬性名-validatin.xml文件。
5. 校驗器的配置風格:兩種:字段校驗器,非字段校驗器。
字段校驗器配置格式:
<field name="被校驗的字段">
<field-validator type="校驗器名">
<!--此處需要為不同校驗器指定數量不等的校驗規則-->
<param name="參數名">參數值</param>
....................
<!--校驗失敗後的提示信息,其中key指定國際化信息的key-->
<message key="I18Nkey">校驗失敗後的提示信息</message>
<!--校驗失敗後的提示信息:建議用getText("I18Nkey"),否則可能出現Freemarker template Error-->
</field-vallidator>
<!-- 如果校驗字段滿足多個規則,下面可以配置多個校驗器-->
</field>
非字段校驗器配置格式:
<validator type="校驗器名">
<param name="fieldName">需要被校驗的字段</param>
<!--此處需要為不同校驗器指定數量不等的校驗規則-->
<param name="參數名">參數值</param>
<!--校驗失敗後的提示信息,其中key指定國際化信息的key-->
<message key="I18Nkey">校驗失敗後的提示信息</message>
<!--校驗失敗後的提示信息:建議用getText("I18Nkey"),否則可能出現Freemarker template Error-->
</validator>
非字段校驗:先指定校驗器:由誰來校驗,來校驗誰!
字段校驗器:先指定校驗的屬性:我來校驗誰,由誰來校驗!
6. 校驗器:struts2提供了大量的內置校驗器:妳可以在xwork-core-2.1.6.jar的com.opensymphony.xwork2.validator.validators下找到如下配置文件:default.xml.裏面列出了所有的內置校驗器。
----------------------------------------------------------
struts2表單驗證裏field-validator type值:
int 整數;
double 實數;
date 日期;
expression 兩數的關系比較;
email Email地址;
url
visitor
conversion
regex 正則表達式驗證;
required 是否為空;
requiredstring 必須字符;
stringlength 輸入字符長度限制;
url web地址
visitor 訪問
conversion 轉換
-------------------------------------------------------------
<validators>
<!—必填校驗器 -->
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<!—必填字符串校驗器-->
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<!-- 整數校驗器 -->
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<!-- -->
<validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
<validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
<validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
<!-- 日期校驗器 -->
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<!-- 表達式校驗器 -->
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<!-- 字段表達式校驗器 -->
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<!-- 郵件校驗器 -->
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<!-- 網址校驗器 -->
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<!-- 轉換器校驗器 -->
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<!-- 字符串長度校驗器 -->
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
<!-- 正則表達式校驗器 -->
<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
<validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>
這些校驗器已經可以滿足大多數的驗證需求,如果還需要特殊的要求,建議直接采用java代碼搞定,除非妳有很多地方都要用到,此時妳可以自定義壹個校驗器。
四. 校驗器的執行順序
1. 所有非字段校驗風格的校驗器優先於字段校驗風格的校驗器;
2. 所有非字段校驗風格的校驗器中,排在前面的會先執行;
3. 所有字段校驗風格的校驗器,排在前面的會先執行;
五. 校驗器的短路原則
1. 所有非字段檢驗器時最優先執行的,如果某個非字段校驗器校驗失敗了,則該字段上的所有字段校驗器都不會獲得校驗機會;
2. 非字段校驗校驗失敗,不會阻止其他非字段校驗執行;
3. 如果壹個字段校驗器校驗失敗後,則該字段下且排在該校驗失敗後的檢驗器之後的其他字段校驗器不會獲得校驗機會;
4. 字段校驗器永遠不會阻止非字段校驗器的執行!
六. 短路校驗器
短路校驗器:只需在<validator>或<filed-validator>元素中添加short-circuit=”true”屬性。
註:在struts2.1.6版本,已經支持客戶端的短路校驗。
七. 客戶端的校驗:
在<s:form>中添加validate=”true”.
Struts2提供了客戶端校驗與服務端校驗。這裏只是做個簡易的總結。
1.)服務端校驗:
當程序流程進入到Action類,並經歷了struts2的類型轉換階段後。接著進入struts2的輸入校驗階段。
struts2的輸入校驗可自己編碼進行校驗,也可通過有規則命名的配置文件進行校驗。
1.1)編碼校驗:
在Action類裏重寫父類的validate()方法即可。
public void validate(){
if(null == username || "".equals(username)){
this.addFieldError("username","username should not be empty !");
}else if(username.length() < 6 || username.length() > 12){
this.addFieldError("username","username should be between 6 and 12 !");
}
if(null == password || "".equals(password )){
this.addFieldError("password ","password should not be empty !");
}else if(password .length() < 6 || password .length() > 12){
this.addFieldError("password ","password should be between 6 and 12 !");
}
}
在上面的validate方法中,壹旦發現校驗失敗,就把失敗提示通過addFieldError方法添加到系統的fieldError中。校驗完畢後,若系統的fieldError不為空,則自動轉到input視圖對應的JSP頁面中輸出錯誤提示,這與類型轉換失敗後的處理是完全壹樣的。
為了在input視圖中對應的JSP頁面輸出錯誤提示,應該在該頁面中增加如下代碼:
<!-- 輸入類型轉換失敗提示和校驗失敗提示 -->
<s:fielderror/>
這裏不能忽略另外種情況:
Struts2的Action類裏可以包含多個處理邏輯,不同的處理邏輯對應不同的方法。即Struts2的Action類裏定義了幾個類似於execute的方法,只是方法名不同。而重寫validate方法無法知道需要校驗的是哪個處理邏輯。實際上重寫validate方法會校驗所有的處理邏輯。
為了校驗指定處理邏輯,需提供壹個validateXxx()方法,其中xxx為Action對應的處理邏輯方法。
例如Action類裏有個login()邏輯方法,那麽對應的校驗方法validateLogin()方法。
但之後還是會調用validate()進行校驗,因此此時validate()沒必要寫了,或者讓validate()進行公***字段的校驗。
1.2)配置文件校驗
只需為Action指定壹個校驗文件即可。
在Action類所在的com.test.action包下建立LoginAction-validation.xml校驗文件(格式:Action類名-validation.xml).
LoginAction-validation.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>username should not be empty !</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">12</param>
<message>username should be between ${minLength} and ${maxLength}!</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>password should not be empty !</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">12</param>
<message>password should be between ${minLength} and ${maxLength}!</message>
</field-validator>
</field>
</validators>
每個<field.../>元素指定壹個Action屬性必須遵守的規則,該元素name屬性指定了被校驗的字段;如果該屬性滿足多個規則,則在該<field.../>下增多個<field-validator.../>。
每個<field-validator .../>指定壹個校驗規則,該元素的type屬性指定校驗器名稱該元素可以包含多個<param .../>子元素,用戶指定該校驗器的參數;除外,每個<field-validator .../>元素都有壹個必須的<message .../>元素,用戶確定校驗失敗後的提示信息。
例子中只采用了"必填字符串校驗器"和"字符串長度校驗器"2個校驗規則。
struts2貌似***提供了13個校驗器:
required:必填校驗器
requiredstring:必填字符串校驗器
int:整數校驗器
double:雙精度浮點數校驗器
date:日期校驗器
expression:表達式校驗器
fieldexpression:字段表達式校驗器
email:電子郵件校驗器
url:網址校驗器
visitor:Visitor校驗器
conversion:轉換校驗器
stringlength:字符串長度校驗器
regex:正則表達式校驗器
用法大部分雷同,用到的時候可自己google搜索。
配置文件校驗肯定不輸給編碼校驗的,自然也提供了對應於具體業務邏輯的校驗規則文件的格式:
<Action類名-Action所包含的處理方法在struts.xml對應的name屬性-validation.xml>
例:
<!-- 配置壹個名為user的Action,對應的邏輯方法為UserAction的login方法-->
<action name="login" class="com.test.action.UserAction" method="login">
<result name="input">/login.jsp</result>
<result name="success">/index.jsp</result>
</action>
則此邏輯方法對應的校驗規則文件為:
UserAction-login-validation.xml
與編碼校驗壹樣,校驗錯誤信息會添加到系統的fieldError中,校驗完畢後若FieldError不為空。則進入到input視圖對應的JSP。在<fieldError/>處輸出錯誤提示。
提醒:沒記錯的話。與編碼校驗不同的是校驗順序,配置文件校驗方式下,
先UserAction-validation.xml,再UserAction-login-validation.xml,
因此若是只針login()邏輯進行輸入校驗的話,那UserAction-validation.xml沒必要寫了,或讓其進行公***字段的校驗
2)客戶端校驗
增加客戶端校驗非常簡單,將輸入頁面的表單元素改為使用struts2標簽來生成表單,並且為該表單增加validate="true"屬性即可。
上面是我經常看的參考文檔,我個人覺得,二者的主要區別就在於靈活性與易維護。
xml相對來說,比較容易維護,對於需求經常變化的項目,比較適合。
valdate相對來說靈活性比較高,對於驗證比較復雜的比較適合。