strut2 的数据验证

数据验证

用户的输入验证,必须做,且工作量巨大。

1、验证的方式

客户端验证:javascript

服务端验证:逻辑验证(我们的代码)

注意:如果客户端和服务端二选一的话,服务器端的不能省。

实际开发中:客户端+服务端

2、Struts2的服务端验证

2.1、编程式验证

前提:

                                   动作类必须继承ActionSupport

                            在代码中编写验证规则。

a、针对动作类中的所有动作方法进行验证:

在动作类中覆盖public void validate()方法。

 1 /**
 2      * 在struts2的框架中,它也提供了一个Map<表单的字段名,错误提示>
 3      * 我们要做的:
 4      *         往map中存放错误信息
 5      *
 6      * 编程式验证:
 7      *     1.动作类必须继承ActionSupport
 8      *     2.重写validate方法
 9      *
10      * validate方法会在动作方法执行之前,进行验证
11      *
12      * 当重写了validate方法,它会对动作类中的所用动作方法进行验证。
13     */
14
15
16     public void validate(){
17         if(StringUtils.isEmpty(user.getUsername())){
18             //存入错误信息,直接调用父类的addFieldError方法,存入错误信息。第一个参数是表单name属性的值。第二个参数是错误提示
19             addFieldError("username", "请输入用户名");
20         }
21     }
22     

动作类中复写的validate()

            但是,该验证方法会对动作类中的所有动作方法进行验证。

b、针对动作类中的某个动作方法进行验证

针对上面的问题,解决办法1:给不需要验证的动作方法添加一个@SkipValidation注解。  

1 @SkipValidation
2     public String findAll(){
3         return SUCCESS;
4     }

解决方法一

                     解决办法2:validation方法遵守书写规范。

 1 /**
 2      * 在struts2的框架中,它也提供了一个Map<表单的字段名,错误提示>
 3      * 我们要做的:
 4      *         往map中存放错误信息
 5      *
 6      * 编程式验证:
 7      *     1.动作类必须继承ActionSupport
 8      *     2.重写validate方法
 9      *
10      * validate方法会在动作方法执行之前,进行验证
11      *
12      * 当重写了validate方法,它会对动作类中的所用动作方法进行验证。
13      * 解决验证所有动作方法的问题:
14      *     第一种方式:
15      *         使用@SkipValidation的注解
16      *  第二种方式:
17      *      定义验证方法的名称:validate+动作名称  动作名称的首字符还要大写
18      */
19     public void validateRegister(){
20         if(StringUtils.isEmpty(user.getUsername())){
21             //存入错误信息,直接调用父类的addFieldError方法,存入错误信息。第一个参数是表单name属性的值。第二个参数是错误提示
22             addFieldError("username", "请输入用户名");
23         }
24     }
25
26     }
27     

解决方法二

解决办法1和解决办法2的使用时机:需要验证的动作方法少,用解决办法2。需要验证的方法多,用解决方式1。(简单一点:挑少的写)

所有编程式验证的弊端:硬编码。

2.2、声明式验证(推荐)

通过编写验证规则的xml文件。需要验证时,编写xml文件,不要验证,就不写。

                            优势:解决了2.1编程式验证的弊端

a、针对动作类中的所有动作进行验证:在动作类所在的包中,建立一个ActionClassName-validation.xml的文件,内容如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE validators PUBLIC
 3           "-//Apache Struts//XWork Validator 1.0.3//EN"
 4           "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
 5 <!-- 当使用ActionClassName-validation.xml来命名文件时,它是一个动作类验证器。会验证动作类中的所有动作方法 -->
 6 <validators>
 7     <!-- 基于字段的声明式验证 -->
 8     <!-- field中name属性指定的是表单name属性的取值 -->
 9     <field name="username">
10         <!-- struts2框架为我们集成了很多的内置验证器。requiredstring会验证输入内容是否为空,是否为空字符串。并且去掉左右空格-->
11         <field-validator type="requiredstring">
12             <message>用户名呢</message>
13         </field-validator>
14     </field>
15 </validators>

