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 必填 ...
随机推荐
- tomcat设置虚拟路径映射服务器指定的物理路径
在tomcat的server.xml中的host标签中加入如下标签: <Context crossContext="false" debug="1" do ...
- [BZOJ2502]清理雪道 有上下界网络流(最小流)
2502: 清理雪道 Time Limit: 10 Sec Memory Limit: 128 MB Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场 ...
- oracle 存储过程创建报错 Procedure created with compilation errors
出现这错误的话,存储过程还是会成功创建的,创建好后再逐个打开查找存储过程的问题 问题:基本上就是存储过程里面的表不存在,dblink 不存在 ,用户名.xx表 要么用户名不存在要么表不存在 创 ...
- Linux下的bash对拍
下面是Linux下的bash对拍程序: #!/bin/bash t=0 //数据组数 while true; do let "t=$t + 1" echox printf $t / ...
- bzoj 4332:JSOI2012 分零食
描述 这里是欢乐的进香河,这里是欢乐的幼儿园. 今天是2月14日,星期二.在这个特殊的日子里,老师带着同学们欢乐地跳着,笑着.校长从幼儿园旁边的小吃店买了大量的零食决定分给同学们.听到这个消息,所有同 ...
- (转)log4j(六)——log4j.properties试过过程详解
一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 参考:https://www.cnblogs.com/ywlaker/p/6124067.html log4j基本用法 首 ...
- echarts彩虹柱状图 每个bar显示不同颜色, 标题在不同位置 ,工具中有可以直接保存为图片下载,平均线的添加
可以参考: https://echarts.baidu.com/echarts2/doc/example.html https://echarts.baidu.com/echarts2/doc/doc ...
- python print end=' ' 不换行
python3.x 实现print 不换行 python中print之后是默认换行的,是因为其默认属性 end 默认值为"\n"(\n为换行符). 做练习99乘法表时不想换行,改变 ...
- linux那些事
useradd -m -d /home/changp -Gusers,dialout,video account_name 创建新的账号 passwd account_name 修改指定账号的密码
- Kubernetes PV/PVC使用实践
转载于https://www.cnblogs.com/ericnie/p/7733281.html pv,pvc的概念不解释了,之前在registry中已经使用过PV和PVC,现在想把WebLog ...