简介
本框架主要是为了和前台基于JavaScript的开源验证框架RapidValidation使用统一的验证规则, 最大限度的减少重复的后台验证代码, 使用方式简便, 扩展方便.
本框架依赖于:
Struts 2
Java 5或者更高版本
GET/POST协议(支持带文件上传的表单, 依赖于Commons-Upload组件)
整合步骤
1. 将文件struts2-quickvalidation-plugin-1.0.jar 放入WEB-INF/lib目录下;
2. 修改您自己的代码的src/struts.xml中的package定义继承自quickValidation;
示例代码:
3. 使用注解加入验证规则表达式;
在每个需要调用的Action的入口方法处, 加入@FormValidator 注解.
注解的完整语法如下:
@common.validation.FormValidator(input="出错时需要返回的result别名", enabled=true/false , value="表单参数名称1,表单参数中文提示信息1,规则1 规则2…; 表单参数名称2,表单参数中文提示信息2,规则1 规则2…;更多字段验证信息")
input 参数: 可选 . 如果不指定, 则出错时仍然继续进入到Action方法中; 如果指定, 则在表单验证出错时, 返回到给定的result中, 例如: 原始表单输入页面或者统一的错误输出页面;
enabled 参数: 可选 . 是否启用此验证规则, 如果不指定, 则忽略解析注解, 不进行任何验证;
value 参数: 必填选项 , 可输入一个或者多个表单参数验证规则. 简单说就是: [字段1验证配置];[字段2验证配置];…. 虽然不建议, 然而字段验证配置可以留空, 此时不会进行任何验证处理.
而每个验证配置 的格式如下:
表单参数名称: 必填选项 . 指向输入的表单控件的名称(input的name);
表单参数中文提示信息: 可选 . 如果为空, 则和表单参数名称相同. 不为空时, 则显示在出错时的信息提示的开头位置;
规则1 规则2…: 可选. 理论上可加入任意多个验证规则, 以单个空格 隔开. 在验证开始后, 依次进行每个规则的验证并加入提示信息. 需要注意的是, 除required规则之外的所有规则只有当用户输入的字段值非空时, 才进行有效性验证, 如此便可避免所有字段都成为必填字段的问题发生.
每个规则 本身则由两部分组成: 规则名-规则子名-参数1-参数2-参数3-….
规则名和规则子名是固定名称, 不能任意填写, 这两个名称对应一个具体的规则实现类.
其中参数 是必填选项 , 参数的意义则需要参考下一节的验证规则表达式 中的说明. 下面举例说明若干验证规则:
required 这是特殊规则, 不带规则子名;
float-range-1-20 其中float-range分别是规则名和规则子名, 而1和20则分别是两个参数.
特别需要注意的是有负数时的情况此时参数列表变为: float-range--1 --20, 此时参数值分别为-1和-20.
如果需要给另一字段加入验证规则, 则以分号 隔开.
下面是若干验证的示例及其解释:
规则 | 解释 |
@FormValidator | 空的验证规则, 不进行任何操作 |
@FormValidator("username,用户名,required min-length-5") | 对username字段进行验证, 规则为 必填, 最小长度为5; 出错时分别提示: 用户名不能为空 用户名的长度不能小于5, 当前长度为1. 由于没有指定input参数, 所以当验证失败时, 仍然会继续进入到业务逻辑处理, 相关的错误信息则存入request的attribute中. |
@FormValidator("username, ,required min-length-5") | 由于没有指定字段的中文提示, 因此出错时将提示: username的长度不能小于5, 当前长度为1. |
@FormValidator(input="index" ,value=" username,用户名,required min-length-5”) | 这大概是最常用格式的验证规则的写法了. 此例和上例的区别为: 所以当验证失败时, 将进入input参数所指定的出错信息显示页面. |
@FormValidator(input="index",enabled=false, value=" username,用户名,required min-length-5”) | 忽略所有验证规则处理, 常用于调试阶段. |
@FormValidator(input="index",value=" username,用户名,required min-length-5;password2,重复密码 ,required equals-password-原始密码 ;”) | 此规则加入了对重复密码字段的验证, 出错时将提示: 重复密码 和原始密码 的输入不一致 |
@FormValidator(input="index",value="username,用户名,required min-length-5;password2,重复密码 ,required equals-password;”) | 此规则省略了另一字段的中文描述, 出错时将提示: 重复密码 和前面 的输入不一致 |
以下为一个完整的Action类示例代码:
4. 修改前台显示验证结果.
根据Action的不同, 前台的显示划分为两类:
普通的错误显示:
所有错误信息: ${validationErrors} |
返回的内容是一个字符串, 显示了所有的出错信息, 而出错字体的颜色则需要用户自己去设置.
出错信息的显示格式是以<br>分开的, 例如:
用户名不能为空<br>密码不能为空<br>重复密码不能为空<br>性别必须至少选中一项<br> |
另一种推荐的做法是让Action继承自Struts2中的ActionSupport, 此时则可用Struts 2的标签来显示出错信息, 可定位到具体的字段:
或者使用纯JSP来编写页面来定位到单条错误:
用户名: <input name=username value=${param.username}> ${errors.username[0]} |
下面给出这两种写法的完整示例:
验证规则表达式详解
说明: 加红色背景的部分是目前尚不支持的验证规则; 加黄色背景的是增加了第二个可选参数的规则.
验证表达式 | 描述 | 示例 |
required | 非空域,全部空格也算空 | |
validate-number | 一个有效数 | |
validate-digits | 只能包含0-9任意个数字 | |
validate-alpha | 只能是字母a-z, A-Z | |
validate-alphanum | 只能是字母和数字的组合 | |
validate-email | 只能是有效的email | |
validate-url | 只能是有效的url地址 | |
validate-one-required | 至少有一个被选中,例如一组checkbox, radiobutton,它们最好包含在一个div和span中 | |
validate-integer | 只能是整数,可以有正负号 | |
validate-ip | 有效的IP地址 | |
min-length-$number | 最小长度是$number ( 此处$some表示一个特定的值) | 最小长度为8: min-length-8 |
max-length-$number | 最大长度是$number | 最大长度为8: max-length-8 |
max-value-$number | 输入域的最大值是$number | 最大值为8.1: max-value-8.1 |
min-value-$number | 输入域的最小值是$number | 最大值为-8.1: max-value--8.1 |
equals-$otherInputId-$otherInputLabel | 必须和某个input field相等,用于密码两次输入验证等,$otherInputLabel是可选项,用来描述另一字段信息 | equals-password 重复密码和原始密码输入不一致: equals-password-原始密码 |
less-than-$otherInputId-$otherInputLabel | 小于某个input field less-than-otherInputId,多用于结束日期不能小于开始日期的需求,$otherInputLabel是可选项,用来描述另一字段信息 | 注:相等时也不能通过 |
great-than-$otherInputId-$otherInputLabel | 大于某个input field less-than-otherInputId,$otherInputLabel是可选项,用来描述另一字段信息 | |
validate-date-$dateFormat | 只能是日期,$dateFormat为日期格式,$dateFormat的可选,默认格式为yyyy-MM-DD | validate-date-yyyy年MM月dd日 |
validate-file-$type1-$type2-$typeX | 验证文件输入域选择的文件类型只能为声明的$type1 – $typeX中的一种 | validate-file-png-jpeg |
float-range-$minValue-$maxValue | 必须是$minValue到$maxValue的一个浮点数 | 1至20: float-range-1-20 |
int-range-$minValue-$maxValue | 必须是$minValue到$maxValue的一个整数 | |
length-range-$minLength-$maxLength | 输入字符串的长度必须在$minLength到$maxLength之间 | |
validate-pattern-$RegExp | 通过自定义正则表达式$RegExp来验证输入域的正确性 | vaidate-pattern-/a/gi |
validate-chinese | 只能是中文(以下为中国的相关验证) | |
validate-phone | 有效的电话 | |
validate-mobile-phone | 有效的手机号 | |
validate-id-number | 验证是否有效的身份证号码 | |
validate-zip | 验证邮政编码 | |
validate-qq | 验证QQ号码 |
和RapidValidation 配合实现前后台一致验证
RapidValidation是专注于前台的验证框架, 例如下面的例子:
其对应的后台验证规则为:
@FormValidator(input="index" ,value=" content ,helloworld ,required min-length-15 ”) |
请注意比较异同, 不同部分已经以红色粗体 进行了区分, 相同部分则以绿色粗体 标识.
大家可以看到, 两者很容易就实现了一致的前后台验证规则.
如何扩展验证规则?
要扩展验证只需要实现IValidator即可即可, 并将实现类放入包 common.quickvalid.validators 下. 下面是IValidator 接口定义:
类名有一定规则, 将第一个减号替换为下划线即可, 例如:
length-range-$minLength-$maxLength 对应的类名是: length_range .
下面则给出一个实现类, 供参考: