Spring MVC不仅是在架构上改变了项目,使代码变得可复用、可维护与可扩展,其实在功能上也加强了不少。比如Spring MVC可以使用验证器Validator与JSR303完成后台验证功能。本文就来讲一讲Spring MVC验证器Validator工作流程。
Spring MVC验证器Validator实际上是一个接口,通过实现该接口来定义对实体对象的验证,接口如下所示:
package org.springframework.validation;
/**
* Spring MVC内置的验证器接口
*/
public interface Validator {
/**
* 是否可以验证该类型
*/
boolean supports(Class clazz);
/**
* 执行验证 target表示要验证的对象 error表示错误信息
*/
void validate(Object target, Errors errors);
}
1.定义验证器
package com.zhangguo.springmvc51.entities;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
/**
* 产品验证器
*
*/
public class ProductValidator implements Validator {
//当前验证器可以验证的类型
@Override
public boolean supports(Class clazz) {
return Product.class.isAssignableFrom(clazz);
}
//执行校验
@Override
public void validate(Object target, Errors errors) {
//将要验证的对象转换成Product类型
Product entity=(Product)target;
//如果产品名称为空或为空格,使用工具类
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "required", "产品名称必须填写");
//价格,手动判断
if(entity.getPrice()<0){
errors.rejectValue("price", "product.price.gtZero", "产品价格必须大于等于0");
}
//产品类型必须选择
if(entity.getProductType().getId()==0){
errors.rejectValue("productType.id", "product.productType.id.required", "请选择产品类型");
}
}
}
ValidationUtils是一个工具类,中间有一些方可以用于判断内容是否有误。
2.执行校验
// 新增保存,如果新增成功转回列表页,如果失败回新增页,保持页面数据
@RequestMapping("/addSave")
public String addSave(Model model, Product product, BindingResult bindingResult) {
// 创建一个产品验证器
ProductValidator validator = new ProductValidator();
// 执行验证,将验证的结果给bindingResult,该类型继承Errors
validator.validate(product, bindingResult);
// 获得所有的字段错误信息,非必要
for (FieldError fielderror : bindingResult.getFieldErrors()) {
System.out.println(fielderror.getField() + "," + fielderror.getCode() + "," + fielderror.getDefaultMessage());
}
// 是否存在错误,如果没有,执行添加
if (!bindingResult.hasErrors()) {
// 根据类型的编号获得类型对象
product.setProductType(productTypeService.getProductTypeById(product.getProductType().getId()));
productService.addProduct(product);
return "redirect:/";
} else {
// 与form绑定的模型
model.addAttribute("product", product);
// 用于生成下拉列表
model.addAttribute("productTypes", productTypeService.getAllProductTypes());
return "product/add";
}
}
注意在参数中增加了一个BindingResult类型的对象,该类型继承自Errors,获得绑定结果,承载错误信息,该对象中有一些方法可以获得完整的错误信息,可以使用hasErrors方法判断是否产生了错误。
3.在UI中添加错误标签
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<link href="styles/main.css" type="text/css" rel="stylesheet" />
<title>新增产品</title>
</head>
<body>
<div class="main">
<h2 class="title"><span>新增产品</span></h2>
<form:form action="addSave" modelAttribute="product">
<fieldset>
<legend>产品</legend>
<p>
<label for="name">产品名称:</label>
<form:input path="name"/>
<form:errors path="name" cssClass="error"></form:errors>
</p>
<p>
<label for="title">产品类型:</label>
<form:select path="productType.id">
<form:option value="0">--请选择--</form:option>
<form:options items="${productTypes}" itemLabel="name" itemValue="id"/>
</form:select>
<form:errors path="productType.id" cssClass="error"></form:errors>
</p>
<p>
<label for="price">产品价格:</label>
<form:input path="price"/>
<form:errors path="price" cssClass="error"></form:errors>
</p>
<p>
<input type="submit" value="保存" class="btn out">
</p>
</fieldset>
</form:form>
<p style="color: red">${message}</p>
<p>
<a href="<c:url value="/" />" class="abtn out">返回列表</a>
</p>
</div>
</body>
</html>
发生错误时解析的结果:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<link href="styles/main.css" type="text/css" rel="stylesheet" />
<title>新增产品</title>
</head>
<body>
<div class="main">
<h2 class="title"><span>新增产品</span></h2>
<form id="product" action="addSave" method="post">
<fieldset>
<legend>产品</legend>
<p>
<label for="name">产品名称:</label>
<input id="name" name="name" type="text" value=""/>
<span id="name.errors" class="error">产品名称必须填写</span>
</p>
<p>
<label for="title">产品类型:</label>
<select id="productType.id" name="productType.id">
<option value="0" selected="selected">--请选择--</option>
<option value="11">数码电子</option><option value="21">鞋帽服饰</option><option value="31">图书音像</option><option value="41">五金家电</option><option value="51">生鲜水果</option>
</select>
<span id="productType.id.errors" class="error">请选择产品类型</span>
</p>
<p>
<label for="price">产品价格:</label>
<input id="price" name="price" type="text" value="-10.0"/>
<span id="price.errors" class="error">产品价格必须大于等于0</span>
</p>
<p>
<input type="submit" value="保存" class="btn out">
</p>
</fieldset>
</form>
<p style="color: red"></p>
<p>
<a href="/SpringMVC51/" class="abtn out">返回列表</a>
</p>
</div>
</body>
</html>
4.测试运行
控制台输出:
上面就是Spring MVC验证器Validator工作流程,当然这只是验证器Validator的独立工作的部分,Spring MVC的后台验证功能还需要JSR303验证器的参与,想了解JSR303验证器工作原理和流程的小伙伴可以观看本站的Spring MVC视频教程。
QCode09-04 14:38
Code大师09-04 14:50
不写代码你养我啊08-23 11:14
不写代码你养我啊09-17 18:02
要学习了06-18 18:13