Spring MVC数据绑定

文章目录

  • 1 数据绑定
    • 1.1 数据绑定介绍
    • 1.2 Spring MVC如何完成数据绑定
    • 1.3 数据绑定流程
  • 2 简单数据绑定
    • 2.1 @RequestParam注解属性
    • 2.2 绑定POJO类型
      • 2.2.1 中文乱码
      • 2.2.2 涉及多对象信息的传递
      • 2.2.3 自定义数据绑定
        • 2.2.3.1 Converter
        • 2.2.3.2 Formatter
  • 3 复杂数据绑定
    • 3.1 绑定数组
    • 3.2 绑定集合

1 数据绑定

1.1 数据绑定介绍

  在程序执行过程中,Spring MVC恢复根据客户端请求参数的不同,将请求消息中的信息以一定的方式转换并绑定到控制器类的方法参数中。这种将请求消息数据与后台方法参数建立连接的过程就是Spring MVC中的数据绑定。

1.2 Spring MVC如何完成数据绑定

  1. 在数据绑定过程中 ,Spring MVC框架会通过数据绑定组件(DataBinder)先将请求参数串的内容进行类型转换。
  2. 然后将转换后的值赋给控制器类中方法的形参,这样后台方法就可以正确绑定并获取客户端请求携带的参数了。

1.3 数据绑定流程

Spring MVC数据绑定_第1张图片
  1. Spring MVC将ServletRequest对象传递给DataBinder
  2. 处理方法的签名将处理方法的入参对象传递给DataBinder
  3. DataBinder调用ConversionService组件进行数据类型转换、数据格式化等工作,并将ServletRequest对象中的消息填充到参数对象中
  4. 调用Validator组件对已经绑定了请求消息数据的参数对象进行数据合法性校验
  5. 检验完成后会生成数据绑定结果BindingResult对象,Spring MVC会将BindingResult对象中的内容赋给处理方法的相应参数

2 简单数据绑定

  当前端请求的参数比较简单时,可以在后台方法的形参中直接使用Spring MVC提供的默认参数类型进行数据绑定。常用的默认参数类型:

  • HttpServletRequest:通过request对象获取请求信息
  • HttpServletResponse:通过response处理响应信息
  • HttpSession:通过session对象得到session中存放的对象
  • Model/ModelMap:Model是一个接口,ModelMap是一个接口实现,作用是将model数据填充到request域

以HttpServletRequest类型的使用为例:

@Controller
Public class UserController{
	@RequestMapping("/selectUser")
	public String selectUser(HttpServletRequest request){
		//通过request对象获取请求信息
		String id = request.getParameter("id");
		System.out.println("id="+id);
		return "susses";
	}
}

访问的时试用地址:http://localhost:8080/ch13/selectUser?id=1
  简单数据类型的绑定,就是指Java中的几种基本数据类型的绑定,例如int、String、Double等类型。将上述控制器类UserController中的selectUser()方法修改如下:

@Controller
Public class UserController{
	@RequestMapping("/selectUser")
	//将默认参数类型HttpServletRequest改用基本类型Integer绑定接收
	public String selectUser(Integer id){
		System.out.println("id="+id);
		return "susses";
	}
}

但是需要注意的是,有的时候前端请求参数和后台控制器类方法中的形参名不一样,这就会导致后台无法绑定并接受到前端请求的参数。当遇见这种情况的时候,就可以考虑使用Spring MVC提供的@RequestParam注解类型来进行间接数据绑定。

2.1 @RequestParam注解属性

  • value:name属性的别名,这里指参数的名字,即入参的请求参数名字,如value="item_id",表示请求的参数中名字为item_id的参数的值传入,如果只使用value属性,则可以省略value属性名
  • name:指定请求绑定的名称
  • required:用于指定参数是否必须,默认是true,表示请求中一定要有相应的参数
  • defaultValue:默认值,表示如果请求中没有同名参数时的默认值

在这里我们举个例子:假设请求地址为http://localhost:8080/ch13/selectUser?user_id=1,在这里传入的是user_id,后台方法书写如下:

@requestMapping("selectUser")
//方法的参数是Integer id,先使用@RequestParam接收同名参数,后间接绑定到方法的形参上
public String selectUser(@RequestParam(value="user_id")Integer id){
	System.out.println("id="+id);
	return "success";
}

在实际应用中,客户端请求可能会传递多个不同类型的参数数据,如果还是用简单的数据绑定的话,那么就需要手动编写多个不同类型的参数,这种操作是比较繁琐的。这时候使用POJO类型进行数据绑定。

2.2 绑定POJO类型

  多类型,多参数的请求,就使用POJO类型(也就是JavaBean)进行数据绑定。将所有关联的请求参数封装在一个POJO中,然后再方法中直接使用该POJO作为形参来完成数据绑定。例如:

Spring MVC数据绑定_第2张图片

2.2.1 中文乱码

  为了防止前端传入的中文数据出现乱码的问题,我们可以在web.xml中配置Spring提供的编码过滤器来统一编码,如下:

<filter>
	<filter-name>CharacterEncodingFilterfilter-name>
	<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
	<init-param>
		<param-name>encodingparam-name>
		
		<param-value>UTF-8param-value>
	init-param>
filter>
<filter-mapping>
	<filter-name>CharacterEncodingFilterfilter-name>
	
	<url-pattern>/*url-pattern>
filter-mapping>

2.2.2 涉及多对象信息的传递

  就比如说在用户查询订单时,页面传输的参数可能包括:订单编号、用户名称等信息,这就包含了订单和用户两个对象的信息,这个时候可以:

  • 使用POJO类型绑定
  • 还可以考虑使用包装POJO类型绑定,包装POJO就是在一个POJO中包含另一个简单的POJO。例如,在订单对象中包含用户对象,这样在使用使,就可以通过订单查询到用户信息。
Spring MVC数据绑定_第3张图片

2.2.3 自定义数据绑定

  一般情况下,使用基本数据类型和POJO类型的参数数据已经能够满足需求,然而有些特殊类型的参数是无法在后台进行直接转换的,也有特殊数据类型无法直接进行数据绑定,这样的话就必须先进行数据转换,例如日期数据。处理这种情况,就需要开发者自定义转换器(Converter)或格式化(Formatter)来进行数据绑定。

2.2.3.1 Converter

  Spring框架提供了一个COnverter用以将一种类型的对象转换为另一种类型的对象。自定义Converter类需要实现org.springframework.core.convert.converter.Converter接口。

//T为目标类型
//S为源类型
public interface Converter<S,T>{
	T convert(S source);
}

2.2.3.2 Formatter

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

public interface Formatter<T> extends Printer<T>,Parser<T>{}

3 复杂数据绑定

  一般情况下,复杂的数据绑定会和集合相关联,比如批量删除、批量选择、同时填写多条数据等。就像在实际的开发中,数组的绑定、集合的绑定这都是很常见的。

3.1 绑定数组

  就比如说当遇见前端请求需要传递到后台一个或多个相同名称参数的情况(如批量删除),这个时候如果再使用简单数据绑定的方式显然是不合适的。对于像这样的情况如果将所有同种类型的请求参数封装到一个数组中,后台就可以进行接收了。

Spring MVC数据绑定_第4张图片
Spring MVC数据绑定_第5张图片

3.2 绑定集合

  还有另一种情况就是批量修改用户操作的话,前端请求传递过来的数据可能就会批量包含各种类型的数据,如Integer、String等。这种时候,就可以使用集合数据绑定,即在包装类(包装POJO类:UserVO)中定义一个包含用户信息类的集合,然后在接收方法中将参数类型定义为该包装类的集合

Spring MVC数据绑定_第6张图片
Spring MVC数据绑定_第7张图片

声明:
若本人发布的作品涉及版权或存在其他问题,请联系我删除。
谢谢浏览!

你可能感兴趣的:(#,JavaWeb,spring,java)