|
这是Webwork2.0中类FieldValidatorSupport中对字段进行验证validate的方法代码:
 public void validate(Object object) throws ValidationException ...{
String fieldName = getFieldName();
String val = (String) getFieldValue(fieldName, object);

 if (val == null || val.length() <= 0) ...{
// use a required validator for these
return;
}
 if (doTrim) ...{
val = val.trim();
 if (val.length() <= 0) ...{
// use a required validator
return;
}
}

 if ((minLength > -1) && (val.length() < minLength)) ...{
addFieldError(fieldName, object);
 } else if ((maxLength > -1) && (val.length() > maxLength)) ...{
addFieldError(fieldName, object);
}
}
从代码中可以看出,当被验证字段为null或其length<=0时,就不对其进行长度验证了。
这里是为什么呢??是不是其字段为null或其length<=0时验证留在别的地方验证了呢?答案是肯定的,请看类RequiredStringValidator和类RequiredFieldValidator中的validate方法
RequiredStringValidator中的validate方法:
 public void validate(Object object) throws ValidationException ...{
String fieldName = getFieldName();
Object value = this.getFieldValue(fieldName, object);

 if (!(value instanceof String)) ...{
addFieldError(fieldName, object);
 } else ...{
String s = (String) value;

 if (doTrim) ...{
s = s.trim();
}

 if (s.length() == 0) ...{
addFieldError(fieldName, object);
}
}
}
2.RequiredFieldValidator中的validate方法
 public void validate(Object object) throws ValidationException ...{
String fieldName = getFieldName();
Object value = this.getFieldValue(fieldName, object);

 if (value == null) ...{
addFieldError(fieldName, object);
}
}
在代码中大家可以看到这三个方法各司其职而且互不影响,举个例子吧:
如何你有一个action类中如此写:
 public class Hello extends ActionSupport ...{
private String name=null;
 public String execute() throws Exception ...{
// TODO Auto-generated method stub
return SUCCESS;
}

 public void setName(String n)...{
name = n;
}
 public String getName()...{
return name;
}
}
然后你在Hello-validation.xml中对字段name进行验证:
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="name">
<field-validator type="required" short-circuit="false">
<message>Name is required!</message>
</field-validator>
<field-validator type="requiredstring" short-circuit="false">
<message>Please enter the name!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">5</param>
<param name="maxLength">8</param>
<message>The length of name is between ${minLength} and ${maxLength}.</message>
</field-validator>
</field>
</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.
这就是这个三个验证方式相互协作的方式!
|