今天学习了一下Struts2验证框架,整理了点知识点。
1、 注册验证类型
Struts2为不同的验证要求提供不同的验证类型。一个验证类型,一般是有一个类来提供。这个类必须实现接口:com.opensymphony.xwork.validator.Validator,但我们在写自己的验证类型时,无需直接实现Validator接口,它有抽象类可供直接使用如ValidatorSupport、FieldValidatorSupport等。
验证类型在使用之前,必须要在ValidatorFactory(com.opensymphony.xwork.validator. ValidatorFactory)中注册。使用配置文件validators.xml进行注册,要求把文件validators.xml放到ClassPath的跟目录中(/WEB-INF/classes)。我们的验证类型注册如下:
<validators>
<validator name="required" class="com.opensymphony.xwork.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork.validator.validators.RequiredStringValidator"/>
<validator name="int" class="com.opensymphony.xwork.validator.validators.IntRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork.validator.validators.EmailValidator"/>
<validator name="url" class="com.opensymphony.xwork.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork.validator.validators.ConversionErrorFieldValidator"/>
<validator name="stringlength" class="com.opensymphony.xwork.validator.validators.StringLengthFieldValidator"/>
</validators>
注册验证类型的配置文件非常简单。它使用标签<validator>提供名-值对的形式注册。这样我们的验证文件就可以直接引用它的名字。
2、 开启Action的验证功能
如果Action要使用验证框架的验证功能,它必须在配置文件中指定拦截器“validation”,它的定义如下:
<interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>。
我们的验证文件必须以ActionName-validation.xml格式命名,它必须被放置到与这个Action相同的包中。你也可以为这个Action通过别名的方式指定验证文件,它的命名格式为:ActionName-aliasname-validation.xml。“ActionName ”是我们Action的类名;“aliasname”是我们在配置文件(Struts.xml)中定义这个Action所用到的名称。这样,同一个Action类,在配置文件中的不同定义就可以对应不同的验证文件。验证框架也会根据Action的继承结构去查找Action的父类验证文件,如果找到它会去执行这个父类的验证。例如:BugAction-save-validation.xml,其中save为配置文件中定义的action 名称。
3、 实现验证文件:BugAction-save-validation.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!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="bug.summary">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="invalid.summary" />
</field-validator>
</field>
<!-- 所属项目 -->
<field name="bug.projectid">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="invalid.projectid" />
</field-validator>
</field>
</validators>说明:
1)、<field>标签代表一个字段,它的属性“name”和页面输入框的“name”属性必需完全一致,其实它也就是我们的表达式语言。
2)、<field-validator>标签定义我们的验证规则,type属性的值就是就是我们前面定义的验证类型。
3)、验证文件中,字段的数据是通过表达式语言从我们的值堆栈(OgnlValueStack)中取得,一般是Action或Model对象。例如:我们的字段“user.age”,它会通过Action的getUser().getAge()来取得用户输入的年龄,再来根据验证的类型“int”和最大值最小值的参数来判断输入的数据是否能通过验证。
4)、不管验证是否通过,我们的Action都会执行,但如果验证没有通过,它不会调用Action的execute()方法。
4、 显示Action的验证错误信息
如果用户输入的数据验证没有通过,我们需重新返回输入页面,并给出错误信息提示。拦截器“validation”为我们实现了这个功能。它首先验证用户输入的数据,如果验证没有通过将不执行我们Action的execute()方法,而是将请求重新返回到输入页面。
Struts.xml配置如下:
<action name="addsave" class="com.bug.bug.BugAction"
method="create">
<result type="chain">list</result>
<result name="input" >/bug/bug/edit.jsp</result>
</action>
错误信息也就是我们验证文件中<message>标签里的数据。ActionSupport类已实现了此接口,这样在应用中我们的Action只要继承ActionSupport类就可以了。
我们在jsp页面显示错误提示信息,如下:
<div style="color:red;">
<s:fielderror />表单校验遇到的问题
<s:actionmessage/>action中的提示信息
<s:actionerror/>action中的错误信息
<s:property value="OurWorkMessage" /> 是自定义的。
</div>
<!--EndFragment--> <!--EndFragment-->