序:
利用bean-validator在spring mvc完成表单的校验极为方便,相比于struts2的validate用法方便太多了。下面这篇文章个人觉得对JSR303从应用层面做了一个很详细的介绍,而且也附属了在spring mvc中使用的例子。
感谢作者的幸苦劳动,这里作为自己学习与记录。
正文:
一:
JSR 303是JAVA EE 6中的一项子规范,叫做Bean Validation,官方参考实现是Hibernate Validator,此实现与Hibernate ORM没有任何关系。JSR 303用于对Java Bean中的字段的值进行验证。
本教程翻译自Hibernate Validator 4.0 GA指南,并参考JSR 303的规范,本着尽量不用JSR规范之外的特性,文档在编写时尽量不提及底层实现Hibernate Validator,而是关注Bean Validation规范本身。如果有不对之处,请大家多提意见,互相提高,谢谢! 小弟编写的中文手册在压缩包中,和Hibernate Validator 4.0 GA放在一起,省得大家再下载jar文件了哦!嘿嘿!
那个大家多提意见哦!谢谢!哈!
文章source:http://www.iteye.com/topic/500928
hibernate-validator-4.0.0.GA-dist.zip (4.8 MB)下载地址: http://dl.iteye.com/topics/download/d3374bdc-5a36-3270-8ffc-624356cf0716
二:
JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,官方参考实现是Hibernate Validator。
此实现与Hibernate ORM 没有任何关系。JSR 303 用于对Java Bean 中的字段的值进行验证。
Spring MVC 3.x之中也大力支持 JSR-303,可以在控制器中对表单提交的数据方便地验证。
JSR 303内置的约束规则:
@AssertTrue / @AssertFalse
- 验证适用字段:boolean
- 注解说明:验证值是否为true / false
- 属性说明:-
- 验证适用字段:BigDecimal,BigInteger,String,byte,short,int,long
- 注解说明:验证值是否小于或者等于指定的小数值,要注意小数存在精度问题
- 属性说明:公共
- 验证适用字段:BigDecimal,BigInteger,String,byte,short,int,long
- 注解说明:验证值的数字构成是否合法
- 属性说明:integer:指定整数部分的数字的位数。fraction: 指定小数部分的数字的位数。
- 验证适用字段:Date,Calendar
- 注解说明:验证值是否在当前时间之后 / 之前
- 属性说明:公共
- 验证适用字段:BigDecimal,BigInteger,String,byte,short,int,long
- 注解说明:验证值是否小于或者等于指定的整数值
- 属性说明:公共
- 验证适用字段:引用数据类型
- 注解说明:验证值是否为非空 / 空
- 属性说明:公共
- 验证适用字段:String
- 注解说明:验证值是否配备正则表达式
- 属性说明:regexp:正则表达式flags: 指定Pattern.Flag 的数组,表示正则表达式的相关选项。
- 验证适用字段:String,Collection,Map,数组
- 注解说明:验证值是否满足长度要求
- 属性说明:max:指定最大长度,min:指定最小长度。
- 验证适用字段:引用类型
- 注解说明:验证值是否需要递归验证
- 属性说明:无
使用Spring MVC 和 JSR-303的标注做表单提交的服务器端验证时,
@Valid 标注的Command对象和BindingResult参数一定要紧挨着。要不然
数据绑定错误直接抛异常,不会封装成一个BindingResult对象。
- public String login(@Valid User user, BindingResult br, Map<String, Object> model) {
- if (br.hasErrors()) {
- return "login";
- }
- return "redirect:/salary/list.do";
- }
下:
三:
spring 3 mvc BindingResult result 校验注意点
BindingResult result 的使用,必须在controller层增加@ModelAttribute("fundsPreTransfer") 它和ModelAttribute同时使用,并且参数要紧挨着。这样才不会报。Errors/BindingResult argument declared without preceding model attribute异常。
注意:
@RequestMapping("/funds/transfer/save")
public String save(
@ModelAttribute("fundsPreTransfer") FundsPreTransfer fundsPreTransfer,
BindingResult result, Model model, HttpServletRequest request) {
// 服务器端校验
fundsTransferValidator.validate(fundsPreTransfer, result);
if (result.hasErrors()) {
// 如果存在错误,则跳转到显示页面
return "funds/transfer/show";
}
Double transferAmount = fundsPreTransfer.getTransferAmount();
String comments = fundsPreTransfer.getComments();
fundsPreTransfer.setTransferIp(request.getRemoteAddr());
// query fundsSerialNumber
String fundsSerialNumber = RandomStringUtils.random(9, false, true);
fundsPreTransfer.setFundsSerialNumber(fundsSerialNumber);// 设置流水号
// 保存转账记录。
fundsPreTransferService.persist(fundsPreTransfer, getUsername(),
transferAmount);
// 传递值到下一页面。
String fundsAccount = request.getParameter("fundsAccount");// 资金账号
model.addAttribute("fundsAccount", fundsAccount);
model.addAttribute("counterpartyFundsAccount",
request.getParameter("counterpartyFundsAccount"));
// 查出username
FundsBase fundsBase = fundsBaseService.findByFundsAccount(fundsAccount);
BaseAccount baseAccount = fundsBase.getBaseAccount();
String username = baseAccount.getUsername();
model.addAttribute("username", username);
model.addAttribute("transferAmount", transferAmount);
model.addAttribute("comments", comments);
model.addAttribute("fundsSerialNumber", fundsSerialNumber);
return "funds/transfer/show_next";
}