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