1.struts中如何进行数据校验

  在每一个Action类中,数据校验一般都写在业务方法中,比如login()、register()等。struts提供了数据校验功能。每个继承自ActionSupport的Action类都可以实现一个validate()方法。struts使用拦截器org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor进行数据校验,根据拦截器的执行流程,它会在执行Action的业务方法之前调用intercecpt()方法,因此可以完成数据校验的功能。

  在ActionSupport类中有一个ValidationAwareSupport的对象,该对象维护了一个Map<String, List<String>> fieldErrors属性,用它来存储错误信息。在Action类的业务方法中调用

super.addFieldError("user","用户名必须填写!");

会执行ActionSupport中的

    public void addFieldError(String fieldName, String errorMessage) {
this.validationAware.addFieldError(fieldName, errorMessage);
}

ValidationAwareSupport类中的addFieldError如下:

    public synchronized void addFieldError(String fieldName, String errorMessage) {
Map errors = this.internalGetFieldErrors();
Object thisFieldErrors = (List)errors.get(fieldName);
if(thisFieldErrors == null) {
thisFieldErrors = new ArrayList();
errors.put(fieldName, thisFieldErrors);
} ((List)thisFieldErrors).add(errorMessage);
}

该方法将一条错误信息添加到Map中,一个key值可以对应多条错误信息。

2.struts中数据验证的方法

  • 代码方式验证Action中指定的方法(validate+要验证的方法名作为验证函数名)

  在Action类中重写validate()方法。

    //仅验证register方法
public void validateRegister(){
if(user.getUserName() == null||"".equals(user.getUserName()))
{
//保存错误信息
super.addFieldError("user","用户名必须填写!");
} if(user.getPassword() == null||"".equals(user.getPassword()))
{
//保存错误信息
super.addFieldError("user","密码必须填写!");
}
}
  • 代码方式验证Action中的所有方法(直接重写validate()方法)

  • XML方式验证Action中指定的方法(xml命名为ActionClassName-ActionName-validation.xml)

  • XML方式验证Action中的所有方法(xml命名为ActionClassName-validation.xml)

  使用validate()方法进行验证,涉及很多重复的验证逻辑,例如:非空验证、数值验证、email验证、日期验证等。因此struts对于常用的验证进行了封装,提供了验证器。

  struts提供的验证器在xwork-core-2.3.4.1.jar!\com\opensymphony\xwork2\validator\validators\default.xml中,共16个,如下:

<validators>
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
<validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
<validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
<validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>

  xml文件名称语法:ActionClassName-validation.xml,而且需要与当前要验证的action 在同一目录。(和局部转换器相似)

  使用xwork-core-2.3.4.1.jar!\xwork-validator-1.0.dtd约束来写xml文件。

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<field name="user.userName">
<field-validator type="requiredstring">
<message>用户名必须填写!</message>
</field-validator>
</field>
<field name="user.password">
<field-validator type="requiredstring">
<message>密码必须填写!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<message>密码长度不能小于6!</message>
</field-validator>
</field>
<field name="user.birth">
<field-validator type="date">
<message></message>
</field-validator>
</field>
</validators>

struts中的数据校验的更多相关文章

  1. Struts 2的数据校验

    既然说到了Struts 2的数据校验,我们该怎么去实现呢?又是通过什么来实现呢? 就让我带着大家一起来走进Struts 2的数据校验吧. 首先我们会想到在Stuts 2的登录案例中我们定义了一个Act ...

  2. struts中简单的校验

    Struts中简单的校验 “计应134(实验班) 凌豪” Struts2校验简要说明:struts2中通常情况下,类型转换要在数据校验之前进行.类型转换其实也是基本的服务器端校验,合法数据必然可以通过 ...

  3. Struts2中validate数据校验的两种常用方法

    本文主要介绍Struts2中validate数据校验的两种方法及Struts2常用校验器.  1.Action中的validate()方法 Struts2提供了一个Validateable接口,这个接 ...

  4. SpringMvc中的数据校验

    SpringMvc中的数据校验 Hibernate校验框架中提供了很多注解的校验,如下: 注解 运行时检查 @AssertFalse 被注解的元素必须为false @AssertTrue 被注解的元素 ...

  5. Spring官网阅读(十七)Spring中的数据校验

    文章目录 Java中的数据校验 Bean Validation(JSR 380) 使用示例 Spring对Bean Validation的支持 Spring中的Validator 接口定义 UML类图 ...

  6. [WPF 基础知识系列] —— 绑定中的数据校验Vaildation

    前言: 只要是有表单存在,那么就有可能有对数据的校验需求.如:判断是否为整数.判断电子邮件格式等等. WPF采用一种全新的方式 - Binding,来实现前台显示与后台数据进行交互,当然数据校验方式也 ...

  7. 【SpringMVC学习06】SpringMVC中的数据校验

    这一篇博文主要总结一下springmvc中对数据的校验.在实际中,通常使用较多是前端的校验,比如页面中js校验,对于安全要求较高的建议在服务端也要进行校验.服务端校验可以是在控制层conroller, ...

  8. SilverlightMVVM模式中的数据校验

    silverlight的数据校验大体分成3种类型: 数据是非必填的但是需要满足相应数据格式的 数据是必填的且可能需要进行数据格式校验的 其他(如数据的联动校验) 以下的数据校验方式针对第二种: 在相应 ...

  9. SpringBoot中BeanValidation数据校验与优雅处理详解

    目录 本篇要点 后端参数校验的必要性 不使用Validator的参数处理逻辑 Validator框架提供的便利 SpringBoot自动配置ValidationAutoConfiguration Va ...

随机推荐

  1. 下载安装APK

    protected void downloadApk() { //apk下载链接地址,放置apk的所在路径 //1,判断sd卡是否可用,是否挂在上 if(Environment.getExternal ...

  2. Object Pascal 运算符

          Object Pascal 的运算符 运算符是程序代码中对各种类型的数据进行计算的符号,通常分为算数运算符.逻辑运算符.比较运算符和按位运算符. 1.算术运算符Object Pascal ...

  3. 深入浅出RxJava(一:基础篇)

    RxJava正在Android开发者中变的越来越流行.唯一的问题就是上手不容易,尤其是大部分人之前都是使用命令式编程语言.但是一旦你弄明白了,你就会发现RxJava真是太棒了. 这里仅仅是帮助你了解R ...

  4. hiho_1138_island_travel

    题目 二维平面上有n个点,每个点的横纵坐标均为非负整数.两个点之间的距离记为 min(abs(x1 - x2), abs(y1 - y2)),求从点1到达点n的最短路径长度. 比较容易想到使用最短路径 ...

  5. hiho1091_clicker背包问题

    问题 类似有限背包问题,题目链接:clicker 实现 #include<stdio.h> #include<cmath> #include<iostream> # ...

  6. commonJS — 数字操作(for Number)

    for Number github: https://github.com/laixiangran/commonJS/blob/master/src/forNumber.js 代码 /** * Cre ...

  7. WebDriver 页面等待

    selenium2.4.0版本提供了页面等待处理. 显示等待元素可见: protected void WaitElementVisible(By by,int timeOutInSeconds, lo ...

  8. java 多线程6(线程的·通讯)

    问题1: 为什么wait() 和 notify()是Object类中的方法,而不是Thread类中的方法呢? 答:因为锁是任意对象的所以要在Object类中,如果在Thread类中锁对象不是任意的了. ...

  9. 【CodeVS 1038】一元三次方程

    题意 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程. 给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的 ...

  10. 【CodeVS 1014】装箱问题

    题目描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩 ...