第一个问题 什么是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文件中添加: