动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

Spring MVC验证器Validator工作流程

09-04 17:29 80浏览
举报 T字号
  • 大字
  • 中字
  • 小字

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视频教程

0人推荐
共同学习,写下你的评论
0条评论
ya离谱
程序员ya离谱

9篇文章贡献59976字

作者相关文章更多>

推荐相关文章更多>

DOM渲染的详细过程

QCode09-04 14:38

CSS水平和垂直居中技巧大梳理

Code大师09-04 14:50

mui的input框在IOS系统下无法聚焦或点击多次才能聚焦

不写代码你养我啊08-23 11:14

推荐的-视.频播放器以及在线客服

不写代码你养我啊09-17 18:02

谈谈java多线程的三大特性

要学习了06-18 18:13

发评论

举报

0/150

取消