ActionClassName-validation.xml

注意:它是针对动作类中的所有动作方法。

b、针对动作类中的某个动作进行验证:在动作类所在的包中建立一个xml文件,名称为ActionClassName-ActionName-validation.xml。内容如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE validators PUBLIC
 3           "-//Apache Struts//XWork Validator 1.0.3//EN"
 4           "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
 5 <!-- 当使用ActionClassName-ActionName-validation.xml来命名文件时,它是一个指定动作方法的验证器。只会验证指定的动作方法 -->
 6 <validators>
 7     <!-- 基于字段的声明式验证 -->
 8     <!-- field中name属性指定的是表单name属性的取值 -->
 9     <field name="username">
10         <!-- struts2框架为我们集成了很多的内置验证器。requiredstring会验证输入内容是否为空,是否为空字符串。并且去掉左右空格-->
11         <field-validator type="requiredstring">
12             <message>用户名必须存在</message>
13         </field-validator>
14     </field>
15
16     <!-- 基于验证器的验证 -->
17     <validator type="requiredstring">
18         <!-- 以注入的方式,提供要验证的字段信息
19         setFieldName("password");
20         -->
21         <param name="fieldName">password</param>
22         <message>密码必须输入</message>
23     </validator>
24 </validators>

ActionClassName-ActionName-validation.xml

它是针对指定动作方法进行验证:

2.3、Struts2内置的常用声明式验证器

2.3.1位置:

xwork-core-2.3.15.3.jar\com\opensymphony\xwork2\validator\validator\default.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE validators PUBLIC
 3         "-//Apache Struts//XWork Validator Definition 1.0//EN"
 4         "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">
 5
 6 <!-- START SNIPPET: validators-default -->
 7 <validators>
 8     <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
 9     <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
10     <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
11     <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
12     <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
13     <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
14     <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
15     <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
16     <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
17     <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
18     <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
19     <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
20     <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
21     <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
22     <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
23     <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
24 </validators>
25 <!--  END SNIPPET: validators-default -->

default.xml

2.3.2、验证器注入参数

例如:我们使用requiredstring,默认是去空格,当我们不想去空格时,就可以给验证器注入参数。

      基于字段的:            

 1 <!-- 基于字段的声明式验证 -->
 2     <!-- field中name属性指定的是表单name属性的取值 -->
 3     <field name="username">
 4         <!-- struts2框架为我们集成了很多的内置验证器。requiredstring会验证输入内容是否为空,是否为空字符串。并且去掉左右空格-->
 5         <field-validator type="requiredstring">
 6             <!--给requiredstring的trim参数 通过 set方法注入参数-->
 7             <param name="trim" >false</param>
 8             <message>用户名必须存在</message>
 9         </field-validator>
10     </field>

                                               另一种基于验证器的:

                                  

1 <!-- 基于验证器的验证 -->
2     <validator type="requiredstring">
3         <!-- 以注入的方式,提供要验证的字段信息
4         setFieldName("password");
5         -->
6         <param name="fieldName">password</param>
7         <message>密码必须输入</message>
8     </validator>

                                              

3、常用验证器示例

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%--导入struts2的标签库 --%>
 3 <%@ taglib uri="/struts-tags" prefix="s" %>
 4 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 5 <html>
 6   <head>
 7     <title>用户注册,使用的是struts2的标签</title>
 8     <s:head></s:head>
 9   </head>
