3.3 SpringMVC --数据绑定(基本数据类型、POJO类、POJO包装类、自定义类(日期类型)、数组、集合的数据绑定)

第一个问题 什么是SpringMVC中的数据绑定呢?

将客户端的请求参数 以 一定的方式 转换并与控制器类的对应处理方法的参数绑定。这种将客户端的请求参数与控制器的处理函数的参数建立联系的过程就是SpringMVC中的数据绑定。

第二个问题 SpringMVC怎么完成的数据绑定的呢?

在SpringMVC中利用DataBinder数据绑定组件,将请求参数进行数据类型转换,然后将转换后的请求参数赋值给控制器类方法的形参。

在这里插入图片描述

1.SpringMVC 将servletRequest对象传递给DataBinder;
2.将处理方法的形参传递给DataBinder;
3.DataBinder调用ConversionService组件进行数据类型转换,数据格式化等,最后将ServletRequest对象中的消息填充到参数对象中;
4.调用Validator组件对绑定请求消息数据的参数对象进行数据合法性校验;
5.生成数据绑定结果BindingResult对象,SpringMVC将BindingResult对象中的内容复制给处理方法的形参;

具体看看SpringMVC中的数据绑定:

根据需要绑定的参数的个数以及参数的数据类型,SpringMVC中的数据绑定也分为简单数据绑定和复杂数据绑定两类:

1.简单数据绑定:
1.1 简单的不能再简单的数据绑定:

这类就是Java中基本数据类型的绑定,如int、string、Double等。

demo:
假设客户端发一个请求:

 http://localhost:8080/user/select?id=1

控制器中对应的处理方法:

@RequestMapping("/user/select")
// 将默认的HttpServletRequest 改用 基本类型 Integer 绑定接收
public String selectUser(Integer id){
  System.out.println(id);
  return "success";
}

 上面这种简单数据绑定,是基于请求的参数名与控制器的方法的参数名一致的情况的。如果两者不一样也是有方法单独配置的:

比方说,客户端发来了一个请求;

http://localhost:8080/user/select?user_id=1

控制器处理方法:

@GetMapping(“/user/select”)
public String selectUser( @RequestParam(value="user_id") Integer id){
       System.out.println(id);
       return "success";
}

所以重点在于使用 @RequestParam 注解,除了value属性外,还有:
name:请求头绑定的名称;
required:说明该参数是否必须,默认为 true ,即该参数时必须的;
defaultValue:默认值,若请求中该参数,则在处理方法中使用该默认值;

1.2 POJO类型绑定

当哭护短一次请求基本类型参数过多,在处理方法形参中一个个写,显然很难看;此时,使用POJO类型(根据请求参数自建类)进行数据绑定,可以解决多种数据类型、多个请求参数的快速绑定问题:

demo

这回客户端需要发一个post请求了,这里为了演示用get请求意会一下吧:

http://localhost:8080/user/register?user={username:123,password:123456}

对应控制器处理方法:

@RequestMapping("/user/register")
    public String registerUser(User user) {
        String username = user.getUsername();
        Integer password = user.getPassword();
        System.out.println("username="+username);
        System.out.println("password="+password);
        return "success";
    }

注意:POJO类定义的属性名要严格与客户端请求的参数名(表单数据内的各元素的key),即demo中的username、password,保持一致。

1.3 绑定包装的POJO类:

应用场景:在查询客户订单时,返回 订单编码 对应的用户信息。此时就可以定义一个订单POJO,其中用户作为订单POJO 的一个属性:

在这里插入图片描述
客户端请求(应该是一个post请求,还是要get请求意会一下):

http://localhost:8080/order/select?orders={ orderId : 123 , user:{ username:123456, password : 123456 } }

控制器处理方法:

在这里插入图片描述

1.4 自定义数据绑定

应用场景:比如日期类型的数据绑定

Spring框架提供了Converter、Formatter两种转换器,用于将一种类型的对象转换为另一种类型的对象。使用之前需要在Spring配置文件中添加配置:
在这里插入图片描述
(1)Converter转换器
自定义Converter类需要实现org.springframework.core.convert.converter.Converter接口。这种转换器不限制源数据类型

在这里插入图片描述

(2)Formatter转换器:
 与Converter的作用相同,只是Formatter的源类型必须是一个String类型,而Converter可以是任意类型。使用Formatter自定义转换器类需要实现org.springframework.format.Formatter接口:

在这里插入图片描述
控制器处无需做其他处理:
在这里插入图片描述

2 复杂数据类型绑定

主要是指数组、集合 数据类型的绑定:

2.1 数组绑定:

 应用场景:批量删除数据

demo:

前端JSP页面:
在这里插入图片描述

后台控制器方法(ids 与前端页面 name属性值一致):

在这里插入图片描述

2.2 集合绑定:

 应用场景:批量修改数据

demo:

前端JSP页面(name属性一定是users,与后端定义的POJO类的属性名一致):

在这里插入图片描述

后台控制器方法:

在这里插入图片描述
其中涉及到的定义的UserVo类:
在这里插入图片描述

写在最后:
解决解析客户端发送的请求消息中文乱码的问题:
在web.xml文件中添加:
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值