zoukankan      html  css  js  c++  java
  • Struts2数据校验

    Struts2数据校验

    1.常见数据校验方法

    表单数据的校验方式:
    表单中的数据必须被效验以后才能够被使用,常用的效验方式分为两种:
    前台校验:也称之为客户端效验,主要是通过JS编程的方式进行表单数据的验证
    后台校验:也称之为服务器端校验,这里指的是使用Struts2通过xml配置的方式进行表单数据验证

    Struts2也提供了数据校验的方式:
    Struts2数据校验通过拦截器完成:
    <interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>

    Struts使用拦截器实现数据校验的原理:jsp页面中的表单数据提交之后是被Action类处理,例如登录提交之后,action的中先进行validate()的一个方法来验证数据,如果数据验证成功,则继续执行action的处理程序,如果数据验证不成功,则补再执行action的处理程序。但是如果让每一个的提交都先执行validate()呢?并且如何判断validate()失败之后不在执行处理程序呢?
    这里就可以使用拦截器,因为拦截器是在action对象创建之后执行,执行拦截器之后再执行action类。所有,可以让拦截器先执行validate()方法,如果校验不成功,就不再执行action处理程序。

    2.Struts数据校验方式

    2.1.代码方式验证Action中所有的方法

    使用代码方法校验Action中的所有方法,只需要在Action中重写一个固定方法:validate(),把校验规则现在这里里面即可。拦截器会自动对Action中的所有处理方法执行这个验证。
    代码示例:

    package b_vaild;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    /**
     * 注意:如果要想使用Struts的数据校验功能,就必须继承ActionSupport
     */
    public class UserAction extends ActionSupport{
    
        //封装请求数据
        private User user;
    
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
    
        //重写数据验证的方法
        @Override
        public void validate() {
           //用户名非空
            if (user.getUserName()==null || "".equals(user.getUserName())){
                //保存错误信息
                super.addFieldError("userName","用户名必须填写!");
            }
    
            //密码
            if (user.getPwd()==null || "".equals(user.getPwd())){
                super.addFieldError("pwd","密码必填");
            }
        }
    
        //业务方法
        public String register(){
            System.out.println(user);
            return SUCCESSuu;
        }
    }
    

    需要注意两点:
    1.必须要继承ActionSupport。
    2.验证方法的名字必须是validate().

    2.2.代码方式验证Action中指定的方法

    上面的方法会对Action中的所有处理程序执行数据校验,但是很多时候只需要对个别处理程序校验,其他方法不需要校验,例如对数据表单的提交处理程序就必须提供校验,但是对转发或者列表展示等是不需要数据校验的。
    这个时候就需要对Action中指定的方法进行数据校验,具体操作方法只需要修改验证方法的名字,原本是validate()修改为:validate()+要验证的方法

    例如:
    public void validateRegister() {……}
    只会验证当前action的register方法!

    2.3.XML方式验证Action中所有的方法

    使用上面的代校验Action方法非常的繁琐,需要重复写校验逻辑,例如:非空验证,数值验证,email验证,日期等

    更推荐的是使用Struts的xml方式验证,因为这种方式验证时Struts已经对常用的验证进行了封装,即提供了一些常用的验证器,直接使用即可

    常用验证器的位置:
    xwork-core-2.3.4.1.jar/com/opensymphony/xwork2/validator/validators/default.xml

    常用的验证器:

    <validators>
    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
    <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
    <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
    <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
    <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
    <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
    </validators>
    

    required:

    确保某给定字段的值不是空值 null

    requiredstring:

    确保某给定字段的值既不是空值 null, 也不是空白.
    trim 参数. 默认为 true, 表示 struts 在验证该字段值之前先剔除前后空格.

    stringlength:

    验证一个非空的字段值是不是有足够的长度.
    minLength: 相关字段的最小长度. 若没有给出这个参数, 该字段将没有最小长度限制
    maxLength:相关字段的最大长度. 若没有给出这个参数, 该字段将没有最大长度限制
    trim: 在验证之前是否去除前后空格

    int:

    检查给定字段的值是否可以被转换为一个整数且在一定范围
    min: 相关字段的最小值. 若没给出这个参数, 该字段将没有最小值限制
    max: 相关字段的最大值. 若没给出这个参数, 该字段将没有最大值限制

    date:

    确保某给定日期字段的值落在一个给定的范围内
    max:相关字段的最大值. 若没给出这个参数, 该字段将没有最大值限制
    min:相关字段的最小值. 若没给出这个参数, 该字段将没有最小值限制

    email:

    检查给定 String 值是否是一个合法的 email

    url:

    检查给定 String 值是否是一个合法的 url

    regex:

    检查某给定字段的值是否与一个给定的正则表达式模式相匹配.
    expresssion*: 用来匹配的正则表达式
    caseSensitive: 是否区分字母的大小写. 默认为 true
    trim: 是否去除前后空格. 默认为 true

    conversion:

    转换校验器,指定在类型转换失败时,提示的错误信息

    visitor:

    用于校验action中的复合属性,它指定一个校验文件用于校验复合属性中的属性

    expression:

    OGNL表达式校验器,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中

    double:

    双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值 `

    具体配置方法:
    1.创建配置文件,文件名命名语法:ActionClassName-validation.xml

    注意:此xml需要与当前要验证的action在同一个目录
    举例:UserAction-validation.xml

    2.写XML

    <?xml version="1.0" encoding="UTF-8"?>
    
      <!DOCTYPE validators PUBLIC
      		"-//Apache Struts//XWork Validator 1.0.3//EN"
      		"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
    
    
    <validators>
        <!--验证的每一个字段用filed表示-->
    
        <!--验证用户名-->
        <field name="user.userName">
            <!--指定使用的验证器,此处选择非空验证-->
            <field-validator type="requiredstring">
                <!--验证失败的错误提示信息-->
                <message>用户名不能为空</message>
            </field-validator>
        </field>
    
        <!--验证pwd-->
        <field name="user.pwd">
            <!--密码非空-->
            <field-validator type="requiredstring">
                <message>密码不能为空</message>
            </field-validator>
    
            <!--密码长度验证-->
            <field-validator type="stringlength">
                <param name="minLength">6</param>
                <param name="maxLength">8</param>
                <message>密码必须为6-8位!</message>
            </field-validator>
        </field>
    
        <!--验证日期-->
        <field name="user.birth">
            <field-validator type="date">
                <message>日期格式不对!</message>
            </field-validator>
        </field>
    
        <!--验证email-->
        <field name="user.email">
            <field-validator type="email">
                <message>邮箱格式错误!</message>
            </field-validator>
        </field>
    </validators>
    

    2.4.XML方式验证Action中指定的方法

    验证Action中指定方法与上面xml验证方式大致相同:验证xml内容不变,修改文件名:
    语法:ActionClassName-ActionName-validation.xml
    举例只验证UserAction中的register方法,则文件命名为:UserAction-user_register-validation.xml,user_register是xml中action的name

    2.5.验证总结

    代码:
    重写validate(),验证action所有方法
    validate(),验证指定“方法名”的方法

    XML:
    验证所有方法:ActionClassName-validation.xml
    验证指定方法:ActionClassName-actionName-validation.xml

    代码验证:
    比较灵活,可以满足所有要求
    比较繁琐,要写重复的验证判断逻辑
    适合:表单字段较少的情况用!

    XML验证:
    通用,但不够灵活,可以验证特定简单的业务
    适合:验证表单字段较多,可以大大简化代码!(配置文件过多)

    3.验证错误处理

    Struts2在进行数据校验的时候,验证失败,会返回input视图,要求我们要在struts.xml中配置input视图对应的错误页面!

    struts.xml中配置:

    <!-- 注册失败跳转到注册页面,显示失败信息 -->
    		<global-results>
    			<result name="input">/register.jsp</result>
    		</global-results>
    
    ``
    **JSP页面显示错误:**
    方式1:显示所有错误:
    ```jsp
    <%@taglib prefix="s" uri="/struts-tags" %>
    <%--显示的是struts在运行时期间产生的所有错误--%>
    <s:fielderror fieldName="user.userName"/>
    <s:fielderror fieldName="user.pwd"/>
    <s:fielderror fieldName="user.email"/>
    <s:fielderror fieldName="user.birth"/>
    
    

    方式2:显示指定的错误:
    方式1 中会在表单砂上面显示,一般我们希望的是能够在表单后面显示错误信息,但是验证器又默认是带有换行操作的,所以可以通过css来取消换行操作,然后把错误信息放在每个表单后面:

    <!-- 修改struts标签默认的样式: 不让换行 --> 
    	<style type="text/css">
    	ul{
    		display: inline;
    	}
    	ul li{
    		display: inline;
    		color: red;
    	}
    	</style>
    

    显示指定错误信息:

    <s:fielderror fieldName="user.userName"></s:fielderror>
    
    

    方式3:
    既然默认是带有换行操作的,那么也可以修改源码取消换行,这样就不用写css了
    具体操作方式是:
    找到fielderror标签定义的模板文件:
    Struts-core.jar emplatesimple fielderror.ftl

    把修改后的fielderror.ftl文件,放到src/ template/ simple/ fielderror.ftl

    这样标签显示的样式就修改了!

  • 相关阅读:
    Springboot + Mybatis 多数据源配置
    构建微服务:Spring boot 入门篇
    IDEA SpringBoot代码修改热部署/加载
    vue-cli知识点
    vuex知识点
    正则基本知识
    多行SQL语句拼成一条数据
    软件的版本控制
    ASP.NET 表单验证实现浅析
    建造者模式
  • 原文地址:https://www.cnblogs.com/cenyu/p/6235794.html
Copyright © 2011-2022 走看看