springmvc Jsr303,校验器(springmvc教程七)

版权声明:随意转载。 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());
	}

猜你喜欢

转载自blog.csdn.net/dengjili/article/details/84500772