zoukankan      html  css  js  c++  java
  • struts2的验证

    1、原理

    当浏览器向服务器提交表单数据时,在服务器端需要对表单数据的有效性进行校验.

    “校验方法”会在“业务方法”之前调用。

    2、实现验证的两种方式

    struts2校验的两种实现方法:

    1. 手工编写代码实现(基本验证)

    2. 基于XML配置方式实现(框架验证)

    2.1、基本验证(对action的方法进行校验)

    这种验证方式,它本质上就是在原来的Action类中覆写validate()或添加validateXxx()方法,就可以了。

    以validateXxx()方法为例

    (1)在Action类中添加validateXxx()方法,并执行校验判断

    (2)在validateXxx()方法内部,如果出错了,就调用addFieldError()方法来添加错误信息

    (3)在struts.xml的相应action标签配置中,添加名为input的result处理页面。

    步骤:

    (1)Action继承ActionSupport,实现校验方法  

    1
    2
    validate()方法校验action中所有与execute方法签名相同的方法 
    validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的首字母大写

    (2)校验失败时,调用addFieldError()方法向系统fieldErrors添加校验失败信息,如系统fieldErrors包含失败信息,请求转发到名为input的result。

    (3)在input视图中可通过<s:fielderror/>显示失败信息。

    案例:

    StudentAction.java,继承自ActionSupport类。在下面的代码中,只要覆写validate()方法或者添加validateAdd()方法就可以了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    package com.rk.strut.i_validation;
     
    import com.opensymphony.xwork2.ActionSupport;
     
    public class StudentAction extends ActionSupport
    {
        private String username;
        private String password;
        public String getUsername()
        {
            return username;
        }
        public void setUsername(String username)
        {
            this.username = username;
        }
        public String getPassword()
        {
            return password;
        }
        public void setPassword(String password)
        {
            this.password = password;
        }
        public String add()
        {
            return "success";
        }
         
        public void validateAdd()
        {
            super.validate();
            if(username==null || username.trim().equals(""))
            {
                this.addFieldError("username""用户名不能为空");
            }
             
            if(password == null || password.trim().equals(""))
            {
                this.addFieldError("password""密码不能为空!");
            }
        }
         
        @Override
        public void validate()
        {
            if(username==null || username.trim().equals(""))
            {
                this.addFieldError("username""用户名不能为空");
            }
             
            if(password == null || password.trim().equals(""))
            {
                this.addFieldError("password""密码不能为空!");
            }
        }
         
    }

    2.2、框架校验(基于XML配置方式)

    这种方式,就是不改变原来Java代码(Action类)的编写,将验证的信息,全部放到一个xml文件中。因此,这种方式的关键在于创建xml文件。

    那么原来的Action类和相应的xml验证文件,是如何关联起来的呢?通过“名字”,Action类的名字,正好是xml验证文件名的前缀:<ActionClassName>-validation.xml

    (1)定义Action 继承ActionSupport或者实现Validateable接口:

    (2)配置验证出错转向的页面(配置name为input的result)

    (3)配置验证的xml文件

        *  验证的xml文件的规范在xwork-core-2.X.X.jar包下的:xwork-validator-1.0.3.dtd

        *  验证文件取名应遵守<ActionClassName>-validation.xml规则, 

        其中ActionClassName为 action的简单类名,-validation为固定写法。

    (4)添加验证规则

    1
    2
    3
    4
    5
    <validators>: 根元素
    <field>:指定action中要校验的属性,name属性指定将被验证表单字段的名字
    <field-validator>:指定校验器, type 指定验证规则。系统提供了能满足大部分验证需求的校验器,可在xwork-core-2.X.X.jar的com.opensymphony.xwork2.validator.validators下的default.xml中找到。
    <param>:子元素可向验证程序传递参数
    <message>:子元素为校验失败后的提示信息,如需国际化,可为message指定key属性,key的值为属性文件中的key。

    案例

    (1)LoginAction.java,继承自ActionSupport类。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    package com.rk.strut.i_validation;
     
    import javax.servlet.http.HttpServletRequest;
     
    import org.apache.struts2.ServletActionContext;
     
    import com.opensymphony.xwork2.ActionSupport;
     
    public class LoginAction extends ActionSupport
    {
        private String username;
        private String password;
        public String getUsername()
        {
            return username;
        }
        public void setUsername(String username)
        {
            this.username = username;
        }
        public String getPassword()
        {
            return password;
        }
        public void setPassword(String password)
        {
            this.password = password;
        }
        @Override
        public String execute() throws Exception
        {
            HttpServletRequest request = ServletActionContext.getRequest();
            request.setAttribute("username", username);
            request.setAttribute("password", password);
            return "success";
        }
         
    }

    (2)在struts.xml中配置出现错误时,跳转的页面

    1
    2
    3
    4
    <action name="login" class="com.rk.strut.i_validation.LoginAction">
        <result name="success">/validation/success.jsp</result>
        <result name="input">/validation/error.jsp</result>
    </action>

    错误页

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@taglib uri="/struts-tags" prefix="s"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>错误</title>
    </head>
    <body>
        <s:fielderror></s:fielderror>
    </body>
    </html>

    (3)配置验证的xml文件+添加验证规则:LoginAction-validation.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?xml version="1.0" encoding="UTF-8"?>
     
      <!DOCTYPE validators PUBLIC 
              "-//Apache Struts//XWork Validator 1.0//EN"
              "http://struts.apache.org/dtds/xwork-validator-1.0.dtd">
     
    <validators>
        <field name="username">
            <field-validator type="requiredstring">
                <param name="trim">true</param>
                <message>用户名不能为空</message>
            </field-validator>
        </field>
        <field name="password">
            <field-validator type="requiredstring">
                <param name="trim">true</param>
                <message>密码不能为空</message>
            </field-validator>       
            <field-validator type="stringlength">
                <param name="minLength">3</param>
                <param name="maxLength">6</param>
                <message>密码长度应为3至6个</message>
            </field-validator>
        </field>
    </validators>  

    3、Struts2 预定义校验规则

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

    requiredstring: 确保某给定字段的值既不是空值 null, 也不是空白. 

        trim参数. 默认为true, 表示验证该字段值前先剔除前后空格. 

    stringlength: 验证一个非空字段值是否满足长度要求. 

        minLength:相关字段的最小长度. 若未给出没有最小长度限制

        maxLength:相关字段的最大长度. 若未给出没有最大长度限制

        trim: 在验证之前是否去除前后空格

    int: 检查给定字段的值是否可以被转换为一个整数

        min: 相关字段的最小值. 若没给出这个参数, 该字段将没有最小值限制

        max: 相关字段的最大值. 若没给出这个参数, 该字段将没有最大值限制

    date: 确保某给定日期值在一个给定范围内

        max:相关字段的最大值. 若没给出该参数, 该字段无最大值限制

        min:相关字段的最小值. 若没给出该参数, 该字段无最小值限制

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

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

    regex: 检查某给定字段的值是否与一个给定的正则表达式模式相匹配. 

        expression: 用来匹配的正则表达式

        caseSensitive: 是否区分字母的大小写. 默认为 true

        trim: 是否去除前后空格. 默认为 true

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

    visitor(用于校验action中的复合属性,它指定一个校验文件用于校验复合属性中的属性的java培训)

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

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

    举例

    required  必填校验器

    1
    2
    3
    <field-validator type="required">
           <message>性别不能为空!</message>
    </field-validator>

    requiredstring  必填字符串校验器

    1
    2
    3
    4
    <field-validator type="requiredstring">
           <param name="trim">true</param>
           <message>用户名不能为空!</message>
    </field-validator>

    stringlength:字符串长度校验器

    1
    2
    3
    4
    5
    6
    <field-validator type="stringlength">
        <param name="maxLength">10</param>
        <param name="minLength">2</param>
        <param name="trim">true</param>
        <message><![CDATA[产品名称应在2-10个字符之间]]></message>
    </field-validator>

    int:整数校验器

    1
    2
    3
    4
    5
    <field-validator type="int">
        <param name="min">1</param>
        <param name="max">150</param>
        <message>年龄必须在1-150之间</message>
    </field-validator>

    email:邮件地址校验器

    1
    2
    3
    <field-validator type="email">
        <message>电子邮件地址无效</message>
    </field-validator>

    regex:正则表达式校验器

    1
    2
    3
    4
    <field-validator type="regex">
         <param name="expression"><![CDATA[^15d{9}$]]></param>
         <message>手机号格式不正确!</message>
    </field-validator>

    4、补充

    在xwork-core-2.3.29.jar包下com/opensymphony/xwork2/validator/validators的default.xml文件中包含了一些进行验证的一些类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE validators PUBLIC
            "-//Apache Struts//XWork Validator Definition 1.0//EN"
            "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">
     
    <!-- START SNIPPET: validators-default -->
    <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>
    <!--  END SNIPPET: validators-default -->

    在xwork-core-2.3.29.jar包下包含了几个关于validator的dtd文件

  • 相关阅读:
    155. 最小栈
    160. 相交链表
    PAT 1057 Stack
    PAT 1026 Table Tennis
    PAT 1017 Queueing at Bank
    PAT 1014 Waiting in Line
    PAT 1029 Median
    PAT 1016 Phone Bills
    PAT 1010 Radix
    PAT 1122 Hamiltonian Cycle
  • 原文地址:https://www.cnblogs.com/lm970585581/p/7260580.html
Copyright © 2011-2022 走看看