Struts2驗證框架的使用和擴展
struts2的能夠?qū)η芭_提交的表單數(shù)據(jù)進行輸入有效性校驗,通常有兩種方式:
1、在Action類中通過validatexx驗證,這種方式很簡單,在此不再贅述;
2、通過編寫xx-validation.xml文件執(zhí)行表單驗證,當(dāng)用戶提交表單請求后,struts會優(yōu)先執(zhí)行xml文件,如果校驗不通過是不會讓請求訪問指定action的。
本文介紹一下struts2通過xml文件進行校驗的方法并說明怎么樣擴展自定義的驗證。
一、struts2驗證框架的包位置
部署struts2項目有一個必備jar包:xwork-core-*.jar,在這個包中有這樣一個package"com.opensymphony.xwork2.validator.validators",所有官方驗證類就放在這下面的,在這個包下面有一個"default.xml"文件,這就是驗證框架的核心文件,里面配置了所有的驗證類數(shù)據(jù)。
驗證類的格式為:
在這介紹struts2的幾個常用的驗證類:
required:字段不能為空
requiredstring:字符串不能為空
int:int類型(可指定范圍)
long:long類型(可指定范圍)
short:short類型(可指定范圍)
double:double類型(可指定范圍)
date:時間格式(可指定范圍)
expression:ognl表達(dá)式判斷
fieldexpression:ognl表達(dá)式判斷
email:郵箱判斷
url:url路徑判斷
visitor:把同一個驗證程序配置文件用于多個動作(對一個Bean寫驗證文件,每個使用的Action只要引用)
conversion:格式轉(zhuǎn)換
stringlength:字符串長度
regex:正則表達(dá)式判斷
這里有個地址詳細(xì)介紹了這幾種驗證的使用方法,大家可以參考下:http://code.google.com/p/j2eewiki/wiki/Struts2Validator
以上驗證乍看還是非常全面的,但是很多驗證功能還不夠強大(比如stringlength是把任何文字都當(dāng)做1的長度,而中文像UTF-8是3個字節(jié)的長度,這樣驗證效果就不準(zhǔn)確了),所以很多時候是需要進行自定義驗證的,這個隨后再說。
二、使用xml配置驗證
①copy上面提到的"default.xml"文件到Action同級目錄下,修改文件名為"action名-validation.xml"。假設(shè)有這樣一個Action:com.struts.action.UserAction.java,那么你需要將xml文件放到com.struts.action包下面,并且改名為"UserAction-validation.xml"。
②刪除標(biāo)簽
Xml代碼
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
③編寫驗證文件,field標(biāo)簽表示被驗證的字段項,field-validator標(biāo)簽表示使用什么驗證約束,short-circuit表示如果有多個驗證約束時只要有一個不通過則后面就不執(zhí)行驗證了,message表示驗證不通過時返回的錯誤消息。
Xml代碼
- <field name="user.name">
- <field-validator type="requiredstring" short-circuit="true">
- <message>用戶名不能為空message>
- field-validator>
- field>
按照上面三步,一個基本的驗證就出來了,大家可以去試試,只要提交的表單訪問UserAction都會先通過xml的驗證。假如你只想驗證UserAction中的userAdd方法,則只需要將xml文件改名為"UserAction-userAdd-validattion.xml"即可。
三、擴展struts2驗證類
其實自定義驗證類很簡單,你只需要仿照struts2的任何一個驗證類就能做出來,前面提到不能驗證utf-8格式的字符長度,我們在這就做一個獲取utf-8長度的自定義框架。
①創(chuàng)建驗證框架擴展類,這里必須繼承 FieldValidatorSupport 類,重寫validate方法,具體驗證代碼就在validate方法中寫,這里的get、set就是在xml中出現(xiàn)的屬性參數(shù)。這段代碼還不夠好,其實可以把encoding也作為屬性的,這樣傳入任何編碼格式都能獲取該編碼對應(yīng)的字符長度。
Java代碼
- public class CheckStringLength extends FieldValidatorSupport {
- private boolean trim; // 是否去首位空格
- private int minLength; //最大長度
- private int maxLength; //最小長度
- private static final String ENCODING = "UTF-8"; //編碼格式(默認(rèn)utf-8)
- /*
- * 構(gòu)造方法初始化默認(rèn)數(shù)據(jù)
- */
- public CheckStringLength() {
- this.trim = true;
- this.minLength = -1;
- this.maxLength = -1;
- }
- public boolean isTrim() {
- return trim;
- }
- public void setTrim(boolean trim) {
- this.trim = trim;
- }
- public int getMinLength() {
- return minLength;
- }
- public void setMinLength(int minLength) {
- this.minLength = minLength;
- }
- public int getMaxLength() {
- return maxLength;
- }
- public void setMaxLength(int maxLength) {
- this.maxLength = maxLength;
- }
- @Override
- public void validate(Object arg0) throws ValidationException {
- String fieldName = this.getFieldName();
- String val = (String) this.getFieldValue(fieldName, arg0);
- //如果值為空則直接不通過
- if (val == null || val.length() <= 0) {
- return;
- }
- if (trim) {
- val = val.trim();
- ////如果值為空則直接不通過
- if (val == null || val.length() <= 0) {
- return;
- }
- }
- int length = 0;
- try {
- //根據(jù)編碼格式獲得字符長度
- length = val.getBytes(ENCODING).length;
- } catch (UnsupportedEncodingException e) {
- length = val.getBytes().length;
- }
- /*
- *判斷字符長度范圍
- */
- if (minLength > -1 && length < minLength) {
- this.addFieldError(fieldName, arg0);
- }
- if (maxLength > -1 && maxLength > maxLength) {
- this.addFieldError(fieldName, arg0);
- }
- }
- }
②新建validators.xml文件,將"default.xml"的配置信息和自定義驗證類的配置信息放到文件中,最后把validators.xml文件放到源碼根目錄下:
Xml代碼
- xml version="1.0" encoding="UTF-8"?>
- "-//OpenSymphony Group//XWork Validator Config 1.0//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">
- <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"/>
- <validator name="stringlengthencoding" class="com.bless.struts2.validate.CheckStringLength"/>
- validators>
③按照前面所說的編寫表單驗證規(guī)則,注意這里的param就是上面CheckStringLength類中的屬性,但是屬性是根據(jù)get、set方法來的 (因為struts2做了一個很蛋痛的事:他的驗證類中有這樣一個屬性"doTrim",但是該屬性對應(yīng)的get、set方法是getTrim、setTrim,配置文件里必須這樣寫 false,記住是根據(jù)set方法配置param)。
Xml代碼
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
- <validators>
- <field name="user.name">
- <field-validator type="requiredstring" short-circuit="true">
- <message>用戶名不能為空message>
- field-validator>
- <field-validator type="stringlengthencoding" short-circuit="true">
- <param name="maxLength">10param>
- <param name="minLength">6param>
- <message>用戶名必須是6到10位字符!message>
- field-validator>
- field>
- validators>
基本上一個簡單的自定義驗證就完成了,大家可以手動試試,這個東西確實很簡單。
最后附上擴展的幾個驗證類,希望對大家有所幫助 :
Xml代碼
- <validator name="stringlengthencoding" class="com.bless.struts2.validate.CheckStringLength"/>
- <validator name="checkformat" class="com.bless.struts2.validate.CheckFormat"/>
- <validator name="checkhalfwidthdigit" class="com.bless.struts2.validate.CheckHalfWidthDigit">validator>
- <validator name="checkspecialchar" class="com.bless.struts2.validate.CheckSpecialChar">validator>
- <validator name="checkdate" class="com.bless.struts2.validate.CheckDate"/>
- <validator name="checkdoublerange" class="com.bless.struts2.validate.CheckDoubleAccuracy"/>
最后感謝同事jwt童鞋做的擴展框架。