上一篇的介绍就足以使用struts2的校验功能;
com.opensymphony.xwork2.validator.validators有个文件default.xml ,
该文件中定义了Struts2框架内建的校验器,你可以查看struts2支持的校验类型,在校验文件中引用即可;
下面介绍struts2的校验器的其他使用:
一、使用别名的校验器:
还是上一篇的代码和文件;如果你在校验文件的目录下,有一个同一前缀名的这样的文件:
BasicValidationAction-aliasValidation-validation.xml;并且里面的内容完全一样;
struts2校验的时候,你会发现,如果你的表单提交的信息中字段有错误,在前台显示的提示错误中会 重复的提示两次(使用了<s:fielderror></s:fielderror>);为何?因为这两个校验文件都会被执行;
这就是别名的校验文件使用;当然你可以使用这个别名的校验文件,设置其内容与主要的校验文件不同;便可以灵活的为字段的校验添加校验规则;
二、手动的在Action中校验;
如果你的校验不需要添加校验文件来校验;这种方法也是很常用的;
当然你可以使用校验文件的同时,配合使用这种方法;
你的action继承了ActionSupport;便可以使用ActionSupport中的validate();这个方法会在action的指定方法前执行,和校验文件的执行时机不同,使用校验文件的时候,没有进入到action中,使用这个方法是在action中通过代码手动校验的;
这个方法除此以外;由于是在action中校验的,你还可以,为action中的方法指定校验;例如:
你的action中有两个Login()和Reg()的方法;你可以使用validateLogin()方法为Login()手动的添加校验 文件;也就是说你在validateLogin()中的校验代码,只用在Login()中起作用,在Reg()中不起作用;但是你的action中加入还用一个validate()的方法,这个方法中的校验代码在action中任何一个方法执行前都会被执行;
注意validateLogin()这样的方法优先于validate()的执行;
三、自定义的校验器
因为Struts2有内置的校验类型;你想要自定的校验,你除了上面第二种方法外;还可以这样使用校验文件;
首先你必须创建一个名为validators.xml与struts.xml在同一目录;其内容
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator Config 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd"> <!-- START SNIPPET: validators-default --> <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="cardid" class="struts.validation.custom.CardidValidator"></validator> </validators> <!-- END SNIPPET: validators-default -->
你会注意到这个文件的内容是struts2的内置校验类型;但是最后一个类型不是;
这个类型便是你的自定义类型;你可以使用这种类型和其他的了类型一样;可是;其他的类型是内置的都有各自相应的校验器;你此时添加的这种类型没有相应的校验器;所以你不得不要创建一个校验器,只要符合校验器的规则的类便是校验器:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package struts.validation.custom; import com.opensymphony.xwork2.validator.ValidationException; import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; /** * * @author Administrator */ public class CardidValidator extends FieldValidatorSupport { public void validate(Object object) throws ValidationException { String fieldName=getFieldName(); String value = getFieldValue(fieldName, object).toString(); if (value == null || value.length() <= 0) return; if(value.length()!=15 && value.length()!=18 ) addFieldError(fieldName, object); if(value.length()==15) validate15(value, object); if(value.length()==18) validate18(value, object); } public void validate18(String value, Object object) { String fieldName=getFieldName(); String tempStr = value.substring(0,17); String sourceCheckCode = value.substring(17,18); String checkCode = ""; int[] a = new int[17]; int i = 0; try { while(i<17){ a[i] = Integer.parseInt(tempStr.substring(i,i+1)); i++; } } catch (NumberFormatException e) { addFieldError(fieldName, object); } int mod = (a[0]*7+a[1]*9+a[2]*10+a[3]*5+a[4]*8+a[5]*4+a[6]*2+a[7]*1+a[8]*6+a[9]*3+a[10]*7 +a[11]*9+a[12]*10+a[13]*5+a[14]*8+a[15]*4+a[16]*2)%11; switch (mod){ case 10: checkCode = "2"; break; case 9: checkCode = "3"; break; case 8: checkCode = "4"; break; case 7: checkCode = "5"; break; case 6: checkCode = "6"; break; case 5: checkCode = "7"; break; case 4: checkCode = "8"; break; case 3: checkCode = "9"; break; case 2: checkCode = "x"; break; case 1: checkCode = "0"; break; case 0: checkCode = "1"; break; } if(!sourceCheckCode.equalsIgnoreCase(checkCode)) addFieldError(fieldName, object); } public void validate15(String value, Object object) { String fieldName = getFieldName(); int i = 0; try { while(i<15){ if(!Character.isDigit(value.charAt(i))) addFieldError(fieldName, object); i++; } } catch (NumberFormatException e) { addFieldError(fieldName, object); } } }
这是一个身份证的校验器;
自定义校验器的原理:继承了内置的校验类型;为某些特定类型自定义校验器;除了自定义一些文件和类以外,其原理与内置的原理一样!
四、域模型的校验
下面的应该是域模型的校验吧,这个名词是上一篇,自定类型转化学来的;就是你的Action中有一个其他实体类的引用;例如这样:
public class RegistAction extends ActionSupport{ private User user; public void setUser(User user){ this.user = user; } public User getUser() { return (this.user); } }
你要对这样的属性进行校验,该如何实现呢?
这时候,一个校验文件似乎无能为力了;只有这样了;
你将需要校验的字段,设为visitor类型,表明:这个被校验的字段有些复杂,具体你去找单独针对这个字段的校验文件吧;显然,此时,这个字段是一个User的对象,根本不可能像检验int那样了,内置的校验器永远不可能会知道这样的字段该如何去编写校验器类;只有交给你自己;
一旦你将该字段的type定义为visitor,struts2便会去寻找那个校验文件;你需要给出校验文件的名字:<param name="context">userContext</param>;这个文件位于同一目录下且命名:
User-userContext-validation.xml;这个文件中的内容便是对User各个属性的具体校验;与其他的校验相同;
总结一下:类似这样的校验;首先明确,这是两个校验,首先你需要对User这样的类中属性进行校验,不得不在添加一个校验文件;