首页 > 代码库 > strut2 的数据验证

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文件

 

                  

                             

                  

                            运行结果:

                           

strut2 的数据验证