在数据绑定过程中,Spring MVC 框架会通过数据绑定组件(DataBinder)将请求参数串的内容进行类型转换,然后将转换后的值赋给控制器类中方法的形参。
这样后台方式就可以正确绑定并获取客户端请求携带的参数。具体信息处理过程如下:
- Spring MVC 将 ServletRequest 对象传递给 DataBinder。
- 将处理方法的入参对象传递给 DataBinder
- DataBinder 调用 ConversionService 组件进行数据类型转换、数据格式化等工作,并将 ServletRequest 对象中的消息填充到参数对象中
- 调用 Validator 组件对已经绑定了请求消息数据的参数对象进行数据合法性校验
- 校验完成后会生成数据绑定结果 BindingResult 对象,Spring MVC 会将 BindingResult 对象中的内容赋给处理方法的相应参数。
当前端请求的参数比较简单时,可直接使用 Spring MVC 提供的默认参数类型进行数据绑定。
常用的默认参数类型如下:
- HttpServletRequest:通过 request 对象获取请求消息
- HttpServletResponse:通过 response 对象处理响应信息
- HttpSession:通过 session 对象得到 session 中存储的对象
- Model/ModelMap:Model 是一个接口,ModelMap 是一个接口实现,作用是将 Model 数据填充到 request 域。
在这里忽略配置文件
@Controller
public class UserController{
@RequestMapping(value="/selectUser")
public String selectUser(HttpServletRequest request){
//获取请求地址中的参数id 的值
String id = request.getParameter("id");
System.out.println("id="+id);
return "success";
}
}
使用注解方式定义了一个控制器类,同时定义了方法的访问路径。在方法参数中使用了 HttpServletRequest 类型,并通过该对象的 getParameter() 方法获取了指定的参数。
绑定简单数据类型简单数据类型的绑定指的是 Java 中几种基本数据类型的绑定,如 int、String、Double 等类型。
还是拿上面一个案例来进行说明。
@RequestMapping(value="/selectUser")
public String selectUser(Integer id){
System.out.println("id="+id);
return "success";
}
该方法只是将 HTTPServletRequest 参数类型替换成了 Integer 类型。
有时前端请求中参数名和后台控制器类方法中的形参名不一样,就会导致后台无法正确绑定并接收到前端请求的参数。为此,Spring MVC 提供了@RequestParam注解来进行间接数据绑定。
@RequestParam注解主要用于定义请求中的参数,在使用时可以指定它的4个属性:
- value:name 属性的别名,这里指参数的名字,即入参的请求参数名字,例如,value="user_id"表示请求的参数中名字为 user_id的参数的值将传入。如果只使用 value 属性,就可以省略 value 属性名。
- name:指定请求头绑定的名称。
- required:用于指定参数是否必须,默认是 true,表示请求中一定要有相应的参数。
- defaultValue:默认值,表示如果请求中没有同名参数的默认值。
在实际应用中,客户端请求可能会传递多个不同类型的参数数据,此时可以使用 POJO 类型进行数据绑定。
POJO 类型的数据绑定是将所有关联的请求参数封装在一个 POJO (对象)中,然后在方法中直接使用该 POJO 作为形参来完成数据绑定。
@RequestMapping(value="/registerUser")
public String selectUser(User user){
String username = user.getUserName();
String password = user.getPassword();
System.out.println("username="+username);
System.out.println("password="+password);
return "success";
}
注意:在使用 POJO 类型数据绑定时,前端请求的参数名必须与要绑定的 POJO 类中的属性名用于,



