一文解决Spring MVC的数据绑定

数据绑定介绍

什么是数据绑定?
在执行程序时,Spring MVC会根据客户端请求参数的不同,将请求消息中的信息以一定的方式转换并绑定到控制器类的方法参数中。这种将请求消息数据与后台方法参数建立连接的过程就是Spring MVC中的数据绑定。
Spring MVC是怎样完成的数据绑定?
在数据绑定过程中,Spring MVC框架会通过数据绑定组件(DataBinder)将请求参数串的内容进行类型转换,然后将转换后的值赋给控制器类中方法的形参,这样后台方法就可以正确绑定并获取客户端请求携带的参数了。
数据绑定的过程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数据绑定的分类
根据客户端请求参数类型和个数的不同,我们将Spring MVC中的数据绑定主要分为简单数据绑定和复杂数据绑定

简单数据绑定

绑定默认数据类型

当前端请求的参数比较简单时,可以在后台方法的形参中直接使用Spring MVC提供的默认参数类型进行数据绑定。
常用默认参数类型:
HttpServletRequest:通过request对象获取请求信息;
HttpServletResponse:通过response处理响应信息;
HttpSession:通过session对象得到session中存放的对象;
Model/ModelMap:Model是一个接口,ModelMap是一个接口实现,作用是将model数据填充到request域。

绑定简单数据类型

简单数据类型的绑定,就是指Java中几种基本数据类型的绑定,例如int、String、Double等类型。
public String selectUser(Integer id) {}
但当有时候前端请求中参数名和后台控制器类方法中的形参名不一样,这就会导致后台无法正确绑定并接收到前端请求的参数。此时可以考虑使用Spring MVC提供的@RequestParam注解类型来进行间接数据绑定。
@RequestParam注解的属性声明如下:
在这里插入图片描述
先用@RequestParam接收同名参数,后间接绑定到方法形参上。

绑定POJO类型

针对多类型、多参数的请求,可以使用POJO类型进行数据绑定。
POJO类型的数据绑定就是将所有关联的请求参数封装在一个POJO中,然后在方法中直接使用该POJO作为形参来完成数据绑定。

在使用POJO类型数据绑定时,前端请求的参数名必须与要绑定的POJO类中的属性名一样,这样才会自动将请求数据绑定到POJO对象中,否则后台接收的参数值为null
Spring的编码过滤器类:org.springframework.web.filter.CharacterEncodingFilter
解决请求参数中的中文乱码问题:

<filter>
        <filter-name>CharacterEncodingFilter</filter-name>		
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
                   <param-name>encoding</param-name>
                   <param-value>UTF-8</param-value>
        </init-param>
</filter>
<filter-mapping>
       <filter-name>CharacterEncodingFilter</filter-name>
       <url-pattern>/*</url-pattern>//拦截所有URL请求,交由编码过滤器
</filter-mapping>

绑定包装POJO

所谓的包装POJO,就是在一个POJO中包含另一个简单POJO。例如,在订单对象中包含用户对象。这样在使用时,就可以通过订单查询到用户信息。
使用包装POJO类型数据绑定时,如果前端条件参数是包装类中POJO的子属性,则参数名必须为对象.属性;如果查询条件参数是包装类的直接基本属性,则参数名直接用对应的属性名

自定义数据绑定

一般情况下,使用基本数据类型和POJO类型的参数数据已经能够满足需求,然而有些特殊类型的参数是无法在后台进行直接转换的,但也有特殊数据类型无法直接进行数据绑定,必须先经过数据转换,例如日期数据
此时就需要开发者自定义转换器(Converter)或格式化(Formatter)来进行数据绑定。
Formatter与Converter的作用相同,只是Formatter的源类型必须是一个String类型,而Converter可以是任意类型。

复杂数据绑定

绑定数组

当遇到前端请求需要传递到后台一个或多个相同名称参数的情况(如批量删除),将所有同种类型的请求参数封装到一个数组中,后台就可以进行绑定接收了。

绑定集合

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

使用集合数据绑定时,后台方法中不支持直接使用集合形参进行数据绑定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章