Strusts2笔记5--数据验证
数据验证:
输入验证分为客户端验证与服务器端验证。客户端验证主要通过JavaScript脚本进行,而服务器端验证主要是通过Java代码进行验证。
分为以下四种情况:
(1)手工编写代码,对Action中所有方法执行前的验证:
自定义的Action要继承自ActionSupport,并且覆盖validate方法,覆盖的方法如下:
@Override
public void validate() {
if (name == null || "".equals(name)) {
//当fieldErrors集合的size()大于0时,会自动跳转你到input视图
this.addFieldError(name, "用户名不能为空");
}
if (mobile == null || "".equals(mobile)) {
this.addFieldError(mobile, "手机号不能为空");
} else if (!Pattern.matches("^1[34578]\\d{9}$", mobile)) {
this.addFieldError(mobile, "手机号码格式不正确!");
}
}
注意:ActionSupport类中有个addFieldEorror方法,它调用的是ValidationAwareSupport类中的addFieldEorror方法,方法如下:
public synchronized void addFieldError(String fieldName, String errorMessage) {
//相当于一个属性name,可以对应多个错误信息errorMessage
final Map<String, List<String>> errors = internalGetFieldErrors();
List<String> thisFieldErrors = errors.get(fieldName);
if (thisFieldErrors == null) {
thisFieldErrors = new ArrayList<String>();
errors.put(fieldName, thisFieldErrors);
}
thisFieldErrors.add(errorMessage);
}
其中,internalGetFieldErrors()初始化了一个LinkedHashMap类型的fieldErrors,如果这个集合不为空,则会自动跳转到input视图。因此要在struts2.xml中配置input视图,同数据类型转换中数据回显时的配置。
表单提交的前端代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%> <html>
<head>
<title>index page</title>
</head> <body>
<s:fielderror/>
<form action="test/login_doSome.action" method="POST">
用户名:<input type="text" name="name"/><br>
手机号码:<input type="text" name="mobile"/><br>
<input type="submit" value="提交"/>
</form>
<!-- 数据回显怎么解决??? -->
</body>
</html>
注意:<s:fielderror/>即可
(2)手工编写代码,对Action中指定方法执行前的验证:
同第一种情况相比,只需要改变validation方法的名称,其他均不变,代码如下:
public void validateDoSome() {
if (name == null || "".equals(name)) {
//当fieldError集合的size()大于0时,会自动跳转你到input视图
this.addFieldError(name, "用户名不能为空");
}
if (mobile == null || "".equals(mobile)) {
this.addFieldError(mobile, "手机号不能为空");
} else if (!Pattern.matches("^1[34578]\\d{9}$", mobile)) {
this.addFieldError(mobile, "手机号码格式不正确!");
}
}
此例是验证执行方法doSome,因此命名方式是validateDoSome。
(3)基于XML配置方式,对Action中所有方法执行前的验证:
在Action类所在的包中放入一个XML配置文件,该文件的取名应遵守 ActionClassName-validation.xml 规则。该文件的文件头部,需要配置约束,该约束可以在xwork-core-2.3.24.jar的根下xwork-validator-1.0.3.dtd中可以找到。该文件代码如下:
<?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">
<!-- <param name="trim">true</param> -->
<message>用户名不能为空!</message>
</field-validator>
</field>
<field name="mobile">
<field-validator type="requiredstring">
<message>手机号不能为空!</message>
</field-validator>
<field-validator type="regex">
<param name="regex"><![CDATA[^1[34578]\d{9}$]]></param>
<message>手机号格式不正确!</message>
</field-validator>
</field>
</validators>
解析:<field name="name">,对应的是需要验证的属性;
<field-validator type="requiredstring">,对应的是验证器类型,在xwork-core-2.3.24.jar的com.opensymphony.xwork2.validator.validators的根下default.xml中可以找到所有验证器类型
<param name="regex"><![CDATA[^1[34578]\d{9}$]]></param>,对应的是验证器类中的属性,查找相应的类即可知道,前面注释掉的代码,是因为trim属性默认是true,所以不用写了。
<message>手机号格式不正确!</message>,对应错误提示信息。
(4)基于XML配置方式,对Action中指定方法执行前的验证:
将上述文件的取名该为,遵守 ActionClassName-ActionName-validation.xml 规则,比如LoginAction-login_doSome-validation.xml。其他均不变。
补充:
(1)常用验证器用法(引用自北京动力节点):



