作者:一一哥
在上一章节,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类关系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项目我们在上一个项目的基础之上直接编写本案例。
项目结构:我们在项目中创建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() 方法用一个字段名注册错误信息。
我们创建一个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()
关注
打赏
- 异常解决及问题分析博客系列汇总
- SpringBoot2.x系列教程汇总-从入门到精通
- 跟一一哥学Java系列之从入门到精通教程汇总
- 高薪程序员&面试题精讲系列156之你还有什么要问的吗?你平时怎么学习?
- 高薪程序员&面试题精讲系列155之项目介绍,说说你最熟悉的项目,遇到了哪些困难?
- 高薪程序员&面试题精讲系列154之电商专题(下)-你做过秒杀吗?怎么设计秒杀?订单详情页有哪些要求?
- 高薪程序员&面试题精讲系列153之电商专题(中)-你的电商项目订单是如何设计的?支付流程你熟悉吗?金额是怎么设计的?
- 高薪程序员&面试题精讲系列152之电商专题(中)-SPU是怎么回事?SPU如何设计?SKU又是什么呢?SN你知道吗?
- 高薪程序员&面试题精讲系列151之电商专题(中)-你做过电商项目吗?说说购物车的实现流程吧
- 高薪程序员&面试题精讲系列150之电商专题(上)-你们的电商项目有什么特色?是B2B还是B2C、还是C2C的?直播电商你了解吗?