1、数据验证的概述

1.1、数据验证的重要性

  数据验证是非常必要的,不但和我们的常识性理解有关系,还有可能涉及到一些非法输入等问题,所以我们需要进行必要的数据验证,以保证我们在数据输入的时候都是正确且合法的。

1.2、数据验证的分类

  数据验证的一般分类有两种:

  一种就是在客户端验证,数据在提交到服务器端之前进行验证,这样做的特点就是减少客户等待、减轻服务器端压力,我们可以用javaScript或者是JQuery来实现;

  一种是服务器端验证,就是在数据提交到服务器端之后在进行数据验证。防止有效防止“绕过”客户端验证提交的非法数据,可以在服务器端处理数据前确保数据的合法性;

1.3、Strsuts2实现数据验证的两种方式

  • 继承ActionSupport类实现验证
  • 使用Struts2验证框架实现验证

2、基于继承ActionSupport类实现数据验证

2.1、 在Action类的业务方法中直接验证

  这是一种直观的验证方法,直接在实现了ActionSupport的XxxAxtion类里边利用代码直接进行数据的验证。如下的代码就是一小段在XxxAxtion类中直接实现数据验证的。

 String ageStr="^\\d{1,3}$";
Pattern ageReg=Pattern.compile(ageStr);
Matcher ageMatcher=ageReg.matcher(user.getAge()+"");
if(!ageMatcher.matches()){
this.addFieldError("user.age", "年龄只能是数字,并只能为1-200之间!");
}
if(null==user.getAge()){
this.addFieldError("user.age", "年龄不能为空!");
}

2.2、重写Validate()方法进行验证

我们知道,ActionSupprot类里边有一个方法是Validate()方法,我们可以通过重写Validate()方法的方式实现数据验证功能。和直接在Action类的业务方法中直接验证的方法不通点就是我们把实现验证的那部分代码写进Validate()方法中就可以了。这样做的优点就是将数据验证和业务处理进行分离,但是添加和显示错误信息的方法还是不变的。注意:如果Action中有validate()方法,会先执行验证,验证后才执行业务方法,不通过不执行业务方法

  @Override
public void validate() {
if(null==user.getUsername() || "".equals(user.getUsername())){
this.addFieldError("user.username", "用户名不能为空!");
}
if(null==user.getPassword() || "".equals(user.getPassword())){
this.addFieldError("user.password", "密码不能为空!");
}
String ageStr="^\\d{1,3}$";
Pattern ageReg=Pattern.compile(ageStr);
Matcher ageMatcher=ageReg.matcher(user.getAge()+"");
if(!ageMatcher.matches()){
this.addFieldError("user.age", "年龄只能是数字,并只能为1-200之间!");
}
if(null==user.getAge() || "".equals(user.getAge())){
this.addFieldError("user.age", "年龄不能为空!");
}else{
if(0>user.getAge() || 200<user.getAge()){
this.addFieldError("user.age", "年龄1-200之间!!");
}
} String emaString="^\\w+@\\w+(.\\w{2,3}){1,2}$";
Pattern emailReg=Pattern.compile(emaString);
Matcher emailMatcher=emailReg.matcher(user.getEmail());
if(!emailMatcher.matches()){
this.addFieldError("user.email", "邮箱格式不正确");
}
super.validate(); }

2.3、使用validateXxx()方法

  struts2支持使用ValidateXxx()方法进行数据验证,使用validateXxx()方法实现针对Xxx()方法的数据验证;validate()方法和validateXxx()方法同时存在时都会起作用;ValidateXxx()

方法的调用要先于validate()方法。

  这种数据验证的方法比直接使用重写Validate()方法要好一些,因为我们知道,每一次请求都会创建一个对应的action对象,但例如注册的时候可能我们需验证邮箱的格式,但这

只是在注册的时候才使用,平时的时候我们是不使用的啊。所以使用validateXxx()方法能有效的分离注册是数据验证和访问请求时的数据验证。比较好!

 public String register() throws Exception {
System.out.println("=========完成注册信息======");
if(this.hasErrors()){
return INPUT;
}
return SUCCESS;
} @Override
public void validate() {
System.out.println("====执行validate方法验证====");
if(null==user.getUsername() || "".equals(user.getUsername())){
this.addFieldError("user.username", "用户名不能为空!");
}
if(null==user.getPassword() || "".equals(user.getPassword())){
this.addFieldError("user.password", "密码不能为空!");
} } public void validateRegister(){
System.out.println("====执行validateRegister方法验证====");
String ageStr="^\\d{1,3}$";
Pattern ageReg=Pattern.compile(ageStr);
Matcher ageMatcher=ageReg.matcher(user.getAge()+"");
if(!ageMatcher.matches()){
this.addFieldError("user.age", "年龄只能是数字,并只能为1-200之间!");
}
if(null==user.getAge() || "".equals(user.getAge())){
this.addFieldError("user.age", "年龄不能为空!");
}else{
if(0>user.getAge() || 200<user.getAge()){
this.addFieldError("user.age", "年龄1-200之间!!");
}
} String emaString="^\\w+@\\w+(.\\w{2,3}){1,2}$";
Pattern emailReg=Pattern.compile(emaString);
Matcher emailMatcher=emailReg.matcher(user.getEmail());
if(!emailMatcher.matches()){
this.addFieldError("user.email", "邮箱格式不正确");
}
}

