Spring MVC InitBinder验证方法

 更新时间:2018年03月14日 16:34:13   作者:横渡  
这篇文章主要介绍了Spring MVC InitBinder验证方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

Annotation验证使用方法可参见:https://www.jb51.net/article/136448.htm

这里需要注意的一点: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>

即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java springboot接口迅速上手,带你半小时极速入门

    Java springboot接口迅速上手,带你半小时极速入门

    这篇文章主要给大家介绍了关于SpringBoot实现API接口的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-09-09
  • java使用FastJson解析Json数据

    java使用FastJson解析Json数据

    本篇文章主要介绍了java使用FastJson解析Json数据,fastjson 是一个性能极好的用 Java 语言实现的 JSON 解析器和生成器,有兴趣的可以了解一下。
    2017-02-02
  • Spring和IDEA不推荐使用@Autowired 注解原因解析

    Spring和IDEA不推荐使用@Autowired 注解原因解析

    这篇文章主要为大家介绍了Spring和IDEA不推荐使用@Autowired 注解原因解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java实现驼峰下划线互转的使用示例

    Java实现驼峰下划线互转的使用示例

    驼峰和下划线互转场景是在不同命名规范的情况下,需要进行字段名称的转换,本文就来介绍一下Java实现驼峰下划线互转的使用示例,感兴趣的可以了解一下
    2023-12-12
  • 聊聊spring @Transactional 事务无法使用的可能原因

    聊聊spring @Transactional 事务无法使用的可能原因

    这篇文章主要介绍了spring @Transactional 事务无法使用的可能原因,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SpringCloud中的OpenFeign调用解读

    SpringCloud中的OpenFeign调用解读

    OpenFeign是一个显示声明式的WebService客户端,使用OpenFeign能让编写Web Service客户端更加简单OpenFeign的设计宗旨式简化Java Http客户端的开发,本文给大家介绍SpringCloud之OpenFeign调用解读,感兴趣的朋友一起看看吧
    2023-11-11
  • Java GZIPOutputStream流压缩文件的操作

    Java GZIPOutputStream流压缩文件的操作

    这篇文章主要介绍了Java GZIPOutputStream流压缩文件的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • JavaTCP上传文本文件代码

    JavaTCP上传文本文件代码

    今天小编就为大家分享一篇关于JavaTCP上传文本文件代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • 快速使用IDEA图形化界面连接Phoenix的方法

    快速使用IDEA图形化界面连接Phoenix的方法

    最近很多朋友跟小编留言如何使用IDEA图形化界面连接Phoenix,在这小编就不一一回复大家了,今天抽空给大家整理一篇教程关于idea 图形化界面连接Phoenix的相关知识,需要的朋友快来学习下吧
    2021-05-05
  • Java经典面试题最全汇总208道(五)

    Java经典面试题最全汇总208道(五)

    这篇文章主要介绍了Java经典面试题最全汇总208道(五),本文章内容详细,该模块分为了六个部分,本次为第五部分,需要的朋友可以参考下
    2023-01-01

最新评论