数据验证分为客户端验证和服务器端验证, Struts2框架的验证属于服务器端的验证
①编程式验证
在动作类中重写validate():
package com.rl.action;
import org.apache.struts2.interceptor.validation.SkipValidation;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.rl.model.Person;
/**
* ModelDriven的泛型就是需要接收的对象的类
* @author Administrator
*
*/
public class PersonAction1 extends ActionSupport implements ModelDriven<Person>{
/**
* 必须手动new一个对象
*/
private Person person = new Person();
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public String save(){
System.out.println(person);
return SUCCESS;
}
public String delete(){
System.out.println(person);
return SUCCESS;
}
/**
* 返回person对象即可
*/
@Override
public Person getModel() {
return person;
}
/**
* validate方法在封装参数之前做数据验证
* 如果验证不通过就跳转到表单页面
*/
public void validate() {
if(person.getId() == null || !(person.getId()+"").matches("\\d{1,5}")){
this.addFieldError("id", "id必须是1到5位的数字");
}
if(!person.getName().matches("[a-zA-Z]{3,8}")){
//添加提示信息, 参数①表单中文本域的name的值 参数②是提示信息
this.addFieldError("name", "姓名只能是3-8位大小写字母");
}
}
}
访问(什么都不填写的情况下):
结果:
注意: 此种方法默认是对该动作类中的所有方法都做校验的, 要想取消对某个/某些方法的校验有两种方法:
1 使用"@SkipValidation"注解:
@SkipValidation
public String delete(){
System.out.println(person);
return SUCCESS;
}
2 修改校验的方法名, 方法命名规则: validate+"要验证的方法名"(驼峰模式):
/**
* validate方法在封装参数之前做数据验证
* 如果验证不通过就跳转到表单页面
*/
public void validateSave() {
if(person.getId() == null || !(person.getId()+"").matches("\\d{1,5}")){
this.addFieldError("id", "id必须是1到5位的数字");
}
if(!person.getName().matches("[a-zA-Z]{3,8}")){
//添加提示信息, 参数①表单中文本域的name的值 参数②是提示信息
this.addFieldError("name", "姓名只能是3-8位大小写字母");
}
}
②声明式验证
将验证信息配置在xml文件中, 做到跟动作类分离, 以便后续可以修改, 该配置文件的命名规范: 动作类的名称+validation.xml
1 新建一个xml文件, 该配置文件必须建立在动作类的同级包下, 配置头信息:
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
"PersonAction1-validation.xml"配置文件:
<?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 name="name">
<!-- 文本域的验证器
requiredstring: 系统提供的校验器(此含义为必填)
-->
<field-validator type="requiredstring">
<!-- 错误信息
-->
<message>姓名不能为空</message>
</field-validator>
</field>
</validators>
动作类中去掉验证方法, 交给配置文件
访问结果:
系统提供的校验器有如下这些:
regex: 正则表达式校验器, 检查被校验的属性值是否匹配一个正则表达式
expression: OGNL表达式校验器, 他是一个非字段校验器, expression参数指定OGNL表达式, 该逻辑表达式基于valueStack(值栈)进行求值, 返回true时校验通过, 该校验器不可用在字段校验器风格配置中
int: 整数校验器, 要求filed的整数值必须在指定范围内, min指定最小值, max指定最大值
requiredstring: 必填字符串验证器, 要求属性值不能为空, 而且默认情况下会对左右两边去掉空字符串
required: 必填校验器, 要求属性值不能为空
stringlength: 字符串长度校验器, 要求被校验的属性值必须在指定的范围内, 否则校验失败, minLength参数指定最小长度, maxLength参数指定最大长度, trim参数指定校验field之前是否去除前后空字符串
double: 双精度浮点数校验器, 要求field的双精度浮点数必须在指定的范围内, min指定最小值, max指定最大值
fieldexpression: 字段OGNL表达式校验器, 要求field满足一个OGNL表达式, expression参数指定OGNL表达式, 该逻辑表达式基于valueStack进行求值, 返回true时校验通过
email: 邮件地址校验器, 要求如果被校验的属性值非空, 则必须是合法的邮件地址
url: 网址校验器, 要求如果被校验的属性值非空, 则必须是合法的url地址
date: 日期校验器, 要求field的日期值必须在指定的范围内, min指定最小值, max指定最大值
conversion: 转换校验器, 指定在类型转换失败时, 提示错误信息
visitor: 用于校验action中复合类型的属性, 它指定一个校验文件用于校验复合类型属性中的属性
regex举例1:
"PersonAction1-validation.xml"配置文件:
<?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 name="name">
<!-- 文本域的验证器
requiredstring: 系统提供的校验器(此含义为必填)
-->
<field-validator type="requiredstring">
<!-- 错误信息
-->
<message>姓名不能为空</message>
</field-validator>
<field-validator type="regex">
<param name="regex">[a-zA-Z]{3,8}</param>
<message>请输入3-8位的字母</message>
</field-validator>
</field>
</validators>
结果:
regex举例2:
"PersonAction1-validation.xml"配置文件:
<?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 name="name">
<!-- 文本域的验证器
requiredstring: 系统提供的校验器(此含义为必填)
-->
<field-validator type="requiredstring">
<!-- 错误信息
-->
<message>姓名不能为空</message>
</field-validator>
<field-validator type="regex">
<param name="regex">[a-zA-Z]{3,8}</param>
<message>请输入3-8位的字母</message>
</field-validator>
</field>
<!-- 第二种验证的配置方式
-->
<validator type="regex">
<!-- 配置验证的字段 -->
<param name="fieldName">password</param>
<!-- 配置验证的正则表达式 -->
<param name="regex">\d{6,8}</param>
<message>请输入6-8位的数字密码</message>
</validator>
</validators>
需要在Person类中添加几个字段, 我这边添加了password/rePassword/age三个字段
访问结果:
想要在让提示信息在右边显示, 需要在form表单中添加多一列展示错误信息的列
form1.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<form action="${pageContext.request.contextPath }/person/save" method="post">
<table>
<tr>
<td>ID</td>
<td>
<input type="text" name="id" >
</td>
<td><s:fielderror fieldName="id"></s:fielderror></td>
</tr>
<tr>
<td>名字</td>
<td>
<input type="text" name="name">
</td>
<td><s:fielderror fieldName="name"></s:fielderror></td>
</tr>
<tr>
<td>性别</td>
<td>
<input type="radio" name="gender" value="1">男
<input type="radio" name="gender" value="2">女
</td>
<td><s:fielderror fieldName="gender"></s:fielderror></td>
</tr>
<tr>
<td>地址</td>
<td>
<input type="text" name="address">
</td>
</tr>
<tr>
<td>生日</td>
<td>
<input type="text" name="birthday">
</td>
<td><s:fielderror fieldName="birthday"></s:fielderror></td>
</tr>
<tr>
<td>年龄</td>
<td>
<input type="text" name="age">
</td>
<td><s:fielderror fieldName="age"></s:fielderror></td>
</tr>
<tr>
<td>密码</td>
<td>
<input type="text" name="password">
</td>
<td><s:fielderror fieldName="password"></s:fielderror></td>
</tr>
<tr>
<td>重复密码</td>
<td>
<input type="text" name="rePassword">
</td>
<td><s:fielderror fieldName="rePassword"></s:fielderror></td>
</tr>
</table>
<input type="submit" value="提交">
</form>
</body>
</html>
expression举例:
<!-- 验证重复密码的正确性
-->
<validator type="expression">
<param name="fieldName">rePassword</param>
<!-- 如果不满足(password != rePassword
则抛出错误信息
-->
<param name="expression">password == rePassword</param>
<message>两次密码不一致</message>
</validator>
访问结果: