我们可以使用XML文件和注解的方式来使用验证框架,当然我们还可以在Action中结合自己的代码使用.这个框架需要validation和workflow这两个拦截器和拦截器,这两个拦截器都已经在defaultStack中配置了.validation验证之后,如果有不通过的情况下,会创建相应的属性error,workflow 将检查是否有错误,如果有错误,将返回默认的input result,将用户带回到相应的输入界面.
如果我们使用了默认配置,没有配置input result ,并且有验证错误(偶然还有类型转换错误),那么我们将得到一个错误消息---there's no "input" result defined for the action.
validation 利用的是validator 验证器来进行验证的,因此我们需要将验证器注册到ValidatorFactory(通过registerValidator 方法),最简单的方法是在web-inf/classes下添加一个validators.xml文件,将我们需要的验证器都添加进来.
下面的这些验证器是struts2已经注册的,如果我需要添加自己的验证器,可以照这个例子进行添加.
validators.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator Definition 1.0//EN" "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd"> <validators> <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/> <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/> <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/> <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/> <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/> <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/> <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/> <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/> <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/> <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/> <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/> <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/> <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/> <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/> <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/> <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/> </validators>
<interceptor-stack name="defaultStack"> ... <interceptor-ref name="validation"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> </interceptor-stack>
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
这个拦截器可以让我们使用注解
@org.apache.struts2.interceptor.validation.SkipValidation
来忽略验证action的某个方法.