校验理解:
项目中,通常使用较多是前端的校验,比如页面中 js 校验。对于安全要求较高点建议在服务端进行校验。
服务端校验:
控制层 controller:校验页面请求的参数的合法性。在服务端控制层 controller 校验,不区分客户端类型(浏览器、手机客户端、远程调用)
业务层 service(使用较多):主要校验关键业务参数,仅限于 service 接口中使用的参数。
持久层 dao:一般是不校验的。
需求:
springmvc 使用 hibernate 的校验框架 validation (和 hibernate 没有任何关系)。
校验思路:
页面提交请求的参数,请求到 controller 方法中,使用 validation 进行校验。如果校验出错,将错误信息展示到页面。
具体需求:
产品修改,添加校验(校验商品名称长度,生产日期的非空校验),如果校验出错,在产品修改页面显示错误信息。
准备 jar 包:
hibernate 的校验框架 validation 所需要 jar 包:
配置校验器:
校验器注入到处理器适配器中
在 pojo 中添加校验规则
CustomValidationMessages.properties:
捕获校验错误信息:
editProducts.jsp:
效果:
分组校验
需求:
在 pojo 中定义校验规则,pojo 是被多个 controller所共用。当不同的 controller 方法对同一个 pojo 进行校验时,不能让每个 controller 方法完成不同的校验。
解决方法:
定义多个校验分组(其实是一个 java 接口),分组中定义有哪些规则;
每个 controller 方法使用不同的校验分组。
分组接口:
在校验规则中添加分组:
在 controller 方法使用指定分组的校验:
JSR-303原生支持的限制有如下几种:
限制 | 说明 |
@Null | 限制只能为null |
@NotNull | 限制必须不为null |
@AssertFalse | 限制必须为false |
@AssertTrue | 限制必须为true |
@DecimalMax(value) | 限制必须为一个不大于指定值的数字 |
@DecimalMin(value) | 限制必须为一个不小于指定值的数字 |
@Digits(integer,fraction) | 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction |
@Future | 限制必须是一个将来的日期 |
@Max(value) | 限制必须为一个不大于指定值的数字 |
@Min(value) | 限制必须为一个不小于指定值的数字 |
@Past | 限制必须是一个过去的日期 |
@Pattern(value) | 限制必须符合指定的正则表达式 |
@Size(max,min) | 限制字符长度必须在min到max之间 |