Struts2 数据校验

【前言】

对于Web应用而言,表现层主要用于与用户交互,包括收集用户输入的数据,向用户呈现服务器状态数据。因此表现层数据的流向主要有两个方向:输入数据和输出数据。

Struts2 数据校验插图

用户的输入信息是非常复杂的,比如用户操作不熟练,输入出错,硬件设备不正常,网络传输不稳定,甚至有恶意用户的蓄意破坏……这些都有可能导致输入异常。

异常的输入,轻则导致系统非正常中断,重则导致系统崩溃。应用程序必须能正常处理表现层接收的异常数据,通常的做法是遇到异常输入时应用程序直接返回,提示用户必须重新输入,也就是将那些异常输入过滤掉。这就是数据校验。

Struts2 数据校验插图(1)

数据校验可以分为客户端校验和服务器端校验两种。客户端校验服务器端校验都是必不可少的。

客户端进行基本校验,如非空验证、格式验证等。客户端校验主要用来过滤用户的误操作,以拒绝误操作输入提交到服务器端处理,从而降低服务器端负担。

服务器端进行需要数据库参与的验证,如用户名是否存在、产品编号是否唯一等。服务器端验证防止非法数据进入程序,导致程序异常、底层数据库异常。服务器端校验是保证程序有效运行及数据完整的手段。

我记得一句名言:All Input Is Evil,即所有的输入都是邪恶的!这句话的意思并不是说所有的用户都是邪恶的,而是说开发者应该以最坏的打算来面对用户的输入,而不是以最好的打算来面对浏览者的输入——只有以这样的态度写出来的应用程序才是最强壮的。

对于一个成熟的、智能的MVC框架而言,不可避免地需要实现数据校验。Struts2提供了非常强大的输入校验体系,通过Struts2内建的输入校验器,Struts2应用无须书写任何输入校验代码,即可完成绝大部分输入校验,并可以同时完成客户端验证和服务器端校验。如果应用的输入校验规则特别复杂,Struts2也允许通过重写validate()方法或validateXxx()方法来完成自定义校验;除此之外,Struts2的开发性允许开发者提供自定义的校验器

验证的方式

  • 客服端校验:使用js结合正则表达式来校验,不和服务器打交道,开发简单,安全性差
  • 服务器端校验:请求web服务器,开发量比较大,但是安全性好,如果需要和数据库打交道的就必须要使用服务器端校验。
  • 实际开发中,客户端校验比较多,最好的是客户端和服务端都校验。
  • struts2的校验属于服务器端校验。

一、编程式校验(使用Validate方法进行数据校验)

Struts2框架提供了两个校验有关的接口,分别是Validateable和 ValidationAware,其中Validateable接口只有一个validate方法。

在Struts2 调用Action的Execute()之前会自动调用Validaeable接口的validate()方法,因此可以将校验代码写到该方法中。但是valiate()方法没有返回值。这就意味着无法通过了Validate()方法来验证输入数据是否通过strus2校验。

为了使Struts2 能够获取校验结果,可以使用另一个校验感知接口ValidationAware。该接口存放了一些列addXXX()方法,可以将校验过程中发生的错误信息添加到系统中。实际上是个Map对象常用方法是AddFiredError()方法。该方法向系统添加每一个字段的校验信息,如果字段校验成功,则字段没有错误信息。

Struts 2 ActionSupport也实现了这两个接口。Struts2 在执行方法Valiate()方法后,会判断Map 对象中是否有错误信息,如果存在键值对,那么就不会执行execute()方法,直接返回input界面,反则就会执行execute()方法。

在继承ActionSupport类中,增加数据校验方法。

/**
     * 在封装参数之前做验证,如果验证不通过,跳转到表单页面
     */
    @Override
    public void validate() {
       // 写数据验证过程....
        if(!person.getName().matches("[a-zA-A]{3,8}")){
            // 添加提示信息,第一个参数是字段名表单中的文本域的name,第二个是提示信息
            addActionError("name", "姓名只能是大小写字母(3-8位)");
        }
    }

    private void addActionError(String name, String s) {
        this.addActionError(name, s);
    }
 
}

