版权声明:随意转载。 https://blog.csdn.net/dengjili/article/details/84500772
工程代码
github: https://github.com/dengjili/springmvc
前台页面:jsrform.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>参数校验学习</title>
</head>
<body>
<h2>JSR 303</h2>
<form id="form" action="validate">
<table>
<tr>
<td>产品编号</td>
<td><input id="productId" name="productId" value=""/></td>
</tr>
<tr>
<td>用户编号</td>
<td><input id="userId" name="userId" value=""/></td>
</tr>
<tr>
<td>交易日期</td>
<td><input type="date" id="date" name="date" value=""/></td>
</tr>
<tr>
<td>价格</td>
<td><input id="price" name="price" value=""/></td>
</tr>
<tr>
<td>数量</td>
<td><input id="quantity" name="quantity" value=""/></td>
</tr>
<tr>
<td>交易金额</td>
<td><input id="amount" name="amount" value=""/></td>
</tr>
<tr>
<td>电话号码</td>
<td><input id="phone" name="phone" value=""/></td>
</tr>
<tr>
<td>备注</td>
<td>
<textarea id="remarks" name="remarks" rows="5" cols="20"></textarea>
</td>
</tr>
<tr>
<td></td>
<td align="right"><input type="submit" value="点击"/></td>
</tr>
</table>
</form>
</body>
</html>
Jsr303
定义一个bean,并使用校验注解
public class JsrBean {
// 产品编号
@NotNull
private Long productId;
// 用户编号
@NotNull
private Long userId;
// 交易日期
@NotNull
@Future
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date date;
// 价格
@NotNull
@DecimalMin("0.5")
private Double price;
// 数量
@NotNull
@Max(100)
@Min(1)
private Integer quantity;
// 交易金额
@NotNull
/*@DecimalMax("1000")*/
private Double amount;
// 电话号码
@NotNull
@Pattern(regexp = "^1[34578]\\d{9}$", message = "号码格式不对")
private String phone;
// 备注,0 - 255 个字符
@Size(min = 0, max = 255)
private String remarks;
// seter、geter
}
控制器代码
@RequestMapping("/validate")
public ModelAndView validate(@Valid JsrBean jsrBean, Errors errors) {
if (errors.hasErrors()) {
List<FieldError> fieldErrors = errors.getFieldErrors();
logger.debug("====================");
for (FieldError fieldError : fieldErrors) {
logger.debug("{} : {}", fieldError.getField(), fieldError.getDefaultMessage());
}
logger.debug("====================");
}
ModelAndView mv = new ModelAndView();
mv.setViewName("jsrform");
return mv;
}
自定义校验器
定义一个校验器,具有业务含义
public class CustValidate implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return JsrBean.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
// 已经判断过类型了,直接强转即可
JsrBean jsrBean = (JsrBean) target;
double banlance = jsrBean.getAmount() - (jsrBean.getQuantity() * jsrBean.getPrice());
if (banlance < 0) {
errors.rejectValue("amount", null, "实收金额不对");
}
}
}
绑定校验器
@InitBinder
public void initBinder(DataBinder binder) {
// 绑定一个校验类
binder.setValidator(new CustValidate());
}