Sruts2-验证器

来源:互联网 发布:济南浪潮java工资待遇 编辑:程序博客网 时间:2024/06/05 06:13

  前边我们讲过了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参数一样。



















 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 红米3开不了机了怎么办 苹果手机装了sim卡没反应怎么办 小米手机打电话的图标没了怎么办 租房时和房东没签协议装修怎么办 三星安卓手机忘记锁屏密码怎么办 刷机了支付宝的余额宝钱没了怎么办 手机刷机支付宝里面的钱怎么办 支付宝宽带缴费交错账号了怎么办 电信宽带反回到翼支付里的钱怎么办 天猫盒子连接电视没反应怎么办 淘宝定制单发货之后是空物流怎么办 微信购买虚拟物品卖家不发货怎么办 虚拟商品确认收货后申请退款怎么办 手机换号码了淘宝怎么办又不能上网 美团酒店订单取消超时了怎么办 订单中快递单号填错了怎么办 高考动态口令卡页面找不到了怎么办 支付宝收钱码被别人扫了怎么办 上高速收费下高速免费卡怎么办 微信聊天记录导出来了是乱码怎么办 电脑用优盘打开文件夹是空的怎么办 快压解压文件在电脑上打不开怎么办 虎牙直播刺激战场观看有延迟怎么办 登录页面点击登录窗口关不了怎么办 h5中的摇晃手机在电脑端怎么办 忘记手机锁屏密码怎么办4g qq最早绑定的号码忘记了怎么办 重启路由器之后宽带连接不上怎么办 微信授权小程序总是不行怎么办 微信把钱转到别人账户里了怎么办 微信转到对方账户停用了怎么办 微信号被认为是投票水军怎么办 微信投票时显示账号异常怎么办 京东商城买东西老不到货怎么办 优酷投屏一会就会出现花报怎么办 苹果手机的app安卓找不到怎么办 微信网页获取用户信息点了否怎么办 淘宝卖家退发货信息选择错了怎么办 法宣在线出现在其他地方登陆怎么办 QQ被冻结又不知道申诉资料怎么办 开通优酷会员了再开酷喵会员怎么办