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
但是,该验证方法会对动作类中的所有动作方法进行验证。
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>
注意:它是针对动作类中的所有动作方法。
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>
它是针对指定动作方法进行验证:
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 -->
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>
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>
1 <!-- 声明式验证器案例的动作类配置 --> 2 <action name="addStudent" class="com.itheima.web.action.StudentAction" method="addStudent" > 3 <result name="input">/student.jsp</result> 4 </action>
运行结果: