Spring MVC的数据绑定

数据绑定

  • 概述
  • 简单数据绑定
    • 绑定默认数据类型
    • 绑定简单数据类型
    • 绑定POJO类型
    • 当请求参数含有中文,后台处理乱码
    • 绑定包装POJO
    • 自定义数据绑定
      • Converter接口
      • Formatter接口
  • 复杂数据绑定
    • 绑定数组
    • 绑定集合

概述

Spring MVC会根据客户端请求参数的不同,将请求参数以一定的方式转换并绑定到控制器类的方法参数中。Spring MVC会通过数据绑定组件(DataBinder) 将这种请求参数与后台方法参数建立连接的过程就叫Spring MVC的数据绑定。绑定过程如下:

Spring MVC的数据绑定_第1张图片

由上图可知,Spring MVC进行数据绑定的核心是DataBinder,那么它具体如何工作的呢?

  1. Spring MVC将ServletRequest对象传递给DataBinder。
  2. 控制类的处理方法将形参对象传递给DataBinder
  3. DataBinder调用ConversionService组件进行数据类型的转换、格式化等工作。然后将ServletRequest对象中的请求参数填充到方法参数对象中。
  4. 对绑定好的数据会进行数据合法性检验
  5. 检验完成后生成数据绑定结果BindingResult对象。最后Spring MVC将BinderResult对象中的内容赋值给处理方法的相应参数(和第三步似乎冲突?暂且不管)

Spring MVC中的数据绑定共分为二种:

  1. 简单数据绑定
  2. 复杂数据绑定

简单数据绑定

绑定默认数据类型

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

  1. HttpServletRequest:通过request对象获取请求信息
  2. HttpServletResponse:通过response对象处理响应信息
  3. HttpSession:session对象
  4. Model/ModelMap:作用是将model数据填充到request域

示例:

  1. 创建项目chapter13,并导入相关JAR包
  2. 配置web.xml和spring-config.xml文件
    Spring MVC的数据绑定_第2张图片
    Spring MVC的数据绑定_第3张图片
  3. 创建UserController控制类。
    Spring MVC的数据绑定_第4张图片
  4. view
    Spring MVC的数据绑定_第5张图片
    Spring MVC的数据绑定_第6张图片

绑定简单数据类型

绑定简单数据类型,就是指绑定Java中几种基本数据类型的绑定。会自动将请求参数和同名的处理方法参数绑定。例如:更改上文中的UserController类如下:

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

若想要绑定不同名的参数,可以使用@RequestParam注解进行间接绑定,如下:
Spring MVC的数据绑定_第8张图片
Spring MVC的数据绑定_第9张图片

绑定POJO类型

当客户端请求传递多个不同类型的参数数据,采用上文中的简单数据类型绑定,需要在处理方法中编写不同类型的参数,难免有些繁琐。此时可采用POJO类型进行数据绑定
POJO类型数据绑定就是将所有请求参数封装在一个POJO类中,然后在方法使用该POJO类型接收参数。表单传递请求要以POST方式例如:

  1. 编写POJO类
package com.syl.po;

public class User {
	private Integer id;
	private String username;
	private String password;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
}
  1. 在UserController控制类中,编写向注册页面跳转和接收用户注册信息的方法。
    Spring MVC的数据绑定_第10张图片

  2. 注册页面register.jsp
    Spring MVC的数据绑定_第11张图片

  3. view
    在这里插入图片描述
    Spring MVC的数据绑定_第12张图片
    Spring MVC的数据绑定_第13张图片

当请求参数含有中文,后台处理乱码

例如:当请求参数中包含中文时,后台显示会乱码

Spring MVC的数据绑定_第14张图片
Spring MVC的数据绑定_第15张图片

解决办法:使用Spring提供的编码过滤器来统一编码,在web.xml配置文件中添加如下代码:

	
	<filter>
	    <filter-name>CharacterEncodingFilterfilter-name>
	    <filter-class>
	        org.springframework.web.filter.CharacterEncodingFilter
	    filter-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>

配置了编码过滤器后:

Spring MVC的数据绑定_第16张图片
Spring MVC的数据绑定_第17张图片

绑定包装POJO

当请求参数包含两个POJO对象信息时,在处理方法中设置两个对应的参数,相对比较麻烦。
在一个POJO类中包含另一个POJO类对象进行数据绑定
例如:

  1. 创建订单POJO类
package com.syl.po;

public class Orders {
	private Integer ordersId;
	private User user;//包含另一个POJO类
	public Integer getOrdersId() {
		return ordersId;
	}
	public void setOrdersId(Integer ordersId) {
		this.ordersId = ordersId;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	
}

  1. UserController控制类中创建处理方法
    Spring MVC的数据绑定_第18张图片
  2. 查询订单页面orders.jsp
    Spring MVC的数据绑定_第19张图片
  3. view
    Spring MVC的数据绑定_第20张图片
    Spring MVC的数据绑定_第21张图片
    Spring MVC的数据绑定_第22张图片

自定义数据绑定

有些特殊类型的参数无法进行直接转换,例如日期数据就需要自定义转换器(Converter)或格式化(Formatter)来进行数据绑定。

Converter接口

所属包:org.springframework.core.convert.converter.Converter接口
它包含一个实现转换功能的抽象方法,如下

	public interface Converter<S,T>{
		T conver(S source);
	}

上述Converter接口中,S表示需要转换的类型,T表示目标类型。Converter接口的应用如下:

  1. 创建日期转换类(用于将字符串转换成日期型数据)
    Spring MVC的数据绑定_第23张图片
  2. UserController控制层添加处理请求方法
    Spring MVC的数据绑定_第24张图片
  3. spring-config.xml配置转换器
    Spring MVC的数据绑定_第25张图片
    Spring MVC的数据绑定_第26张图片
  4. view
    Spring MVC的数据绑定_第27张图片
    Spring MVC的数据绑定_第28张图片

Formatter接口

所属包:org.springframework.format.Formatter接口。Formatter接口与Converter接口完成的功能类似。区别在于Converter接口可将任意一个类型的数据,转换成另一个类型的数据,而Formatter接口只能将一个String类型的数据转换成另一个类型的数据。Formatter接口代码如下

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

Formatter接口继承了Printer和Parser接口,分别包含了一个print()和parse()方法。print()方法会返回目标对象的字符串。parse()方法会利用Locale将一个String转换成目标类型。

  1. 创建日期转换类(使用Formatter接口)
    Spring MVC的数据绑定_第29张图片
  2. 在UserController控制层添加处理方法

使用Converter接口定义的方法

  1. 修改spring-config.xml配置文件

将Converter接口的Bean修改如下,其他不变
Spring MVC的数据绑定_第30张图片

  1. view

与Converter接口一样

复杂数据绑定

上文中都是简单类型的数据绑定。数组、集合的绑定都属于复杂数据绑定。

绑定数组

绑定数组和绑定简单类型的数据方法一致。以批量删除用户为例:

  1. 创建显示用户信息的user.jsp
    Spring MVC的数据绑定_第31张图片
  2. UserController控制层编写处理方法
    Spring MVC的数据绑定_第32张图片
  3. 显示
    Spring MVC的数据绑定_第33张图片

绑定集合

当需要批量修改用户操作,前端请求参数传递过来的数据可能就会批量包含各种类型的数据,这时无法采用数组绑定。可以采用集合数据绑定。例如:

  1. 创建vo包,包装类UserVo来封装集合属性。
    Spring MVC的数据绑定_第34张图片
  2. UserController控制类,编写接收批量修改用户数据的方法
    Spring MVC的数据绑定_第35张图片
  3. 创建页面文件user_edit.jsp
    Spring MVC的数据绑定_第36张图片
  4. view
    Spring MVC的数据绑定_第37张图片
    Spring MVC的数据绑定_第38张图片
    Spring MVC的数据绑定_第39张图片
    @syl 2021/08/24 20:40 周二 小雨

你可能感兴趣的:(Spring,MVC,mvc,spring)