概述
Struts2 的数据校验属于服务器端校验,Struts2 支持如下两种校验方式 :
- 手动校验(代码校验):在服务器端通过编写 Java 代码,完成数据校验。
- 自动校验(配置校验):XML 配置校验(主流)和 注解配置校验
示例
手动编码方式
例 1:对整个 Action 进行校验
import com.opensymphony.xwork2.ActionSupport;
public class Test1Action extends ActionSupport {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public String execute() throws Exception {
System.out.println(".................");
return super.execute();
}
/**
* 编写一个类,继承 ActionSupport,重写 validate 方法
* 每次请求此 Action 都会先执行 validate 方法
* 如果验证有错误,将错误通过 this.addFieldError 或 this.addActionError 交给 Struts2
* 然后 Struts2 会返回 input 逻辑视图,手动定义好 input 跳转到的页面
* 在页面可以通过 <s:actionerror/> <s:fielderror/> 标签获取到错误信息
*/
@Override
public void validate() {
if(name == null || name.trim().length() == 0){
this.addFieldError("name","用户名不能为空");
}
}
}
例 2:对 Action 中指定方法进行校验
import com.opensymphony.xwork2.ActionSupport;
public class Test2Action extends ActionSupport {
private String name;
public void setName(String name) {
this.name = name;
}
public String add() {
System.out.println("from add....");
return SUCCESS;
}
/**
* 编写一个类,继承 ActionSupport
* 如果要给指定的方法校验,需要按规则定义一个方法:
* 校验的方法名要遵循:validate+方法名首字母大写
* 如下,要给 add 方法校验,定义的方法名就为 validateAdd
* 然后每次请求这个方法就会限制性校验方法
* 如果验证有错误,将错误通过 this.addFieldError 或 this.addActionError 交给 Struts2
* 然后 Struts2 会返回 input 逻辑视图,手动定义好 input 跳转到的页面
* 在页面可以通过 <s:actionerror/> <s:fielderror/> 标签获取到错误信息
*/
public void validateAdd() {
System.out.println("from validateAdd...");
}
}
配置文件方式
例 1:对整个 Action 进行校验
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<!--
1、在 Action 所在包下创建一个 xml 文件,名称为 Action类名-validation.xml
如 : 此文件是给名为 Test3Action 的 Action 校验,文件名则为 Test3Action-validation.xml
2、引入 DTD 约束,该约束可在 xwork-core-2.3.37.jar!/xwork-validator-1.0.3.dtd 下找到
-->
<validators>
<!--
name : 要校验的字段名
注意:需要获取到值才能对字段进行校验,所以在 Action 中要给对应字段提供 get 方法。
-->
<field name="name">
<!--
type : Struts2 已经给我们提供了很多验证器
在 xwork-core-2.3.37.jar!/com/opensymphony/xwork2/validator/validators/default.xml 中可以看到
-->
<field-validator type="requiredstring">
<!--返回的错误信息-->
<message>用户名不能为空</message>
</field-validator>
</field>
</validators>
例 2:对 Action 中指定方法进行校验
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<!--
1、在 Action 所在包下创建一个 xml 文件,名称为 Action类名-方法访问路径-validation.xml
如 : 此文件只给名为 Test4Action 的 Action 下的 add 方法校验,
Struts.xml 对应Action 配置为 <action name="*_*" class="com.zze.action.{1}Action" method="{2}">
文件名则为 Test4Action-Test4_add-validation.xml
2、引入 DTD 约束,该约束可在 xwork-core-2.3.37.jar!/xwork-validator-1.0.3.dtd 下找到
-->
<validators>
<!--
name : 要校验的字段名
注意:需要获取到值才能对字段进行校验,所以在 Action 中要给对应字段提供 get 方法。
-->
<field name="name">
<!--
type : Struts2 已经给我们提供了很多验证器
在 xwork-core-2.3.37.jar!/com/opensymphony/xwork2/validator/validators/default.xml 中可以看到
-->
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">12</param>
<!--返回的错误信息-->
<message>用户名必须在6-12位之间</message>
</field-validator>
</field>
</validators>
补充
Struts2 内置的校验器
<!-- xwork-core-2.3.37.jar!/com/opensymphony/xwork2/validator/validators/default.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>
<!--必填校验器,要求被校验的属性值不能为 null-->
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<!--必填字符串校验器,要求被校验的属性值不能为 null,并且长度大于 0 ,默认情况下不会对字符串去前后空格-->
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<!--数值校验器,要求被校验的属性值可转 int ,且可指定范围,min 指定最小值,max 指定最大值-->
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<!--数值校验器,要求被校验的属性值可转 long,且可指定范围,min 指定最小值,max 指定最大值-->
<validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
<!--数值校验器,要求被校验的属性值可转 short,且可指定范围,min 指定最小值,max 指定最大值-->
<validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
<!--数值校验器,要求被校验的属性值可转 double,且可指定范围,min 指定最小值,max 指定最大值-->
<validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
<!--日期校验器,要求被校验的属性值可转 Date,且可指定范围,min 指定最小值,max 指定最大值-->
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<!--OGNL表达式校验器,它是一个非属性校验器,expression 指定 ognl 表达式,该逻辑表达式基于 ValueStack进行求值,返回 true 时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中-->
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<!--字段OGNL表达式校验器,要求被校验的属性值满足一个 OGNL 表达式,expression 参数指定 OGNL 表达式,该逻辑表达式基于 ValueStack进行求值,返回 true 时校验通过,否则不通过-->
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<!--邮件地址校验器,要求如果被校验的属性值非空,则必须是合法的邮件地址-->
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<!--网址校验器,要求如果被校验的属性值非空,则必须是合法的 url 地址-->
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<!--用于校验 Action 中符合类型的属性,它指定一个校验文件用于校验复合类型属性中的属性-->
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<!--转换校验器,指定在类型转换失败时,提示的错误消息-->
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<!--字符串长度校验器,要求被校验的属性值必须在指定的范围内,否则校验失败,minLength 指定最小长度,maxLength 指定最大长度,trim 指定交验之前是否去除字符串前后空格-->
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
<!--正则表达式校验器,检查被校验的属性值是否匹配一个正则表达式,expression 指定正则表达式,caseSensitive 指定进行正则表达式匹配时,是否区分大小写,默认为 true-->
<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
<validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>
自定义校验器
1、创建一个校验器类。
// com.zze.validator.AgeValidator
package com.zze.validator;
import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;
/**
* 对指定字段进行过滤
*
* 除了继承 FieldValidatorSupport
* 还可以继承 ValidatorSupport
*/
public class AgeValidator extends FieldValidatorSupport {
@Override
public void validate(Object object) throws ValidationException {
// 获得字段名称
String fieldName = this.getFieldName();
Object fieldValue = this.getFieldValue(fieldName, object);
if(fieldValue instanceof Integer){
int age = (Integer)fieldValue;
if(age<0){
this.addFieldError(fieldName,object);
}
}
}
}
2、注册校验器。
<!-- 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">
<!--在 src 下新建 validators.xml -->
<validators>
<!--注册验证器-->
<validator name="ageValidator" class="com.zze.validator.AgeValidator"/>
</validators>
评论区