跳出校验


// 跳出校验 在方法前
@SkipValidation
public String delect() {
    System.out.println(person);
    return super.SUCCESS;

小结:

编程式校验:

jsp——->action类——->target_jsp

1.action类里有validate方法,对所有校验若是对别的方法校验,如login(),需要自己编写validateLogin()方法

2.action类里的validate方法编写错误提示信息,this.addFieldError(“msg.error”,”错误”);

3.配置文件里struts.xml需要制定result 属性name为input的跳转页面,专供validate失败用;

4.target_jsp里,要加上如下标签:

<p:fielderror>

<p:param> msg.error</p:   param>

注意:与action类里的msg.error对应

</p:fielderror>

 

二、声明式校验(Validation框架进行数据校验)

为了解决Action和验证逻辑的高耦合,我们可以使用声明式验证,我们要把验证规则配置在xml中。

规则:在Action的同级包下创建一个xml,名称规范:Action名-validation.xml

打开xwork-validator-config-1.0.dtd,把头信息copy到我们的xml中。

Struts2 数据校验插图(2)

如:

<?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>
    <!--表单中要提交的文本域
        name:文本域的name值
    -->
    <field name="name">
        <!--文本域的验证器-->
        <field-validator type="requiredstring">
            <message>姓名不能为空</message>
        </field-validator>
        <field-validator type="regex">
            <param name="regex">[a-zA-Z]{3,8}</param>
            <message>姓名为3-8位的字符</message>
        </field-validator>
    </field>
    <!--第二种验证的配置方式-->
    <validator type="regex">
        <!--配置验证的字段-->
        <param name="fieldName">address</param>
        <!--验证的正则-->
        <param name="regex">\d{6,8}</param>
        <!--提示信息-->
        <message>请输入6-8位的文本</message>
    </validator>
</validators>
系统提供的校验器参数配置如下:

Struts2 数据校验插图(3)

转换校验器 conversion 要求field在类型转换时不能出错 fieldName:指定要校验的字段名
必填校验器 required 要求field不能为null fieldName:指定要校验的字段名
必填字符串校验器 requiredstring 要求field的值不能为null,并且长度大于0,默认情况下会对字符串去前后空格 fieldName:指定要校验的字段名

trim:指定是否应该截取字段值前后的空格,默认值为true

字符串长度校验器 stringlength 要求field的值必须在指定的范围内 fieldName:指定要校验的字段名

trim:指定是否应该截取字段值前后的空格,默认值为true

minLength:指定最小长度

maxLength:指定最大长度

字段表达式校验器 fieldexpression 要求field满足一个OGNL表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过 fieldName:指定要校验的字段名

expression:指定OGNL表达式

 

正则表达式校验器 regex 要求field满足一个正则表达式,用<![CDATA[(正则表达式)]]>以免特殊字符的错误 fieldName:指定要校验的字段名

trim:指定是否应该截取字段值前后的空格

expression:指定正则表达式

caseSensitive:指定进行正则表达式匹配时,是否区分大小写,默认值为true

邮件地址校验器 email 要求如果field的值非空,则必须是合法的邮件地址 fieldName:指定要校验的字段名
网址校验器 url 要求如果field的值非空,则必须是合法的url地址 fieldName:指定要校验的字段名
整数校验器 int 要求field的整数值必须在指定范围内 fieldName:指定要校验的字段名

min:指定最小值

max:指定最大值

双精度浮点数校验器 double 要求field的双精度浮点数必须在指定范围内 fieldName:指定要校验的字段名

minInclusive:指定浮点数的最小值(包括该值)

maxInclusive:指定浮点数的最大值(包括该值)

minExclusive:指定浮点数的最小值(不包括该值)

maxExclusive:指定浮点数的最大值(不包括该值)

配置式校验小结:

1.玩action类方法,其中不需要写validate方法;

2.在action类方法同一文件夹内,编写文件,action类名-validation.xml

3.不需要在target_jsp文件里写fielderror标签

总结,其实和写一般action跳转没区别,只是中间加上编写xml文件的过程。

 

文章已创建 80

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部