日期:2014-05-20 浏览次数:21215 次
struts2的核心是从webwork演变来的,其数据验证框架其实就是原webwork的那一套东西。
一,Struts2数据验证的整体框架介绍
struts2的action都要继承ActionSupprot类,这个类实现了Validateable与ValidationAware这两个跟数据验证有关的接口。其中Validateable只有一个方法validate()用于数据验证;ValidationAware?则用于记录验证出错时的相关信息。
而数据验证在什么时候被调用呢?数据验证的调用是包装在workflow拦截器里,
我们看看workflow拦截器在struts_default.xml中的定义,它是放在默认的defaultStack拦截器组里,相关顺序如下:
?
<interceptor-ref name="params"/> <interceptor-ref name="conversionError"/> <interceptor-ref name="validation"/> <interceptor-ref name="workflow"/> |
params与conversionError这两个拦截器在workflow的前面,它们的工作是从request中把数据转成正确的Java类型数据,以供后面处理。validation拦截器实质是AnnotationValidationInterceptor与我们这里谈的数据验证不是一回事,它只判断有没有@SkipValidation注解,如果有就不会路过数据验证,只是起一个开关作用。
当workflow拦截器触发时,它先检查当前请求的action是否实现了Validateable接口,如果实现了该接口,则调用 validate()方法:如果这个方法处理时发现有数据验证不通过,则会生成一个错误信息并交给ValidationAware的方法去存储这些出错信息。当validate()方法执行完毕,workflow拦截器还要调用ValidationAware的hasErrors()方法,看看是否有出错信息生成,如果有出错信息,就中断当前action的执行流程,返回"input"字符串,一般我们是在配置文件struts.xml里配置"input"返回结果的跳转页面。
二,数据验证的方式
1,在action类里实现validate()方法
这是最简单的方法了,直接在actionClass中实现Validateable接口的方法,如:
? public class RegUser? extends ActionSupport? { ????? return SUCCESS;??????????????? |
? 配置文件: |
把所有的判断逻辑直接写到action类里,如果有验证错误,直接返回"input"。
2,使用xml配置文件:ActionClass-validations.xml
其实struts2已经内置了一些基本的数据验证,完全可以省去我们日常的一些数据验证需求,通过配置文件的方式。
在ActionClass所在的目录下,新建一个以ActionClass名字组合成的特定xml:ActionClass-validations.xml(例,我的ActionClass名为RegUser,则我应该在同目录下建一名为RegUser-validations.xml的文件),其内容如下:
<?xml version="1.0″ encoding="UTF-8″?> |
? 以下是目前struts2所支持的内置的验证器说明,我们可以直接在xml文件里声明拿来使用:
?
3,使用自己定义的验证器做数据验证
public class PasswordIntegrityValidator ?extends?FieldValidatorSupport?{?
?? static Pattern digitPattern = Pattern.compile( "[0-9]"); ? ? ? ? ? ? ? ? ??
?? static Pattern letterPattern = Pattern.compile( "[a-zA-Z]"); ? ? ? ? ? ??
?? static Pattern specialCharsDefaultPattern = Pattern.compile( "!@#$");
?? public void?validate(Object object) throws ValidationException {
?? ? ?String fieldName =?getFieldName(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?? ? ?String fieldValue = (String)?getFieldValue(fieldName, object );
?? ? ?fieldValue = fieldValue.trim(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?? ? ?Matcher digitMatcher = digitPattern.matcher(fieldValue); ? ? ??
?? ? ?Matcher letterMatcher = letterPattern.matcher(fieldValue); ? ? ??
?? ? ?Matcher specialCharacterMatcher; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?? ? ?if ( getSpecialCharacters() != null ){ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?? ? ? ? Pattern specialPattern =?
?? ? ? ? ? ? ? ? ? ? Pattern.compile("[" + getSpecialCharacters() + "]" ); ? ?
?? ? ? ? specialCharacterMatcher = specialPattern.matcher( fieldValue );
?? ? ?} else{
?? ? ? ? specialCharacterMatcher =?
?? ? ? ? ? ? ? ? ? ? specialCharsDefaultPattern.matcher( fieldValue ); ? ? ? ?
?? ? ?}
?? ? ?if ( !digitMatcher.find() ) { ? ? ? ? ? ? ? ? ? ? ? ??
?? ? ? ??addFieldError( fieldName, object ); ? ? ? ? ? ??
?? ? ?}else if ( !letterMatcher.find() ) { ? ? ? ? ? ? ??
?? ? ? ??addFieldError( fieldName, object ); ? ? ? ? ? ?
?? ? ?}else if ( !specialCharacterMatcher.find() ) {
?? ? ? ??addFieldError( fieldName, object ); ? ? ? ? ? ?
?}
?? }
?? private String specialCharacters;
?? public String getSpecialCharacters() {
return specialCharacters;
}
?? ?public void setSpecialCharacters(String specialCharacters) {
this.specialCharacters = specialCharacters;
}
}
|
?
?
?