数据验证:

  输入验证分为客户端验证与服务器端验证。客户端验证主要通过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. .net MVC4 来一个简单的分页代码

    action VodeEntities db = new NewVode.Models.VodeEntities(); ; ) { var sql = "select * ,row_numb ...

  2. HDU4726——Kia's Calculation——2013 ACM/ICPC Asia Regional Online —— Warmup2

    题目的意思是给你两个数字(多达10^6位) 做加法,但是有一点,没有进位(进位不算,相当于这一位相加后对10取模) 你可以任意排列两个数字中的每一位,但是不能是0开头. 现在题目要求以这种不进位的算法 ...

  3. 通过域名访问部署在服务器上的javaweb项目

    因为对域名访问什么也不了解,遇到问题就有种不知道从哪里下手的茫然,也就更不知道错在哪里,前前后后一共折腾了一天多,最后问了阿里客服才成功弄出来,因此记录一下. 关于服务器的购买.配置,及域名的备案解析 ...

  4. 查看MySQL最近执行的语句

    首先登入MySQL. Reading table information for completion of table and column names You can turn off this ...

  5. C 函数——Day04

    C 函数 函数是一组一起执行一个任务的语句.每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 您可以把代码划分到不同的函数中.如何划分代码到不同的函数 ...

  6. shiro异常类型

    <!-- 身份认证异常 --> <!-- 身份令牌异常,不支持的身份令牌 --> org.apache.shiro.authc.pam.UnsupportedTokenExce ...

  7. [CF1110E]Magic Stones

    题目大意:有一个长度为$n(n\leqslant10^5)$的数列$c$,问是否可以经过若干次变换变成数列$t$,一次变换为$c'_i=c_{i+1}+c_{i-1}-c_i$ 题解:思考一次变换的本 ...

  8. 【BZOJ1914】数三角形(组合数,极角排序)

    [BZOJ1914]数三角形(组合数,极角排序) 题面 BZOJ权限题 良心洛谷 题解 这种姿势很吼啊,表示计算几何啥的一窍不通来着. 题目就是这样,正难则反,所以我们不考虑过原点的三角形, 反过来, ...

  9. 破解CobaltStrike3.12(转)

      0x00  概述 CobaltStrike是一款内网渗透的商业远控软件,支持自定义脚本扩展,功能非常强大.前段时间Github上有好心人放出了CobaltStrike3.12的试用版,接着Lz1y ...

  10. ---web模型 --mvc和模型--struts2 入门

    关于web模型: 早期的web 应用主要是静态页丽的浏览〈如新闻的制监),随着Internet的发展,web应用也变得越来越复杂,不仅要 和数据库进行交互 ,还要和用户进行交互,由此衍生了各种服务器端 ...