1、数据验证的概述

1.1、数据验证的重要性

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

1.2、数据验证的分类

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

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

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

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

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

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

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

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

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

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

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

  1. @Override
  2. public void validate() {
  3. if(null==user.getUsername() || "".equals(user.getUsername())){
  4. this.addFieldError("user.username", "用户名不能为空!");
  5. }
  6. if(null==user.getPassword() || "".equals(user.getPassword())){
  7. this.addFieldError("user.password", "密码不能为空!");
  8. }
  9. String ageStr="^\\d{1,3}$";
  10. Pattern ageReg=Pattern.compile(ageStr);
  11. Matcher ageMatcher=ageReg.matcher(user.getAge()+"");
  12. if(!ageMatcher.matches()){
  13. this.addFieldError("user.age", "年龄只能是数字,并只能为1-200之间!");
  14. }
  15. if(null==user.getAge() || "".equals(user.getAge())){
  16. this.addFieldError("user.age", "年龄不能为空!");
  17. }else{
  18. if(0>user.getAge() || 200<user.getAge()){
  19. this.addFieldError("user.age", "年龄1-200之间!!");
  20. }
  21. }
  22.  
  23. String emaString="^\\w+@\\w+(.\\w{2,3}){1,2}$";
  24. Pattern emailReg=Pattern.compile(emaString);
  25. Matcher emailMatcher=emailReg.matcher(user.getEmail());
  26. if(!emailMatcher.matches()){
  27. this.addFieldError("user.email", "邮箱格式不正确");
  28. }
  29. super.validate();
  30.  
  31. }

2.3、使用validateXxx()方法

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

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

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

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

  1. public String register() throws Exception {
  2. System.out.println("=========完成注册信息======");
  3. if(this.hasErrors()){
  4. return INPUT;
  5. }
  6. return SUCCESS;
  7. }
  8.  
  9. @Override
  10. public void validate() {
  11. System.out.println("====执行validate方法验证====");
  12. if(null==user.getUsername() || "".equals(user.getUsername())){
  13. this.addFieldError("user.username", "用户名不能为空!");
  14. }
  15. if(null==user.getPassword() || "".equals(user.getPassword())){
  16. this.addFieldError("user.password", "密码不能为空!");
  17. }
  18.  
  19. }
  20.  
  21. public void validateRegister(){
  22. System.out.println("====执行validateRegister方法验证====");
  23. String ageStr="^\\d{1,3}$";
  24. Pattern ageReg=Pattern.compile(ageStr);
  25. Matcher ageMatcher=ageReg.matcher(user.getAge()+"");
  26. if(!ageMatcher.matches()){
  27. this.addFieldError("user.age", "年龄只能是数字,并只能为1-200之间!");
  28. }
  29. if(null==user.getAge() || "".equals(user.getAge())){
  30. this.addFieldError("user.age", "年龄不能为空!");
  31. }else{
  32. if(0>user.getAge() || 200<user.getAge()){
  33. this.addFieldError("user.age", "年龄1-200之间!!");
  34. }
  35. }
  36.  
  37. String emaString="^\\w+@\\w+(.\\w{2,3}){1,2}$";
  38. Pattern emailReg=Pattern.compile(emaString);
  39. Matcher emailMatcher=emailReg.matcher(user.getEmail());
  40. if(!emailMatcher.matches()){
  41. this.addFieldError("user.email", "邮箱格式不正确");
  42. }
  43. }

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

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

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

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

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

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

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

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

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

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

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

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

代码实现:

