struts2框架中提供大量的内置校验器,使用时只需对这些校验进行配置,我们管这种方式叫做声明验证。其实这个流程和之前介绍的编程验证是一样的,可以参考之前输入验证的流程。
一.编写配置文件:
文件名为ActionClassName-validation.xml,与要验证属性的Action在同一目录下,编写验证的规则可以参见 struts-2.3.4/docs/WW/validation.html文档。
这些验证器的配置有两种方式:字段验证 和 非字段验证。字段验证字段优先,可以为一个字段配置多个验证规则;非字段验证验证规则优先,不只针对某个字段,而是针对多个字段的输入值之间的逻辑关系进行校验。
先以注册的逻辑为例看一下这两种方式(以requiredstring验证为例):Action类:
import com.opensymphony.xwork2.ActionSupport;
public class RegisterAction extends ActionSupport{
private static final long serialVersionUID = 1L;
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String execute() throws Exception {
System.out.println(name+password);
return SUCCESS;
}
}
配置action:
<action name="register" class="com.struts.validate.RegisterAction">
<result name="success">/success.jsp</result>
<result name="input">/register.jsp</result>
</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">
<validators>
<!-- 字段验证
<field name="name">
<field-validator type="requiredstring">
<message>姓名不能为空</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<message>密码不能为空</message>
</field-validator>
</field>
-->
<!-- 非字段验证 -->
<validator type="requiredstring">
<param name="fieldName">name</param>
<message>姓名不能为空</message>
</validator>
<validator type="requiredstring">
<param name="fieldName">password</param>
<message>密码不能为空</message>
</validator>
</validators>
jsp页面:
<s:form action="register">
<s:textfield name="name" label="name"></s:textfield>
<s:password name="password" label="password"></s:password>
<s:submit></s:submit>
</s:form>
两种配置方式的结果都一样:
那么我们可以比较一下这两种方式:
前面说过struts2中的转换器有两种配置方式,一种是基于字段转换,另一种是基于类型的转换。我觉得可以类比一下,字段验证先指定校验的属性,非字段验证先指定校验器。
Action类:
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class RegisterAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private String name;
private int age;
private Date birth;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String execute() throws Exception {
System.out.println("name="+name+" age="+age+" birth="+birth
+" email="+email);
return SUCCESS;
}
}
配置action:
<action name="regValidate" class="com.struts.validatetype.RegisterAction">
<result name="success">/success.jsp</result>
<result name="input">/regvalidate.jsp</result>
</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">
<validators>
<!-- 以下的例子都以基于字段验证为例 -->
<field name="name">
<!-- requiredstring:确保某给定字段的值既不是空值 null, 也不是空白.
trim 参数. 默认为 true, 表示 struts 在验证该字段值之前先剔除前后空格.
-->
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>姓名不能为空</message>
</field-validator>
<!-- stringlength: 验证一个非空的字段值是不是有足够的长度.
minLength: 相关字段的最小长度. 若没有给出这个参数, 该字段将没有最小长度限制
maxLength:相关字段的最大长度. 若没有给出这个参数, 该字段将没有最大长度限制
trim: 在验证之前是否去除前后空格
-->
<field-validator type="stringlength">
<param name="maxLength">15</param>
<param name="minLength">6</param>
<message>姓名长度在${minLength}与${maxLength}之间</message>
</field-validator>
</field>
<field name="age">
<!-- int:检查给定整数字段值是否在某一个范围内
min: 相关字段的最小值. 若没给出这个参数, 该字段将没有最小值限制
max: 相关字段的最大值. 若没给出这个参数, 该字段将没有最大值限制
-->
<field-validator type="int">
<param name="max">30</param>
<param name="min">20</param>
<message>年龄必须在${min}与${max}之间</message>
</field-validator>
</field>
<field name="birth">
<!-- date: 确保某给定日期字段的值落在一个给定的范围内
max:相关字段的最大值. 若没给出这个参数, 该字段将没有最大值限制
min:相关字段的最小值. 若没给出这个参数, 该字段将没有最小值限制 -->
<field-validator type="date">
<param name="min">1970-1-1</param>
<param name="max">2000-12-12</param>
<message>生日应在${min}与${max}之间</message>
</field-validator>
</field>
<field name="email">
<!-- email: 检查给定 String 值是否是一个合法的 email -->
<field-validator type="email">
<message>邮箱格式错误</message>
</field-validator>
</field>
</validators>
jsp页面:
<s:form action="regValidate">
<s:textfield name="name" label="name"></s:textfield>
<s:textfield name="age" label="age"></s:textfield>
<s:textfield name="birth" label="birth"></s:textfield>
<s:textfield name="email" label="email"></s:textfield>
<s:submit></s:submit>
</s:form>
显示结果:
三.声明式验证框架的原理:
struts2 默认的拦截器栈中提供了一个 validation 拦截器,每个具体的验证规则都会对应具体的一个验证器. 有一个配置文件把验证规则名称和验证器关联起来了. 而实际上验证的是那个验证器. 该文件是com.opensymphony.xwork2.validator.validators 下的 default.xml,
截图:
声明式校验的基本配置和几种常用的校验器就总结到这,之后会一一介绍一些特殊的验证及自定义验证器,fight!!!