3、基于继承ActionSupport类实现数据验证时添加错误信息的方法

  addFieldError(String fieldName,String errorMessage),添加字段的错误信息

  addActionError(String anErrorMessage),添加与Action所处理业务相关的错误信息

4、基于继承ActionSupport类实现数据验证时在页面输出验证结果

  <s:fielderror/>输出一个或者所胡字段的错误信息

  <s:actionerror/>输出所有Action的错误信息

5、基于继承ActionSupport类实现数据验证时的struts.xml文件的配置方法

 <result name="input">xxx.jsp</result>

  总结:
  在Action类中添加错误信息,以便于在展示界面输出错误信息;总的来说就是这三种方法实现数据验证的位置不一样罢了。

6、基于Struts2验证框架实现数据验证

6.1、框架验证的一般过程:

  • 编写jsp界面以便于输入数据
  • 编写Action类和想匹配的配置文件
  • 在Action类同一个目录下编写验证文件ActionName-validation.xml(这个验证文件的命名规则是固定的)
  • 在新创建的验证文件中按照规范写验证规则

代码实现:

编写Action类:

 package com.java1234.action;

 import com.java1234.model.User;
import com.opensymphony.xwork2.ActionSupport; public class RegisterAction extends ActionSupport{ /**
*
*/
private static final long serialVersionUID = 1L; private User user; public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} @Override
public String execute() throws Exception {
System.out.println("传入的用户:"+user);
return SUCCESS;
} }

同一个目录下编写验证文件:

 <?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-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>用户名必须在${minLength}和${maxLength}之间</message>
</field-validator>
</field>
<field name="user.name">
<field-validator type="requiredstring">
<message>请输入姓名</message>
</field-validator>
</field>
<field name="user.age">
<field-validator type="int">
<param name="min">18</param>
<message>年龄必须满18周岁</message>
</field-validator>
</field>
<field name="user.email">
<field-validator type="requiredstring">
<message>请输入邮件</message>
</field-validator>
<field-validator type="email">
<message>邮件格式不对</message>
</field-validator>
</field>
<field name="user.homePage">
<field-validator type="requiredstring">
<message>请输入主页</message>
</field-validator>
<field-validator type="url">
<message>主页格式不对</message>
</field-validator>
</field> <validator type="expression">
<param name="expression"><![CDATA[!user.name.equals(user.userName)]]></param>
<message>用户名和真实姓名不能相同</message>
</validator>
</validators>

struts.xml配置文件:

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="manager" extends="struts-default"> <action name="registerAction" class="com.java1234.action.RegisterAction">
<result name="input">/register.jsp</result>
<result name="success">/success.jsp</result>
</action> </package> </struts>

jsp访问页面:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:actionerror/>
用户注册
<s:form action="/registerAction" method="post">
<s:textfield name="user.userName" label="用户名"></s:textfield>
<s:textfield name="user.name" label="真实姓名"></s:textfield>
<s:textfield name="user.age" label="年龄"></s:textfield>
<s:textfield name="user.email" label="邮件"></s:textfield>
<s:textfield name="user.homePage" label="主页"></s:textfield>
<s:submit value="注册"></s:submit>
</s:form>
</body>
</html>

访问地址:http://localost:8080/HeadFirstChap01/register.jsp

6.2、如何针对某一个业务配置验证规则

  根据实际情况我们可能有这样的需求:指对某一个方法进行数据验证。我们的处理办法一般有两种,一种就是把这个方法单独写进一个Action类中,然后对这个Action类进行单独编写验证文件然后在struts.xml文件中只需要使用method属性指明一下就可以了;还有一种方法就是不单独分出来一个Action,而是在编写验证文件的时候创建一个:ActionName-alias-validation.xml的文件(中间的名称要与action的name属性名字相同)。