编写Action类:

  1. package com.java1234.action;
  2.  
  3. import com.java1234.model.User;
  4. import com.opensymphony.xwork2.ActionSupport;
  5.  
  6. public class RegisterAction extends ActionSupport{
  7.  
  8. /**
  9. *
  10. */
  11. private static final long serialVersionUID = 1L;
  12.  
  13. private User user;
  14.  
  15. public User getUser() {
  16. return user;
  17. }
  18.  
  19. public void setUser(User user) {
  20. this.user = user;
  21. }
  22.  
  23. @Override
  24. public String execute() throws Exception {
  25. System.out.println("传入的用户:"+user);
  26. return SUCCESS;
  27. }
  28.  
  29. }

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
  3.  
  4. <validators>
  5. <field name="user.userName">
  6. <field-validator type="requiredstring">
  7. <message>请输入用户名</message>
  8. </field-validator>
  9. <field-validator type="stringlength">
  10. <param name="minLength">6</param>
  11. <param name="maxLength">10</param>
  12. <message>用户名必须在${minLength}和${maxLength}之间</message>
  13. </field-validator>
  14. </field>
  15. <field name="user.name">
  16. <field-validator type="requiredstring">
  17. <message>请输入姓名</message>
  18. </field-validator>
  19. </field>
  20. <field name="user.age">
  21. <field-validator type="int">
  22. <param name="min">18</param>
  23. <message>年龄必须满18周岁</message>
  24. </field-validator>
  25. </field>
  26. <field name="user.email">
  27. <field-validator type="requiredstring">
  28. <message>请输入邮件</message>
  29. </field-validator>
  30. <field-validator type="email">
  31. <message>邮件格式不对</message>
  32. </field-validator>
  33. </field>
  34. <field name="user.homePage">
  35. <field-validator type="requiredstring">
  36. <message>请输入主页</message>
  37. </field-validator>
  38. <field-validator type="url">
  39. <message>主页格式不对</message>
  40. </field-validator>
  41. </field>
  42.  
  43. <validator type="expression">
  44. <param name="expression"><![CDATA[!user.name.equals(user.userName)]]></param>
  45. <message>用户名和真实姓名不能相同</message>
  46. </validator>
  47. </validators>

struts.xml配置文件:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5.  
  6. <struts>
  7.  
  8. <package name="manager" extends="struts-default">
  9.  
  10. <action name="registerAction" class="com.java1234.action.RegisterAction">
  11. <result name="input">/register.jsp</result>
  12. <result name="success">/success.jsp</result>
  13. </action>
  14.  
  15. </package>
  16.  
  17. </struts>

jsp访问页面:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@taglib prefix="s" uri="/struts-tags" %>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. <s:actionerror/>
  12. 用户注册
  13. <s:form action="/registerAction" method="post">
  14. <s:textfield name="user.userName" label="用户名"></s:textfield>
  15. <s:textfield name="user.name" label="真实姓名"></s:textfield>
  16. <s:textfield name="user.age" label="年龄"></s:textfield>
  17. <s:textfield name="user.email" label="邮件"></s:textfield>
  18. <s:textfield name="user.homePage" label="主页"></s:textfield>
  19. <s:submit value="注册"></s:submit>
  20. </s:form>
  21. </body>
  22. </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. pp 总结一

    1.JQ $.get() <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  2. 《深入探索Netty原理及源码分析》文集小结

    <深入探索Netty原理及源码分析>文集小结 https://www.jianshu.com/p/239a196152de

  3. Java集合源码学习(四)HashMap

    一.数组.链表和哈希表结构 数据结构中有数组和链表来实现对数据的存储,这两者有不同的应用场景,数组的特点是:寻址容易,插入和删除困难:链表的特点是:寻址困难,插入和删除容易:哈希表的实现结合了这两点, ...

  4. python全栈开发day75-用户注册页面ajax实现,用户头像上传、预览、展示

    一.昨日内容回顾 1. 内容回顾 1. BBS项目登录 1. 登录用form组件和auth模块 1. form组件做校验很方便 2. auth模块 - authenticate(username=xx ...

  5. Office 2010 word无法创建工作文件 请检查临时环境变量 的解决办法

    Office 2010 word无法创建工作文件 请检查临时环境变量 的解决办法 http://hi.baidu.com/netshen/item/207fd935d452e0e9df2221c9 如 ...

  6. Vue 组件(上)转载

    一.定义 组件:应用界面上一个个的区块. 自定义的HTML元素. 二.创建和注册 Vue.extend() 扩展,创建组件构造器 Vue.component()注册组件,2个参数,1为标签,2是组件构 ...

  7. BZOJ3262/洛谷P3810 陌上花开 分治 三维偏序 树状数组

    原文链接http://www.cnblogs.com/zhouzhendong/p/8672131.html 题目传送门 - BZOJ3262 题目传送门 - 洛谷P3810 题意 有$n$个元素,第 ...

  8. 利用Flume将MySQL表数据准实时抽取到HDFS

    转自:http://blog.csdn.net/wzy0623/article/details/73650053 一.为什么要用到Flume 在以前搭建HAWQ数据仓库实验环境时,我使用Sqoop抽取 ...

  9. python中@staticmethod、@classmethod和实例方法

    1.形式上的异同点: 在形式上,Python中:实例方法必须有self,类方法用@classmethod装饰必须有cls,静态方法用@staticmethod装饰不必加cls或self,如下代码所示: ...

  10. INSERT 中ON DUPLICATE KEY UPDATE的使用

    如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE.例如,如果列a被定义为UNIQUE,并 ...