您当前的位置: 首页 >  spring

一一哥Sun

暂无认证

  • 4浏览

    0关注

    622博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

SpringBoot2.x系列教程30--整合SpringMVC之WebDataBinder处理请求参数的绑定(二)

一一哥Sun 发布时间:2020-03-27 08:37:06 ,浏览量:4

SpringBoot2.x系列教程30--整合SpringMVC之WebDataBinder处理请求参数的绑定(二)

作者:一一哥

在上一章节,SpringBoot2.x系列教程29--整合SpringMVC之@InitBinder处理请求参数的绑定(上)的内容中,我给大家讲解了@InitBinder的原理及使用教程,本章节我继续讲解SpringMVC中的参数传递及数据绑定。

本章节主要是讲解WebDataBinder的内容。

一. WebDataBinder简介

从上面的代码案例中,我们可以看到另一个类,那就是WebDataBinder!

1. WebDataBinder的由来

在servlet中,有一个方法:request.getParameter("paramName"),它会根据key返回一个String类型的数据。

但是如果我们这样一个一个地去取出web中的请求参数,那就会很麻烦。我们知道Java中有对象的概念,那有没有办法将request中的请求参数自动封装到一个Java对象中呢? 为了解决这个问题,Spring中引入了WebDataBinder。

2. WebDataBinder类关系

3. WebDataBinder的作用

WebDataBinder的作用是从web request中把web请求里的parameters绑定到对应的JavaBean上!

在Controller方法中的参数类型可以是基本类型,也可以是封装后的普通Java类型。若这个普通的Java类型没有声明任何注解,则意味着它的每一个属性都需要到Request中去查找对应的请求参数,而WebDataBinder则可以帮助我们实现从Request中取出请求参数并绑定到JavaBean中。

4. WebDataBinder工作机制

WebDataBinder是用来绑定请求参数到指定的属性编辑器里的。由于前台传到Controller里的值是String类型,当往Java Bean里设置这个值的时候,如果设置的这个属性是个对象,Spring就会去找到对应的编辑器editor进行转换,然后再设置进去!

Spring自己提供了大量的实现类,诸如CustomDateEditor,CustomBooleanEditor,CustomNumberEditor等,基本上够我们开始使用。

但在平时使用SpringMVC时,可能会碰到Java Bean中有Date类型的参数,表单中传来代表日期的字符串转化为日期类型,SpringMVC在默认时,是不支持这种类型转换的。此时我们就需要手动设置时间格式并在WebDateBinder上注册这个编辑器!

5. 示例代码
@InitBinder  
public void bindingPreparation(WebDataBinder binder) {  
  DateFormat dateFormat1 = new SimpleDateFormat("dd-MM-yyyy");  
  CustomDateEditor orderDateEditor = new CustomDateEditor(dateFormat1, true);  
  DateFormat dateFormat2 = new SimpleDateFormat("MMM d, YYYY");  
  CustomDateEditor shipDateEditor = new CustomDateEditor(dateFormat2, true);  
  binder.registerCustomEditor(Date.class, "orderDate", orderDateEditor);  
  binder.registerCustomEditor(Date.class, "shipDate", shipDateEditor);  
}  
二. WebDataBinder实现过程

WebDataBinder一般都要结合@InitBinder来一起使用。

1.创建web项目

我们在上一个项目的基础之上直接编写本案例。

项目结构:

2. 创建User类

我们在项目中创建domain包,在该包下创建一个User类。

package com.yyg.boot.domain;

import lombok.Data;

import java.util.Date;

/**
 * @Description Description
 * @Author 一一哥Sun
 * @Date Created in 2020/3/23
 */
@Data
public class User {

    private String name;

    private String password;

    private String email;

    private Date birthday;

}
3. Validator接口介绍
  • Validator 是一个有两个方法的接口;
  • boolean supports(Class clazz) : 检验参数是否验证成功的实例类;
  • void validate(Object target, Errors errors) : 如果 supports() 方法返回真, target object 合法. Errors.rejectValue() 方法用一个字段名注册错误信息。
4. 创建UserValidator验证类

我们创建一个validator包,在该包下面创建一个UserValidator验证类。

package com.yyg.boot.validator;

import com.yyg.boot.domain.User;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

/**
 * @Description Description
 * @Author 一一哥Sun
 * @Date Created in 2020/3/23
 */
@Component
public class UserValidator implements Validator {

    /**
     * 检验参数是否验证成功的实例类
     */
    @Override
    public boolean supports(Class clazz) {
        //isAssignableFrom()方法是判断是否为某个类的父类,instanceof关键字是判断是否某个类的子类。
        return User.class.isAssignableFrom(clazz);
    }

    /**
     * 如果 supports() 方法返回真, target object 合法. Errors.rejectValue() 方法会用一个字段名注册错误信息;
     */
    @Override
    public void validate(Object target, Errors errors) {
        User user = (User)target;
        //配置字段验证信息
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "","Username is empty");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "", "Password is empty");
        //用户名长度不能小于5个字符
        if (user.getName().length()            
关注
打赏
1665624836
查看更多评论
0.1305s