在程序执行过程中,Spring MVC恢复根据客户端请求参数的不同,将请求消息中的信息以一定的方式转换并绑定到控制器类的方法参数中。这种将请求消息数据与后台方法参数建立连接的过程就是Spring MVC中的数据绑定。
当前端请求的参数比较简单时,可以在后台方法的形参中直接使用Spring MVC提供的默认参数类型进行数据绑定。常用的默认参数类型:
以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注解类型来进行间接数据绑定。
value="item_id"
,表示请求的参数中名字为item_id的参数的值传入,如果只使用value属性,则可以省略value属性名在这里我们举个例子:假设请求地址为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类型进行数据绑定。
多类型,多参数的请求,就使用POJO类型(也就是JavaBean)进行数据绑定。将所有关联的请求参数封装在一个POJO中,然后再方法中直接使用该POJO作为形参来完成数据绑定。例如:
为了防止前端传入的中文数据出现乱码的问题,我们可以在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>
就比如说在用户查询订单时,页面传输的参数可能包括:订单编号、用户名称等信息,这就包含了订单和用户两个对象的信息,这个时候可以:
一般情况下,使用基本数据类型和POJO类型的参数数据已经能够满足需求,然而有些特殊类型的参数是无法在后台进行直接转换的,也有特殊数据类型无法直接进行数据绑定,这样的话就必须先进行数据转换,例如日期数据。处理这种情况,就需要开发者自定义转换器(Converter)或格式化(Formatter)来进行数据绑定。
Spring框架提供了一个COnverter用以将一种类型的对象转换为另一种类型的对象。自定义Converter类需要实现org.springframework.core.convert.converter.Converter
接口。
//T为目标类型
//S为源类型
public interface Converter<S,T>{
T convert(S source);
}
Formatter与Converter的作用相同,只是Formatter的源类型必须是一个String类型,而Converter可以实任意类型。使用Formatter自定义转换器类需要实现org.springframework.format.Formatter
接口。
public interface Formatter<T> extends Printer<T>,Parser<T>{}
一般情况下,复杂的数据绑定会和集合相关联,比如批量删除、批量选择、同时填写多条数据等。就像在实际的开发中,数组的绑定、集合的绑定这都是很常见的。
就比如说当遇见前端请求需要传递到后台一个或多个相同名称参数的情况(如批量删除),这个时候如果再使用简单数据绑定的方式显然是不合适的。对于像这样的情况如果将所有同种类型的请求参数封装到一个数组中,后台就可以进行接收了。
还有另一种情况就是批量修改用户操作的话,前端请求传递过来的数据可能就会批量包含各种类型的数据,如Integer、String等。这种时候,就可以使用集合数据绑定,即在包装类(包装POJO类:UserVO)中定义一个包含用户信息类的集合,然后在接收方法中将参数类型定义为该包装类的集合。