[Spring MVC] - InitBinder验证

Spring MVC使用InitBinder验证:

使用InitBinder做验证的情况一般会在此Controller中提交的数据需要有一些是业务性质的,也即比较复杂的验证情况下才会使用。大部份简单的表单验证,使用annotation验证即可以解决。

Annotation验证使用方法可参见:http://www.cnblogs.com/HD/p/4123146.html

这里需要注意的一点:InitBinder和Annotation两种验证只能二选一,如果使用了InitBinder,就不能使用Annotation验证。

前面的web.xml和spring.xml的配置就不再重复,可参见上面链接中的配置。一模一样。

直接上代码:

1、User5 model实体类

package com.my.controller.bean;

import java.util.Date;

public class User5 {

    private long id;
    private String name;
    private String password;
    private Date createTime;
    private int age;

    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}

2、新增一个Validator:

package com.my.controller.validator;

import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

import com.my.controller.bean.User5;

@Component
public class TestValidator implements Validator {

    @Override
    public boolean supports(Class<?> paramClass) {
        return User5.class.equals(paramClass);
    }

    @Override
    public void validate(Object obj, Errors errors) {
        User5 user = (User5) obj;

        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "valid.name", null, "");

        if(user.getAge() < 18) {
            errors.rejectValue("age", "valid.ageMin", new Object[]{"age" ,18}, "年龄不能小于{1}岁");
        }
    }

}

这里需要加入@Component,注入DI

3、Controller

package com.my.controller;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.Validator;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.my.controller.bean.User5;

@Controller
@RequestMapping(value="binder")
public class TestInitBinderController {

    @Autowired
    @Qualifier(value="testValidator")
    private Validator validator;

    @InitBinder
    private void initBinder(WebDataBinder binder) {
        binder.setValidator(validator);
    }

    @RequestMapping(method=RequestMethod.GET)
    public String index() {
        return "/TestInitBinder/index";
    }

    @RequestMapping(value="add", method=RequestMethod.POST)
    public ModelAndView add(@ModelAttribute @Valid User5 user, BindingResult result) {
        ModelAndView view = new ModelAndView("TestInitBinder/index");
        view.addObject("user", user);

        if(result.hasErrors()) {
            List<FieldError> errs = result.getFieldErrors();
            Map<String, String> mapErrors = new LinkedHashMap<String, String>();
            for(FieldError err : errs) {
                System.out.println("ObjectName:" + err.getObjectName() + "\tFieldName:" + err.getField()
                        + "\tFieldValue:" + err.getRejectedValue() + "\tMessage:" + err.getDefaultMessage());
                mapErrors.put(err.getField(), err.getDefaultMessage());
                view.addObject("errors", mapErrors);
            }

            return view;
        }

        return view;
    }

}

把Validator注入到Controller中。

事实上,使用InitBinder,在add controller中的err.getDefaultMessage()方法是取不到对应正确的message的。可以看最后的输入打印结果。

4、View

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="st" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Init binder</title>
</head>
<body>
    <form:form action="/TestSpringMvc1/binder/add" method="post" modelAttribute="user5">
        User name:<input type="text" id="name" name="name" value="${user.name}" /><br/>
        Password:<input type="text" id="password" name="password" value="${user.password}" /><br/>
        Age:<input type="text" id="age" name="age" value="${user.age}" /><br/>
        <input type="submit" value="Add"/>
        <hr/>
        Error:<br/>
        <form:errors path="*"></form:errors>
    </form:form>
</body>
</html>

注意,这里只能使用<form:errors />来取得错误信息,且,这个<form:errors/>一定要在<form:form/>当中。

5、结果测试

点击Add button:

打印输出:

可以看到,这里取不到错误的正确信息



事实上,在一个非常复杂表单页面,里头所提交的数据验证有一定的业务逻辑性时,InitBinder应该都不多用,因为很多时候我们可以使用一个Map,把errors插入进去,在页面读取即可。比如:

Map<String, String> errors;
errors.add("name", "user name can NOT be empty!");
:
:

页面中只需要使用:

<span style="color:red;">${errors.name}<span>

即可。

