数据验证:

  输入验证分为客户端验证与服务器端验证。客户端验证主要通过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--数据验证的更多相关文章

  1. ThinkPHP 学习笔记 ( 五 ) 数据验证

    根据官网的教程 ( http://www.thinkphp.cn/info/171.html ),数据验证的使用静态定义方式 ( 以 regex 为例 ) 无法验证数据: 而采用动态验证则正常: 控制 ...

  2. asp.net core mvc视频A:笔记4-1.数据验证

    开发建议:永远不要相信客户端提交过来的数据!!! 前端数据验证定位:提高用户体验,仅此而已! 后端数据验证定位:保证系统安全与数据完整!!! 实例:用户登录验证 定义一个用户登录类 在用户登录类基础上 ...

  3. c# MVC模式学习笔记_数据验证

    改变显示字段名称 设计字段规范 1.引用 using System.ComponentModel; using System.ComponentModel.DataAnnotations; 2.Dis ...

  4. 一步一步学习Unity3d学习笔记系1.2 单机游戏和网游的数据验证概念

    这一次的笔记的主要内容是单机和网游的数据存储,数据验证方式,在游戏的时候除了控制角色的行动,还涉及到用户角色的升级,经验,金钱赚取,道具购买,技能升级 等等一些数据的交易, 那么单机游戏和网游的区别如 ...

  5. <转>ASP.NET学习笔记之MVC 3 数据验证 Model Validation 详解

    MVC 3 数据验证 Model Validation 详解  再附加一些比较好的验证详解:(以下均为引用) 1.asp.net mvc3 的数据验证(一) - zhangkai2237 - 博客园 ...

  6. SpringMVC学习笔记七:SpringMVC的数据验证

    SpringMVC支持JSR(Java Specification Requests, Java规范提案)303-Bean Validation数据验证规范,该规范的实现者很多,其中较常用的是 Hib ...

  7. SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念: SpringBoot 错误处理 2.具体内容 在之前的程序里面如果一旦出现了错误之后就会出现一堆的大白板,这个白板会 ...

  8. 我这么玩Web Api(二):数据验证,全局数据验证与单元测试

    目录 一.模型状态 - ModelState 二.数据注解 - Data Annotations 三.自定义数据注解 四.全局数据验证 五.单元测试   一.模型状态 - ModelState 我理解 ...

  9. MVC 数据验证

    MVC 数据验证 前一篇说了MVC数据验证的例子,这次来详细说说各种各样的验证注解.System.ComponentModel.DataAnnotations 一.基础特性 一.Required 必填 ...

随机推荐

  1. tomcat设置虚拟路径映射服务器指定的物理路径

    在tomcat的server.xml中的host标签中加入如下标签: <Context crossContext="false" debug="1" do ...

  2. [BZOJ2502]清理雪道 有上下界网络流(最小流)

    2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MB Description        滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场 ...

  3. oracle 存储过程创建报错 Procedure created with compilation errors

    出现这错误的话,存储过程还是会成功创建的,创建好后再逐个打开查找存储过程的问题 问题:基本上就是存储过程里面的表不存在,dblink 不存在    ,用户名.xx表  要么用户名不存在要么表不存在 创 ...

  4. Linux下的bash对拍

    下面是Linux下的bash对拍程序: #!/bin/bash t=0 //数据组数 while true; do let "t=$t + 1" echox printf $t / ...

  5. bzoj 4332:JSOI2012 分零食

    描述 这里是欢乐的进香河,这里是欢乐的幼儿园. 今天是2月14日,星期二.在这个特殊的日子里,老师带着同学们欢乐地跳着,笑着.校长从幼儿园旁边的小吃店买了大量的零食决定分给同学们.听到这个消息,所有同 ...

  6. (转)log4j(六)——log4j.properties试过过程详解

    一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 参考:https://www.cnblogs.com/ywlaker/p/6124067.html log4j基本用法 首 ...

  7. echarts彩虹柱状图 每个bar显示不同颜色, 标题在不同位置 ,工具中有可以直接保存为图片下载,平均线的添加

    可以参考: https://echarts.baidu.com/echarts2/doc/example.html https://echarts.baidu.com/echarts2/doc/doc ...

  8. python print end=' ' 不换行

    python3.x 实现print 不换行 python中print之后是默认换行的,是因为其默认属性 end 默认值为"\n"(\n为换行符). 做练习99乘法表时不想换行,改变 ...

  9. linux那些事

    useradd -m -d /home/changp -Gusers,dialout,video account_name 创建新的账号 passwd account_name 修改指定账号的密码

  10. Kubernetes PV/PVC使用实践

    转载于https://www.cnblogs.com/ericnie/p/7733281.html   pv,pvc的概念不解释了,之前在registry中已经使用过PV和PVC,现在想把WebLog ...