免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1406 | 回复: 0
打印 上一主题 下一主题

使用validwhen设计复杂的Struts表单验证 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-09 14:19 |只看该作者 |倒序浏览
  
通过Struts 1.2提供的validwhen 验证器可以轻松的创建更加复杂灵活的表单验证。
比如说,我们要验证用户两次输入的密码是否相同,或是只有当用户填写表单项“姓氏”时,表单项“名字”才是必须的。
validwhen 需要声明一个叫testvar字段,这个变量的值是一个布尔型的表达式,比如:
    test
    ((orderLines[].partNumber == null) or (*this* != null))

当布尔型表达式返回true时,验证才会成功。下边是允许发入该表达式的一些元素:

  • 单引号或双引号括起来的字符串
  • 十进制、十六进制或八进制表示的整形字面量
  • null 表示没有输入的空串
  • 可以使用表单里的任何字段名字,如 customerAge
  • 显式引用的索引字段,如childLastName[2]
  • 隐式引用的索引字段,如childLastName[],表示使用与该字段相同的索引
  • 字面量 *this* 表示当前被验证的表单

例:
下边这段代码表示:只有当sendNewsletter字段为空,或该字段emailAddress不为空时,该字段才有效
      
        
          test
          ((sendNewsletter == null) or (*this* != null))
        
      
下边这个例子表示,只有相应的partNumber存在时,字段quantity才是必须的
下边这个例子表示,只有相应的partNumber存在时,字段quantity才是必须的
   
      
        
          test
          ((orderLines[].partNumber == null) or (*this* != null))
        
      
下边这个例子表示,如果输入身高小于60英寸,则不能做nbaPointGuard
下边这个例子表示,如果输入身高小于60英寸,则不能做nbaPointGuard
   
      
        
          test
          ((heightInInches >= 60) or (*this* == null))
        
      


validwhen主要用于关联验证,即为了验证某个域的值,可能会参考其它域的值来进行综合判断,以确定该域的值是否符合要求。
1,表达式及其注意事项
输入给validwhen的是一个布尔型表达式(对该表达式的解析使用了antlr),其引用名为test,即形如:
  test
  expression
即,当expression为真(true)时,该域验证通过,其中,expression可以使用的元素包括:
1)表单中其它域属性的名称,例如:
  test
  (color=="red")

例子中color为表单中其它某个域的属性名。
2)*this*,用于表示该域的属性名称,即对正在验证的属性自身,其变量的引用为*this*,例如:
  test
  ((color=="red") and (*this* != null))

3)可以使用一些常规运算符,如 >、=、
  test
  ((color=="red") and (age>=25))

4)可以使用逻辑运算 and 、or,例如:
  test
  (((color=="red") and (age>=25)) or (color!="red"))

在使用and和or时要注意一点,在同一级的逻辑运算中,同时只能存在一个逻辑运算符,要么是and,要么是or,即:
xxx and yyy
或者
xxx or yyy
如果在同一级出现多于一个的and或or或and和or的组合,那么是不合法的,例如下面的表达式是不合法的:
xxx and yyy and zzz
或者
xxx or yyy or zzz
或者
xxx and yyy or zzz
等等
为了让复杂的表达变得合法,可以让一个复杂的表达式变为多级的表达形式,每一级只有一个and或一个or就可以了,例如:
xxx and yyy and zzz是错误的,进行一下简单的变换:
(xxx and yyy) and zzz或者xxx and (yyy and zzz)等都是合法的。
5)其他合法的输入,例如可以使用双引号和单引号引用literal字符串等等。
2,错误消息的定制
无论是validwhen还是其它验证例程,都可以定制验证出错后的错误信息,定制消息有两种方式,即全局方式和本地方式。
1)全局方式,即在validator-rules.xml中某个validator里面定义的消息,参数名为msg,例如:


其中,msg的值为resource bundle中的一个属性名
。例如在resource bundle文件中存在如下定义:
errors.email={0} is an invalid e-mail address.

2)本地方式,即在validation.xml中的field中定义的错误消息,格式为:
例如:
            
               
               
               
               
                     test
                     ((*this* != null) and (*this*>startDate))
               
            
这里需要注意的是
* 的name属性的值应该为某个验证例程的名称,例如name="validwhen"、name="date"等,这指明了当该field的该验证例程(本例是validwhendate)出错时所显示的错误信息。
*如果全局已经定义了msg的信息,而且本地的msg的key与全局的msg的key相同,那么在该field的验证中,本地的msg将覆盖全局的msg。
*到的属性中也有name属性,即该arg参数所应用的验证例程,例如,即该参数用于date验证的出错信息。注意,对于一个field,需要的验证规则有时不止一个,例如depends="required,date",而多个验证规则中的每一个都需要出错时传入一些参数信息,如果它们所需要的参数个数、名称和顺序都相同,那么只要定义

   
   
        datePatternStrict
        yyyy-MM-dd
   


   
   
   
   
   
        test
        ((*this* != null) and (*this*>startDate))
   
   
        datePatternStrict
        yyyy-MM-dd
   

在资源文件中加入如下message:

form.date.start=起始日期
form.date.end=终止日期
date.validwhen= {0}不能大于{1}!

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/55983/showart_682467.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP