上一篇的介绍就足以使用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这样的类中属性进行校验,不得不在添加一个校验文件;