6.3、使用验证框架时的执行流程

  ActionName-Validation.xml文件可以对整个Action类的业务方法使用;ActionName-alias-validation.xml文件指对Action类中的某一个业务方法起作用;如果两个文件都存在的情况下,两个文件都会起作用。

验证的顺序一般是:ActionName-Validation.xml(父类)、ActionName-alias-validation.xml(父类)、ActionName-Validation.xml、ActionName-alias-validation.xml。

学习Struts--Chap06:Struts2之数据验证的更多相关文章

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

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

  2. SpringMVC学习(6):数据验证

    在系列(4).(5)中我们展示了如何绑定数据,绑定完数据之后如何确保我们得到的数据的正确性?这就是我们本篇要说的内容 -> 数据验证. 这里我们采用Hibernate-validator来进行验 ...

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

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

  4. struts2学习笔记(7)---数据验证之validateXxx()方法

    validateXxx()方法 上一篇文章写了使用Action的validate()方法,validate()仅仅能对action的所有方法进行验证.而要实现对action中特定的方法进行验证,就须要 ...

  5. struts2简单数据验证

    当表单数据提交到后台后通常要对数据进行校验,以登录为例,后台拿到用户名密码后会判断是否正确,正确的话会跳转到网站用户登录成功的页面,如果不正确的话会提示用户输入不正确. 首先在struts.xml配置 ...

  6. struts2(三)---struts2中的服务端数据验证框架validate

    struts2为我们提供了一个很好的数据验证框架–validate,该框架可以很方便的实现服务端的数据验证. ActionSupport类提供了一个validate()方法,当我们需要在某一个acti ...

  7. Silverlight实例教程 - Validation数据验证基础属性和事件(转载)

    Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...

  8. 一脸懵逼学习Struts数据校验以及数据回显,模型驱动,防止表单重复提交的应用。

    1:Struts2表单数据校验: (1)前台校验,也称之为客户端校验,主要是通过Javascript编程的方式进行数据的验证. (2)后台校验,也称之为服务器校验,这里指的是使用Struts2通过xm ...

  9. struts 数据验证

    1. validate()验证 将对页面表单验证的内容写到validate()方法中,实现验证和业务处理内容的分离 在Action中添加 validate()方法   public void vali ...

随机推荐

  1. Android之Error: 'L' is not a valid file-based resource name character解决办法

    1.问题 Error:Execution failed for task ':mergeBYODReleaseResources'.> /home/chenyu/Android_dev/sang ...

  2. 微信小程序API 登录-wx.login(OBJECT) + 获取微信用户唯一标识openid | 小程序

    wx.login(OBJECT) 调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key).用户数据的加解密通讯需要 ...

  3. Caused by: java.lang.ClassNotFoundException: backtype.storm.topology.IRichSpout

    1:初次运行Strom程序出现如下所示的错误,贴一下,方便脑补,也希望帮助到看到的小伙伴: 错误如下所示,主要问题是刚开始使用maven获取jar包的时候需要写<scope>provide ...

  4. C#学习-面向对象

    封装:把客观事物封装成类,并将类内部的实现隐藏,以保证数据的完整性: 比如年龄赋值为负数,就是个例子.当我们把类的字段定义为公共类型时,外部对象可以直接对类内部的数据进行操作,此时无法对这些操作进行一 ...

  5. Azure附加新磁盘,差点掉进去的那个坑,注意临时数据盘

    接今早的mysql问题,最终原因是mysql数据库的数据库文件以及pid丢失,当我还纳闷为什么丢失的情况下 我研究了下Azure云平台的数据磁盘原理,在Azure下,新建vm(centos)后只会提供 ...

  6. groovy中的正则表达式操作符【groovy】

    groovy中对于正则表达式的书写进行了简化,同时引入了新的操作符,使得正则表达式使用起来比较方便简单. 对于书写的改进: 比如 assert "\\d" == /\d/ 也就是在 ...

  7. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-8项目加密解密方案

    本文目录1. 摘要2. MD5加密封装3. AES的加密.解密4. DES加密/解密5. 总结 1.  摘要 C#中常用的一些加密和解密方案,如:md5加密.RSA加密与解密和DES加密等,Asp.N ...

  8. Python 经典类和新式类

    #!/usr/bin/env python# -*- coding:utf-8 -*-# 作者:Presley# 邮箱:1209989516@qq.com# 时间:2018-10-21# 新式类和经典 ...

  9. loadrunner之运行方式:线程还是进程?

    loadrunner controller将使用驱动程序mmdrv运行Vuser. 用户可以在controller的run-time setting中选择Vuser的运行方式: 是多进程方式还是多线程 ...

  10. jsp的c标签使用

    http://blog.csdn.net/chabale/article/details/9406437