时间: 2024-11-10 22:39:02

[Spring MVC] - InitBinder验证的相关文章

Spring MVC 数据验证——validate编码方式

1.导入jar包 validation-api-1.0.0.GA.jar这是比較关键的一个jar包,主要用于解析注解@Valid. hibernate-validator-4.3.2.Final.jar能够下载最新的.这个包在注解方式编码中尤为重要. 其它的就是一些日志包(不一定全不须要):jboss-logging-3.1.3.GA.jar.slf4j-log4j12-1.6.1.jar 2.web项目的结构图 项目的主要结构图,不清楚web项目的环境的能够自己学一下.推荐去慕课网上找视频看

[Spring MVC] - Annotation验证

使用Spring MVC的Annotation验证可以直接对view model的简单数据验证,注意,这里是简单的,如果model的数据验证需要有一些比较复杂的业务逻辑性在里头,只是使用annotation做验证是比较难的. 以下是使用Spring MVC自带的annotation验证,加上自定义的一个@Tel的annotation验证例子,此例子具有: 1.支持多语言(国际化) 2.对默认数据先进行转化,比如int.date类型如果传入空值时,会抛异常,默认给定值 先看配置: 1.web.xm

Spring MVC Hibernate验证器

下面的示例演示如何使用Spring Web MVC框架在表单中使用错误处理和验证器. 首先使用Eclipse IDE,并按照以下步骤使用Spring Web Framework开发基于动态表单的Web应用程序: 创建一个名称为 HibernateValidator 的动态WEB项目. 在 com.yiibai.springmvc 包下创建三个Java类:Student和StudentController . 在jsp子文件夹下创建两个视图文件:addStudent.jsp, result.jsp

Spring MVC 数据验证——validate注解方式

1.说明 学习注解方式之前,应该先学习一下编码方式的spring注入.这样便于理解验证框架的工作原理.在出错的时候,也能更好的解决问题.所以本次博客教程也是基于编码方式,只是在原来的基础加上注解方式. 2.配置信息 web.xml不需要改变的 hello-servlet.xml将原来的加载方式,改为自动加入有hibernate和Spring提供的validate的默认类,配置如下: <?xml version="1.0" encoding="UTF-8"?&g

Spring mvc @initBinder 类型转化器的使用

一.单日期格式 因为是用注解完完成的后台访问,所以必须在大配置中配置包扫描器: 1.applicactionContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-ins

Spring mvc 数据验证框架注解

@AssertFalse 被注解的元素必须为false@AssertTrue 被注解的元素必须为false@DecimalMax(value) 被注解的元素必须为一个数字,其值必须小于等于指定的最小值@DecimalMin(Value) 被注解的元素必须为一个数字,其值必须大于等于指定的最小值@Digits(integer=, fraction=) 被注解的元素必须为一个数字,其值必须在可接受的范围内@Future 被注解的元素必须是日期,检查给定的日期是否比现在晚.@Max(value) 被注

Spring mvc 数据验证

加入jar包 bean-validator.jar 在实体类中加入验证Annotation和消息提示 package com.stone.model; import javax.validation.constraints.Size; import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.NotEmpty; public class User { private i

spring mvc: Hibernate验证器(字段不能为空,在1-150自己)

准备: 下载Hibernate Validator库 - Hibernate Validator.解压缩hibernate-validator-5.3.4.Final.jar 在/WEB-INF/下新建classes文件夹 访问地址: http://localhost:8080/gugua3/student/index 项目:gugua3 包名: springtest 这里用到了hibernate-validator包中的,Range范围随机数注解,NotEmpty不为空注解 例如: impor

Spring MVC -- 验证器

输入验证是Spring处理的最重要Web开发任务之一.在Spring MVC中,有两种方式可以验证输入,即利用Spring自带的验证框架,或者利用JSR 303实现.本篇博客将介绍这两种输入验证方法. 本篇博客用两个不同的示例分别介绍这两种方式:spring-validator和jsr303-validator. 一 验证概览 Converter和Formatter作用于字段级.在MVC Web应用中,它们将String类型转换或格式化成另一种Java类型,如java.time.LocalDat