数据校验
数据校验是程序中最常见的模块。数据校验的目的就是保证用户输入是合法、有效的。常见数据校验分三种:
1. 前台通过JavaScript校验(客户端校验);
特点:① 减少客户等待时间;② 减少服务器压力
2. 后台代码校验(服务端校验);
① 防止”绕过”客户端验证提交非法数据。② 可以在服务端处理数据前确保数据的合法性
3. 数据库校验(约束,非空等);在程序中能够使用第一种校验就使用第一种,第一种不能够完全校验采取第二种,尽可能不要用第三种校验;因为数据库资源十分珍贵。
struts2 数据校验
struts2 验证分两种:一种使用ActionSupport 编码实现验证。另外一种使用验证框架实现验证;
1. ActionSupport 实现验证
1.1 在业务方法中实现验证
1. 用ActionSupport实现验证
1. 在Action类的业务方法中直接验证
2. 重写validate()方法
3. 使用validateXxx()方法
2. 添加错误信息
addFieldError(String fieldName,String errorMessage) addFieldError用来添加字段相关的错误信息(用户名字段为空,年龄字段值不合理)
ddActionError(String anErrorMessage) addActionError添加与Action所处理业务相关的错误信息(用户名密码都填了,但填的不正确,无法登录)
3. 在页面输出验证结果
<!-- 输出一个或所有字段错误信息 -->
<s:fielderror/>
<!-- 输出所有Action的错误信 -->
<s:actionerror/>
<!-- 输出指定某个错误信息 -->
<s:fielderror>
<s:param>errorKey</s:param>
</s:fielderror>
4. <action>的配置
<result name="input">xxx.jsp</result>
Action 中通过hasErrors() , hasFieldErrors() , hasActionErrors() 来判断是否有错误信息
Action类
public String add1() {
System.out.println("-------add1----");
if (perion.getPname() == "") {
addFieldError("pname", "账号不能为空!");
}
if ("" == perion.getPwd() || perion.getPwd().length() < 6) {
addFieldError("pwd", "密码不能够为空且密码长度不能够小于6");
}
if (perion.getAge() < 18 || perion.getAge() > 25) {
addFieldError("age", "年龄不合法,必须在(18-25)之间");
}
if (hasFieldErrors()) {
return INPUT;
}
// 持久化操作
return SUCCESS;
}
struts.xml
<action name="addPersion" class="com.javaee.struts2.action.PersionAction">
<result>/show.jsp</result>
<result name="input">/index.jsp</result>
</action>
JSP
<s:fielderror />
<s:fielderror>
<s:param>age</s:param>
</s:fielderror>
<s:form action="addPersion!add1" method="post">
<s:textfield name="pname" value="zhagnsan" label="账号" />
<s:textfield name="pwd" label="密码" value="123" />
<s:radio name="sex" list="{'男','女','人妖'}" label="性别" />
<s:textfield name="age" label="年龄" value="14" />
<s:select name="city" list="{'北京','天津','上海','重庆'}" label="城市" />
<s:submit value="注册" />
</s:form>
1.2 使用validate()方法实现验证
使用使用validate() 方法验证步骤:
1. 重写ActionSupper 类的 validate()方法
2. 在validate() 方法中实现验证
3. 将数据验证和业务处理分离
4. 添加与现实信息的方式不变
小经验
1. 接收参数时, 数据转换失败也会调用validate()方法。
2. validate()方法验证不通过,不会执行业务方法。
1.3 使用validateXxx()方法实现验证
validate()方法验证会对Action中所有的方法起作用,如果在实际需求中只需要对某个方法进行验证就需要使用validateXxx()方法进行数据校验。
validateXxx()方法验证:
1. struts2支持validateXxx()方法针对xxx()方法进行数据验证
2. 使用validateRegister()方法实现针对register方法进行数据验证
小经验
1. validate()方法和validateXxx()方法同时存在时都会起作用
2. validateXxx()方法的调用优先于validate()方法
总结
1. 在Action中添加错误信息
addFielError(errorKey,errorValue);
addActionError(errorValue);
2. 在页面显示错误信息
输出一个或所有字段的错误信息
输出所有Action的错误信息
3. 实现验证位置
在业务方法中直接实现数据校验
在validate() 方法中实现数据校验
在validateXxx() 方法中实现数据校验
2. 使用验证框架进行验证
使用验证框架验证优点
1. 验证部分复用、扩展容易
2. 验证和业务处理分离
使用验证框架步骤
1. 编写JSP页面
2. 编写Action及其配置文件
3. 在Action类同目录下创建ActionName-validation.xml文件
ActionName 必须与Action类的名字一致
-validation.xml 属于固定写法
4. 编写验证规则
2.1 使用ActionName-validation.xml 实现验证
struts2的几个常用的验证类
验证规则 | 规则说明 |
---|---|
required | 字段不能为空 |
requiredstring | 字符串不能为空 |
int | int类型(可指定范围) |
long | long类型(可指定范围) |
short | short类型(可指定范围) |
double | double类型(可指定范围) |
date | 时间格式(可指定范围) |
expression | ognl表达式判断 |
fieldexpression | ognl表达式判断 |
邮箱判断 | |
url | url路径判断 |
visitor | 把同一个验证程序配置文件用于多个动作(对一个Bean写验证文件,每个使用的Action只要引用) |
conversion | 格式转换 |
stringlength | 字符串长度 |
regex | 正则表达式判断 |
2.2 使用ActionName-alias-validation.xml进行证
ActionName-validation.xml 对Action类中所有的业务方法都生效。如果只想验证某一个业务方法就需要使用ActionName-alias-validation.xml 进行验证
注意:alias 是struts.xml配置的Action的name名字不是方法名称
小结
1. ActionName-validation.xml 可对Action类中所有业务方法起作用
2. ActionName-alias-validation.xml 只针对Action类中某一个业务方法起作用
3. 以上两个文件都存在时,两个验证都起作用
验证顺序
1. Action父类-validation.xml
2. Action父类-alias-validation.xml
3. Action类-validation.xml
4. Action类-alias-validation.xml
总结
1. 使用ActionSupper实现验证有三种方式
1. 在业务方法里面实现数据校验
2. 在validate()方法中实现数据校验
3. 在validateXxx()方法中实现数据校验
2. Action类中添加错误信息有两种方式
1. 使用addFieldError() 添加字段错误信息
2. 使用addActionError() 方法添加Action业务相关的错误信息
3. 使用验证框架验证
1. ActionName-validation.xml
2. ActionName-alias-validation.xml
3. 验证框架规则看考帮助文档
4. 显示错误信息
1. 输出一个或所有字段错误
2. 输出所有Action的错误信息