zoukankan      html  css  js  c++  java
  • 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.jarcomopensymphonyxwork2validatorvalidatordefault.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文件

                      

                                 

                      

                                运行结果:

                               

  • 相关阅读:
    pl/sql优化策略 老猫
    游标调用函数 老猫
    oracle性能检测sql语句 老猫
    Oracle高级SQL培训与讲解 老猫
    Oracle执行计划详解 老猫
    SQL中获取树形结构所有子级数据
    纯 CSS 实现的下拉菜单
    Node.JS 异步遍历目录
    Node.JS 的安装与入门
    Node.JS 的模块管理介绍
  • 原文地址:https://www.cnblogs.com/soficircle/p/7061888.html
Copyright © 2011-2022 走看看