10   <body>
11       <s:actionerror/> <%--动作错误 --%>
12       <%--<s:fielderror /> 字段错误 --%>
13       <%--struts2的form标签,它提供了和原始html表单标签几乎一致的属性
14           action:请求的地址。直接写动作名称。不用写contextPaht
15           method:请求的方式。在这里不用写。struts2的form表单默认就是post
16           enctype:表单编码的MIME类型
17       --%>
18       <s:form action="addStudent.action">
19           <s:textfield name="username" label="用户名" />
20           <s:textfield name="age" label="年龄"/>
21           <s:textfield name="email" label="邮箱"/>
22           <s:textfield name="password" label="密码" />
23           <s:textfield name="repassword" label="确认密码"/>
24           <s:textfield name="score" label="成绩"/>
25           <s:textfield name="url" label="个人主页"/>
26           <%--list中的取值是生成一个list集合,并往集合中放入元素 --%>
27           <s:radio name="gender" list="{‘男‘,‘女‘}"  label="性别"/>
28           <s:submit value="注册"/>
29       </s:form>
30   </body>
31 </html>

jsp页面

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE validators PUBLIC
 3           "-//Apache Struts//XWork Validator 1.0.3//EN"
 4           "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
 5 <validators>
 6     <field name="username">
 7         <field-validator type="requiredstring">
 8             <message>请输入用户名</message>
 9         </field-validator>
10     </field>
11
12     <field name="age">
13         <field-validator type="int">
14             <!-- 使用注入的方式,设置最大和最小值 -->
15             <param name="min">18</param>
16             <param name="max">100</param>
17             <message>请输入18-100之间的整数</message>
18         </field-validator>
19     </field>
20
21     <field name="email">
22         <field-validator type="email">
23             <message>请输入正确的邮箱格式</message>
24         </field-validator>
25     </field>
26
27     <field name="password">
28         <field-validator type="requiredstring">
29             <!-- 注入取消使用trim -->
30             <param name="trim">false</param>
31             <message>请输入密码</message>
32         </field-validator>
33         <field-validator type="stringlength">
34             <param name="minLength">3</param>
35             <param name="maxLength">8</param>
36             <message>密码长度是3~8位的</message>
37         </field-validator>
38     </field>
39
40     <!-- 确认密码和密码必须保持一致,是2个字段的事,所以要使用基于验证器的声明方式 -->
41     <validator type="expression">
42         <param name="expression">
43             <![CDATA[
44                 password == repassword
45             ]]>
46         </param>
47         <message>两次密码必须一致</message>
48     </validator>
49
50     <field name="score">
51         <field-validator type="regex">
52             <param name="regex">
53                 \d+
54             </param>
55             <message>请输出正确的成绩</message>
56         </field-validator>
57     </field>
58
59     <field name="url">
60         <field-validator type="url">
61             <message>请输入正确的url地址</message>
62         </field-validator>
63     </field>
64
65     <field name="gender">
66         <!-- required是一个只验证是否null的内置验证器,不会去除空格 -->
67         <field-validator type="required">
68             <message>请选择性别</message>
69         </field-validator>
70     </field>
71 </validators>

验证的xml文件

1 <!-- 声明式验证器案例的动作类配置 -->
2         <action name="addStudent" class="com.itheima.web.action.StudentAction" method="addStudent" >
3             <result name="input">/student.jsp</result>
4         </action>

配置strut2.xml文件

运行结果:

时间: 2024-08-07 11:55:01

strut2 的数据验证的相关文章

POI 数据验证

从3.8开始,POI使用.xls和.xlsx格式处理数据校验略有不同之处.1)针对一个或多个预定义值检查用户输入到单元格的值以下代码将限制用户能输入到单元格A1的值是三个整数值(10.20.30)之一:    Workbook workbook = new XSSFWorkbook();  // 或者new HSSFWorkbook    Sheet sheet = workbook.createSheet("Data Validation");    // 数据验证帮助类    Da

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

