编写自己的验证器首先要实现Validator接口,它是com.opensymphony.xwork2.validator包的一部分。
Validator包的定义如下:
import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.ValidatorContext;
public interface Validator {
void setDefaultMessage(String message);
String getDefaultMessage();
String getMessage(Object object);
void setMessage(String key);
String getMessageKey();
void setValidatorType(String type);
String getValidatorType();
void setVallidatorContext(ValidatorContext validatorContext);
ValidatorContext getValidatorContext();
void validate(Object object) throws ValidationException;
}
Validation拦截器负责加载执行各种验证程序。从上述源码中,可以知道在validation拦截器中加载一个验证程序后,这个拦截器将调用那个验证程序的setValidatorContext方法,并把当前的ValidatorContext对象传递给它,这样我们可以访问当前动作。接下来,Validation拦截器将调用validate方法并把需要验证的对象传递给他。validate方法是编写一个自定义的验证程序需要覆盖的方法。
对便捷类ValidatorSupport或FieldValidatorSupport进行扩展要比自行实现Validator接口容易的多。如果要创建一个普通的验证程序,就扩展ValidatorSupport类,如果要编写一个字段验证程序,就要扩展FieldValidatorSupport类。
如果要设计的验证程序能够接受一个输入参数,需要为这个参数增加一个相应的属性,例如,如果验证程序允许一个minValue参数,还需要增加一个名为minValue的属性,并未它编写getter,setter方法。
2.ValidatorSupport类
在ValidatorSupport类中增加了几个方法:
1)protected java.lang.Object getFieldValue(java.lang.String name,java.lang.Object object) throws ValidationException;
作用:它返回Object对象的name字段的值
2)protected void addActionError(java.lang.Object actionError):这个方法的主要功能是增加一个动作错误信息。
3)protected void addFieldError(java.lanlg.String propertyName,java.lang.Object object):这个方法的主要功能是增加一个字段错误信息。
3.RequiredStringValidator类
import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.ValidatorContext;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;
public class RequiredStringValidator extends FieldValidatorSupport{
private boolean doTrim=true;
public boolean isTrim() {
return doTrim;
}
public void setTrim(boolean doTrim) {
this.doTrim = doTrim;
}
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);
}
}
}
}