第五节(下):Struts2-校验

来源:互联网 发布:pitta mask 知乎 编辑:程序博客网 时间:2024/05/17 02:18

一。说明

数据校验,对客户端访问的参数进行数据校验,如果请求数据类型无法转换或不在合法范围内都属于数据校验失败。但在Struts2中数据类型转换和合法性的校验分别放在两个部分(拦截器)执行。

请求首先通过类型转换拦截器将参数赋值到Action属性,再通过数据校验方法对Action属性进行合法性校验。如果数据在类型转换过程中失败,依然会执行合法性校验。

类型转换和数据校验过程中会将错误信息存放到fieldError对象中,Struts2另一个拦截器负责检测fieldError对象中是否包含错误信息,如果包含则跳转到INPUT所指定的物理页面。

DTD文件地址已改变

旧地址:http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd

新地址:http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd

二。数据校验的编写方式分为两种:代码方式与配置文件方式

代码方式

重写Aciton类的validate方法,对任何Action访问均执行。

在方法内对数据进行合法校验,并将错误信息保存到fieldError对象内。

编写Action类的validateXxx方法,对xxx指定的访问执行。xxx是配置action时的method值。

如果同时编写validate与validateXxx方法,则执行顺序为先执行validateXxx后执行validate方法。如果action类存在继承关系validate方法会被继承下来并执行。

在校验方法中通过addFieldError("标签名","错误提示内容")来对fieldError对象进行操作,同时调用getText方法的话可以实现国际化提示信息功能。


Struts2的输入校验流程
1.类型转换器负责对字符串的请求参数执行类型转换,并将这些值设置成Action的属性值。
2.在执行类型转换过程中可能出现异常,如果出现异常,将异常信息保存到ActionContext
中,conversionError拦截器负责将其封装到fieldError里,然后执行第三步;如果转换过
程没有异常信息,则直接进去第三步。
3.通过反射调用validateXxx()方法,其中Xxx是即将处理用户请求的处理逻辑所对应的方法
名。
4.调用Action类里的validate()方法。
5.如果经过上面4步都没有出现fieldError,将调用Action里处理用户请求的处理方法;如果
出现了fieldError,系统将转入input逻辑视图所指定的视图资源。

配置文件方式

与Action中所有方法关联的配置方式

编写xml规则配置文件(参考以字段为主语的配置方式、以规则为主语的配置方式

命名规范:<Action类的名称>-validation.xml

保存在与Action类同目录下。

与Action中某一个方法关联的配置方法

编写xml规则配置文件(参考以字段为主语的配置方式、以规则为主语的配置方式

命名规范:<Action类的名称>-<Action访问名(配置Action的name名)>-validation.xml

保存在与Action类同目录下。

执行顺序:与代码编写同理。

情况一,为loginAciton配置了loginAction-validation.xml并为loginAction的login方法配置loginAction-login-validation.xml文件,执行顺序如下。

1.loginAction-validation.xml

2.loginAction-login-validation.xml

情况二,为父类baseAction配置了类校验规则,父类baseAction的login方法配置了方法校验规则。

       为子类loginAction配置了类校验规则,为子类loginAction的login方法配置了方法校验规则。

执行顺序如下。

1.baseAction-validation.xml

2.baseAction-login-validation.xml

3.loginAction-validation.xml

4.loginAction-login-validation.xml

以字段为主语的配置方式

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd"><validators><field name="被校验的字段名称" short-circuit="true"><field-validator type="校验规则名称"><param name="参数名">参数值</param><message key="国际化文件中的key,据说是不管用要通过OGNL表达式实现">校验失败后的提示信息(支持使用${getText("key")}实现国际化提示功能)</message></field-validator></field></validators>

以规则为主语的配置方式

<validators><validator type="校验规则名" short-circuit="true"><param name="fieldName">需要被校验的字段</param><param name="参数名">参数值</param><message key="国际化文件中的key,据说是不管用要通过OGNL表达式实现">校验失败后的提示信息(支持使用${getText("key")}实现国际化提示功能)</message></validator></validators>

短路的应用效果

当一个字段要满足多个校验规则时,第一个规则失败后不去执行其他规则校验。

在<field.../>和<validator.../>标签中通过short-circuit控制。="true"表示短路 =“false”表示非短路。

短路的执行顺序

1.所有以规则为主语的校验器优先于以字段为主语的校验器。

2.所有以规则为主语的校验器中,排在前面的会先执行。

3.所有以字段为主语的校验器中,排在前面的会先执行。

短路的规则

1.所有以规则为主语的校验器是最优先执行,如果某个以规则为主语的校验器校验失败了,则该字段上所有以字段为主语的校验器都不会执行。

2.以规则为主语的校验器失败,不会阻止其他以规则为主语的校验器的执行。

3.如果一个以字段为主语的校验器失败后,则该字段下的且排在该校验失败的校验器之后的其他以字段为主语的校验器不会执行。

4.以字段为主语的校验器永远都不会阻止以规则为主语的校验器。


内建校验器功能说明(略...)







0 0
原创粉丝点击