这是Webwork2.0中类FieldValidatorSupport中对字段进行验证validate的方法代码:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5CdyFGdTt2YvxmQkVGZuFGc4V0LcNncvRXYjlGZul0ZulmbpxGd190LcdmbpRHanlGbodWaohXY05Wez9CX0Vmbu4GZzNmLzV2Zh1Wavw1LcpDc0RHaiojIsJye.gif)
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方法:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5CdyFGdTt2YvxmQkVGZuFGc4V0LcNncvRXYjlGZul0ZulmbpxGd190LcdmbpRHanlGbodWaohXY05Wez9CX0Vmbu4GZzNmLzV2Zh1Wavw1LcpDc0RHaiojIsJye.gif)
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方法
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5CdyFGdTt2YvxmQkVGZuFGc4V0LcNncvRXYjlGZul0ZulmbpxGd190LcdmbpRHanlGbodWaohXY05Wez9CX0Vmbu4GZzNmLzV2Zh1Wavw1LcpDc0RHaiojIsJye.gif)
public void validate(Object object) throws ValidationException ... {
String fieldName = getFieldName();
Object value = this.getFieldValue(fieldName, object);
if (value == null) ...{
addFieldError(fieldName, object);
}
}
在代码中大家可以看到这三个方法各司其职而且互不影响,举个例子吧:
如何你有一个action类中如此写:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5CdyFGdTt2YvxmQkVGZuFGc4V0LcNncvRXYjlGZul0ZulmbpxGd190LcdmbpRHanlGbodWaohXY05Wez9CX0Vmbu4GZzNmLzV2Zh1Wavw1LcpDc0RHaiojIsJye.gif)
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.
这就是这个三个验证方式相互协作的方式!