(2)输入验证的执行流程:
若以上四种输入验证方式均进行了设置,则其执行顺序如下:
首先执行基于XML的验证,系统按照 ActionClassName-validaition.xml 、 ActionClassName-ActionName-validaition.xml 的顺序寻找校验文件,也就是说后者会覆盖前者;接下来,执行Action中的validateXxx()方法,执行Action中的validate()方法,前者的优先级高。
(3)Action类的执行原理及顺序:
(1)类型转换:
类型转换失败实在Action调用相应属性的set方法之前发生的,类型转换失败,不影响程序的运行。
(2)set方法:
无论类型转换是否成功,都将执行该属性的set方法。只不过,类型转换失败,会设置该属性值为null。
(3)数据验证:
若对于类型转换失败的数据,程序中存在为null的验证,则会在向fieldErrors集合中加入类型转换异常信息的同时,将该属性为null的验证信息也加入fieldErrors集合.
(4)Action方法:
只有当fieldErrors集合的size为0,即没有异常信息时,才会执行Action方法。
Strusts2笔记5--数据验证的更多相关文章
- ThinkPHP 学习笔记 ( 五 ) 数据验证
根据官网的教程 ( http://www.thinkphp.cn/info/171.html ),数据验证的使用静态定义方式 ( 以 regex 为例 ) 无法验证数据: 而采用动态验证则正常: 控制 ...
- asp.net core mvc视频A:笔记4-1.数据验证
开发建议:永远不要相信客户端提交过来的数据!!! 前端数据验证定位:提高用户体验,仅此而已! 后端数据验证定位:保证系统安全与数据完整!!! 实例:用户登录验证 定义一个用户登录类 在用户登录类基础上 ...
- c# MVC模式学习笔记_数据验证
改变显示字段名称 设计字段规范 1.引用 using System.ComponentModel; using System.ComponentModel.DataAnnotations; 2.Dis ...
- 一步一步学习Unity3d学习笔记系1.2 单机游戏和网游的数据验证概念
这一次的笔记的主要内容是单机和网游的数据存储,数据验证方式,在游戏的时候除了控制角色的行动,还涉及到用户角色的升级,经验,金钱赚取,道具购买,技能升级 等等一些数据的交易, 那么单机游戏和网游的区别如 ...
- <转>ASP.NET学习笔记之MVC 3 数据验证 Model Validation 详解
MVC 3 数据验证 Model Validation 详解 再附加一些比较好的验证详解:(以下均为引用) 1.asp.net mvc3 的数据验证(一) - zhangkai2237 - 博客园 ...
- SpringMVC学习笔记七:SpringMVC的数据验证
SpringMVC支持JSR(Java Specification Requests, Java规范提案)303-Bean Validation数据验证规范,该规范的实现者很多,其中较常用的是 Hib ...
- SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念: SpringBoot 错误处理 2.具体内容 在之前的程序里面如果一旦出现了错误之后就会出现一堆的大白板,这个白板会 ...
- 我这么玩Web Api(二):数据验证,全局数据验证与单元测试
目录 一.模型状态 - ModelState 二.数据注解 - Data Annotations 三.自定义数据注解 四.全局数据验证 五.单元测试 一.模型状态 - ModelState 我理解 ...
- MVC 数据验证
MVC 数据验证 前一篇说了MVC数据验证的例子,这次来详细说说各种各样的验证注解.System.ComponentModel.DataAnnotations 一.基础特性 一.Required 必填 ...
随机推荐
- LINQ to SQL和Entity Framework
LINQ to SQL和Entity Framework都是一种包含LINQ功能的对象关系映射技术. 那么为什么会有LINQ这个东西的出现呢. 简单来说LINQ是为了满足不知道怎么操作数据库的程序员开 ...
- HNOI2018毒瘤
题面链接 luogu sol 这篇博是骗访问量的QwQ. 考虑树怎么做,简单容斥.诸如\(f[u][0]=\prod (f[v][0]+f[v][1]),f[u][1]=\prod f[v][0]\) ...
- BZOJ 2720: [Violet 5]列队春游
2720: [Violet 5]列队春游 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 189 Solved: 133[Submit][Status] ...
- 【django基础之ORM,增删改查】
一.定义 1.什么是ORM? ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候, ...
- java堆溢出
java堆是用来存储对象实例的:只要不断创建对象,GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,当对象数量达到最大堆的容量限制的时候就会产生内存溢出异常.异常对战信息为OutOf ...
- Python之旅:入门
一 编程与编程语言 python是一门编程语言,作为学习python的开始,需要事先搞明白:编程的目的是什么?什么是编程语言?什么是编程? 编程的目的: #计算机的发明,是为了用机器取代/解放人力,而 ...
- MVC中使用RadioButtonFor
http://shw3588.blog.163.com/blog/static/6507576201321395845538/ 1 进行初始化 <%=Html.RadioButtonFor(mo ...
- Long与long的区别
Java的数据类型分两种:1.基本类型:long,int,byte,float,double,char2. 对象类型(类): Long,Integer,Byte,Float,Double,Char,S ...
- Lowest Common Ancestor in a Binary Tree
二叉树最低公共祖先节点 acmblog If one key is present and other is absent, then it returns the present key as LC ...
- 八、java常用类
目录 一.字符串相关类 String类 StringBuffer类 二.基本数据类型包装类 三.Math类 四.File类 五.枚举类 一.字符串相关类 1.String类 java.lang.Str ...