天天看点

WebWork2.0 里的Stringlength验证

 这是Webwork2.0中类FieldValidatorSupport中对字段进行验证validate的方法代码:

WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证

public   void  validate(Object object)  throws  ValidationException  ... {

WebWork2.0 里的Stringlength验证

        String fieldName = getFieldName();

WebWork2.0 里的Stringlength验证

        String val = (String) getFieldValue(fieldName, object);

WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证

        if (val == null || val.length() <= 0) ...{

WebWork2.0 里的Stringlength验证

            // use a required validator for these

WebWork2.0 里的Stringlength验证

            return;

WebWork2.0 里的Stringlength验证

        }

WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证

        if (doTrim) ...{

WebWork2.0 里的Stringlength验证

            val = val.trim();

WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证

            if (val.length() <= 0) ...{ 

WebWork2.0 里的Stringlength验证

                // use a required validator

WebWork2.0 里的Stringlength验证

                return;

WebWork2.0 里的Stringlength验证

            }

WebWork2.0 里的Stringlength验证

        }

WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证

        if ((minLength > -1) && (val.length() < minLength)) ...{

WebWork2.0 里的Stringlength验证

            addFieldError(fieldName, object);

WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证

        } else if ((maxLength > -1) && (val.length() > maxLength)) ...{

WebWork2.0 里的Stringlength验证

            addFieldError(fieldName, object);

WebWork2.0 里的Stringlength验证

        }

WebWork2.0 里的Stringlength验证

    }

从代码中可以看出,当被验证字段为null或其length<=0时,就不对其进行长度验证了。

这里是为什么呢??是不是其字段为null或其length<=0时验证留在别的地方验证了呢?答案是肯定的,请看类RequiredStringValidator和类RequiredFieldValidator中的validate方法

RequiredStringValidator中的validate方法:

WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证

public   void  validate(Object object)  throws  ValidationException  ... {

WebWork2.0 里的Stringlength验证

        String fieldName = getFieldName();

WebWork2.0 里的Stringlength验证

        Object value = this.getFieldValue(fieldName, object);

WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证

        if (!(value instanceof String)) ...{

WebWork2.0 里的Stringlength验证

            addFieldError(fieldName, object);

WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证

        } else ...{

WebWork2.0 里的Stringlength验证

            String s = (String) value;

WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证

            if (doTrim) ...{

WebWork2.0 里的Stringlength验证

                s = s.trim();

WebWork2.0 里的Stringlength验证

            }

WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证

            if (s.length() == 0) ...{

WebWork2.0 里的Stringlength验证

                addFieldError(fieldName, object);

WebWork2.0 里的Stringlength验证

            }

WebWork2.0 里的Stringlength验证

        }

WebWork2.0 里的Stringlength验证

    } 2.RequiredFieldValidator中的validate方法

WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证

public   void  validate(Object object)  throws  ValidationException  ... {

WebWork2.0 里的Stringlength验证

        String fieldName = getFieldName();

WebWork2.0 里的Stringlength验证

        Object value = this.getFieldValue(fieldName, object);

WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证

        if (value == null) ...{

WebWork2.0 里的Stringlength验证

            addFieldError(fieldName, object);

WebWork2.0 里的Stringlength验证

        }

WebWork2.0 里的Stringlength验证

    }

在代码中大家可以看到这三个方法各司其职而且互不影响,举个例子吧:

如何你有一个action类中如此写:

WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证

public   class  Hello  extends  ActionSupport  ... {

WebWork2.0 里的Stringlength验证

    private String name=null;

WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证

    public String execute() throws Exception ...{

WebWork2.0 里的Stringlength验证

        // TODO Auto-generated method stub

WebWork2.0 里的Stringlength验证

        return SUCCESS;

WebWork2.0 里的Stringlength验证

    }

WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证

    public void setName(String n)...{

WebWork2.0 里的Stringlength验证

        name = n;

WebWork2.0 里的Stringlength验证

    }

WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证
WebWork2.0 里的Stringlength验证

    public String getName()...{

WebWork2.0 里的Stringlength验证

        return name;

WebWork2.0 里的Stringlength验证

    }

WebWork2.0 里的Stringlength验证

} 然后你在Hello-validation.xml中对字段name进行验证:

WebWork2.0 里的Stringlength验证

<! DOCTYPE validators PUBLIC

WebWork2.0 里的Stringlength验证

 "-//OpenSymphony Group//XWork Validator 1.0.2//EN"

WebWork2.0 里的Stringlength验证

  "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd" >

WebWork2.0 里的Stringlength验证

< validators >

WebWork2.0 里的Stringlength验证

     < field  name ="name" >

WebWork2.0 里的Stringlength验证

         < field-validator  type ="required"  short-circuit ="false" >

WebWork2.0 里的Stringlength验证

             < message > Name is required! </ message >

WebWork2.0 里的Stringlength验证

         </ field-validator >

WebWork2.0 里的Stringlength验证

         < field-validator  type ="requiredstring"  short-circuit ="false" >

WebWork2.0 里的Stringlength验证

             < message > Please enter the name! </ message >

WebWork2.0 里的Stringlength验证

         </ field-validator >

WebWork2.0 里的Stringlength验证

         < field-validator  type ="stringlength" >

WebWork2.0 里的Stringlength验证

             < param  name ="minLength" > 5 </ param >

WebWork2.0 里的Stringlength验证

             < param  name ="maxLength" > 8 </ param >

WebWork2.0 里的Stringlength验证

             < message > The length of name is between ${minLength} and ${maxLength}. </ message >

WebWork2.0 里的Stringlength验证

         </ field-validator >

WebWork2.0 里的Stringlength验证

     </ field >

WebWork2.0 里的Stringlength验证

</ validators >

这时候当Hellow这个Action被引用的时候,WebWork的验证机制就会根据你的配置文件对name字段进行验证,在本例中name初始为null,所以这时候只有required和requiredstring对其进行完整的验证,也就是说这时候你会得到的验证信息为:Name is required! Please enter the name!

而如果你就Hello类中name字段设一个初始值(name="a"),那么这时候required和requiredstring就不会对其进行完整的验证了,相反stringlength会对其进行完整的验证,这时候你得到的验证信息为:The length of name is between 5 and 8.

这就是这个三个验证方式相互协作的方式!