我们可以使用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>
注意:如果是Struts 2.0.7 和之前的版本,则我们在自己定义验证器的同时,还要将默认的这些验证器也复制进来.
打开验证功能
默认的拦截器栈 defaultStack已经配置了validation拦截器,如果我们自己定义拦截器栈的话,则需要将validation 和workfolw两个拦截器加进来.
在struts-default.xml中定义的:
<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>
从2.0.4版本开始,struts2提供了一个继承自com.opensymphony.xwork2.validator.ValidationInterceptor的拦截器
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
这个拦截器可以让我们使用注解 @org.apache.struts2.interceptor.validation.SkipValidation来忽略验证action的某个方法.验证器的作用范围
Field validators --- 故名思义,这个验证器作用在action 的某个属性上.验证器能够在整个action 的上下文中生效,能涉及到action的一个属性或多个(或者根本没有),大多数的验证器都能在属性的基础上定义.我们应尽可能使用这种验证器,因为属性验证信息可以绑定到相应的属性上,并且将会传递到视图中相应的表单元素中.
Non-field validators --- 非属性的验证器只能添加action级别的信息,表达式验证器是最重要的验证器,这个验证已经在xwork中提供了.
注意:
非属性的验证器优先于属性验证器,并且忽略在*-validation.xml中的定义顺序.如果一个非属性的验证器短路,则将导致属性验证器失效.