Sruts2-验证器

  前边我们讲过了Struts2框架的运行流程:即Struts2框架主要是通过一系列的拦截器来完成主要的功能的。下边我们接着讲一讲Struts2框架的另一部分内容,Struts2的表单验证功能。

  1.  Struts2的声明验证

  ①  声明式验证的概述

  我们知道,表单的字段验证可以先在前台通过JS或者其他前端框架进行验证,但是一个健壮的WEB应用程序必须确保用户的输入是合法的、有效的,所以我们在服务端也进行表单的验证是非常有必要的。Struts2框架为我们提供了一些基于xwork-validation-framework的内建的验证程序,使用这些验证程序不需要编程,只需要在一个XML文件里对验证程序应该如何工作作出声明就可以了。在这个XML的验证文件里需要指明:对哪个字段进行验证、使用什么验证规则、验证失败应该发送的错误消息内容。

  以上是声明式验证得到内容,我们还可以使用编程验证,即通过自己手写代码来完成验证。

  ②  声明式验证的具体步骤

  首先我们需要明确是对哪个Action的哪个字段进行的验证,所以要在Action所在包下建一个XML文件,名称为ActionName-validation.xml。然后在这个文件中声明对哪个字段进行验证;再下一步声明对这个字段验证时使用什么规则,如int等,并且可以在这个规则下指明一些参数,如在20-50之间;下边需要指明当验证失败时显示的错误信息内容。除了这个验证配置文件外,我们还需要在struts.xml相应的action节点下配置一个bane-"input"的响应页面用于当验证失败时默认要去的页面。

  ③ 错误消息的显示

  对于非simple主题,表单页面会自动显示验证字段失败时的错误消息;而对于simple主题的表单页面,需要我们使用<s:fielderror name="" />来显示字段验证的错误消息。

  ④  一个Action有多个action方法时

  若一个Action类可以应答多个action请求,多个action请求使用不同的验证规则,则需要我们为每一个action请求都定义一个验证配置文件,命名为:ActionName-AliasName-validation.xml(这个AliasName可以是各个action方法的名称)。这时,不带别名的ActionName-validation.xml验证规则依然发生作用,可以将各个请求的共有的验证规则写在这个文件之中,需要注意的是,只适用某一个action请求的验证规则须单独再为其建立一个验证配置文件。

  ⑤  Struts2框架的声明式验证的原理

  Struts2框架的默认拦截器栈中有一个validation拦截器,这个拦截器会调用验证规则对应的拦截器,在xwork.jar的validator包下有一个default.xml文件声明了各种验证器的对应的name和具体的验证器的类。这个default.xml文件将我们在验证配置文件中声明的验证规则name与具体的验证器的类关联了起来,具体起作用的就是这个验证器的类。

  2.Struts2的内建的验证程序

  Struts2提供了15个内建的验证程序,这个十五个验证程序就是十五个类,十五个验证器。

  ①  短路验证

  当一个字段由多个验证规则时,就可以使用短路验证:即若第一个验证失败的话,之后的验证就不会执行。我们在filed-validator节点添加属性short_curcuit="true"即可说明当前这个验证规则是短路验证的。

  ②  终止某个拦截器之后的拦截器的行为

  在默认的default-stack拦截器栈中,我们是先执行转换拦截器conversionError再执行验证validation拦截器的,我们希望当conversionError拦截器转换失败时,就不再进行validation验证拦截器等之后的拦截器,那么要怎么办呢?

  这种情况下,我们就必须通过修改源码来完成我们的需求。我们需要修改ConversionInterceptor拦截器的源码,当然不可以直接在相应的jar包下的.class文件中修改,我们可以通过覆盖的方式进行修改,即在src下新建一个同名的包和类名;然后将类中的代码复制过来,然后根据struts2的运行流程分析可得,我们在doInterceptor()方法中声明当有拦截器转换错误时就提前返回一个字符串(这个字符串代表一个响应的页面),而不去调用ActionInvocation的invoke()回调方法,这样就不会执行之后的拦截器了。

  ③  非字段验证

  在表单上,有时我们需要进行非字段的验证,如:验证密码是否一致、就会用到我们Struts2框架提供的验证器expression。因为这个验证不是针对某一个字段进行的验证,所以这个验证器所带来的错误消息不会放入到filederror中,会放到一个属性名称为actionerror的内容中,所以我们在jsp前台页面要显示这个非字段验证的错误消息时,就要用<s:actionerror/>标签。

  3.相同的验证规则使用同一条验证消息

  当一个请求中的表单有多个字段使用同一个验证规则时,我们可以考虑将验证失败的消息用同一条消息来表示。即相同验证规则的字段使用同一条错误的验证消息。我们知道,在在ActionName-validation.xml文件中的massage节点用来显示错误消息,使用message节点的key属性读取i18n配置文件中的相应的key的value值,但是用同一个value值是无法显示不同的字段名称的,所以我们需要像在i18n配置文件中获取验证规则的初始参数一样,获取验证的字段名称,二者都是用${fieldName}来表示获取字段的属性名称,但是我们有时需要国际化,所以我们用${getText(fieldName)}来获取国际化资源文件中的key对应的value值。

  4.  自定义验证器

  有时我们需要对表单的字段进行自己业务逻辑上的验证,此时就需要自定义验证器来完成业务需求。那么,如何自定义一个验证器呢?

  ①  定义一个类实现或者继承FiledValidatorSupport(用于属性验证器)或者ValidatorSupport(用于一般验证器),并重写validate()方法,在这个方法中通过getFiledName()和getFiledValue()获取验证字段的属性名称和值,然后编写自己的验证业务逻辑。

  ②  配置这个验证器类。

   我们需要将这个验证器的类与在验证配置文件中的验证器类型关联起来,具体内容需要参考xwork.jar下的validators包下的default.xml文件的格式,我们在src下定义一个名称为validators.xml文件,并参照以上说的default.xml的内容格式将我们自定义的验证器类配置以下并起一个名称用于在验证配置文件中使用。需要注意的是,Struts2框架会默认先加载src下的这个validators.xml文件,然后再去加载上边说道的default.xml文件。

  ③  在验证配置文件中使用这个验证器

  将validators.xml文件中的name属性放入到验证配置文件的验证类型中即可。但是需要注意的是,如果我们对某种验证类型想要添加一些参数的话,就需要在我们的实际起作用的自定义验证器中添加参数对应的属性,然后编写逻辑,就像int验证器的min和max参数一样。



















 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值