目录 一.模型状态 - ModelState 二.数据注解 - Data Annotations 三.自定义数据注解 四.全局数据验证 五.单元测试   一.模型状态 - ModelState 我理解的ModelState是微软在ASP.NET MVC中提出的一种新机制,它主要实现以下几个功能: 1. 保存客户端传过来的数据,如果验证不通过,把数据返回到客户端,这样可以保存用户输入,不需要重新输入. 2. 验证数据,以及保存数据对应的错误信息. 3. 微软的一种DRY(Don't Repeat

数据验证【web前端,表单】

数据验证 最近做后台比较多,路七八糟的数据验证,弄得不厌其烦.SO,弄了个表单验证的玩意出来,达到快速,简介,不烦人的验证. 下面看看,几种方式的数据验证,有什么不同.先有需要验证的数据: <form> <input type="text" name="name" /> <input type="text" name="password" /> <input type="nu

如何使用JavaScript和正则表达式进行数据验证

利用客户端JavaScript的优势,JavaScript中的正则表达式可以简化数据验证的工作,下面与大家分享下如何使用JavaScript和正则表达式进行数据验证,感兴趣的朋友可以参考下哈 数据验证是网络应用软件从客户端接受数据的重要步骤,毕竟,您需要在使用客户数据前确保其符合预期的格式.在网络应用程序中,您可以选择使用特定平台的工具,比如ASP.NET.JSP等等,或者您可以利用客户端JavaScript的优势,JavaScript中的正则表达式可以简化数据验证的工作. 正则表达式 正则表达

MVC 数据验证

前一篇说了MVC数据验证的例子,这次来详细说说各种各样的验证注解.System.ComponentModel.DataAnnotations 一.基础特性 一.Required 必填选项,当提交的表单缺少该值就引发验证错误. 二.StringLength 指定允许的长度 指定最大长度: [StringLength(20)] //最大长度不超过20个字符 指定最短于最长限制: [StringLength(20,MinimumLength=3)] //最大长度不超过20个字符,最短不能低于3个字符

MVC 3 数据验证 Model Validation 详解

续我们前面所说的知识点进行下一个知识点的分析,这一次我们来说明一下数据验证.其实这是个很容易理解并掌握的地方,但是这会浪费大家狠多的时间,所以我来总结整理一下,节约一下大家宝贵的时间. 在MVC 3中 数据验证,已经应用的非常普遍,我们在web form时代需要在View端通过js来验证每个需要验证的控件值,并且这种验证的可用性很低.但是来到了MVC 新时代,我们可以通过MVC提供的数据验证Attribute来进行我们的数据验证.并且MVC 提供了客户端和服务器端 双层的验证,只有我们禁用了客户

MVC4 数据验证、特性、自动属性总结

最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    最近在做自学MVC,遇到的问题很多,索性一点点总结下. MVC4数据验证: 本例以程序为例就行说明: public class MyModel { [Required(ErrorMessage = "请输入收件人姓名")] public string Uname { get; set; } [Required(ErrorMessage =

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

这一次的笔记的主要内容是单机和网游的数据存储,数据验证方式,在游戏的时候除了控制角色的行动,还涉及到用户角色的升级,经验,金钱赚取,道具购买,技能升级 等等一些数据的交易, 那么单机游戏和网游的区别如下如图: 单机购买流程: 单机游戏的数据存储都是在本地客户端存储的,验证简单,执行简单,在玩单机游戏的时候我想很多人都知道外挂是怎么回事吧没救是通过修改内存,或者是本地数据无敌,随时原地满血复活状态. 网游相对来说数据安全性就比较高了,前几年的网游还有外挂,比如说CF 开启外挂来直接枪枪爆头,隔墙爆

Java实战之01Struts2-03属性封装、类型转换、数据验证

九.封装请求正文到对象中 1.静态参数封装 在struts.xml配置文件中,给动作类注入值.调用的是setter方法. 原因:是由一个staticParams的拦截器完成注入的. 2.动态参数封装:开发时用到的 通过用户的表单封装请求正文参数. 2.1.动作类作为实体模型 实体模型:Entity,对应数据库中表的记录(注意类对应的是表结构,而对象对应的是一条记录) 1 public class Demo1Action extends ActionSupport { 2 3 private St