SpringMVC数据绑定流程:
1.Spring MVC主框架将ServletRequest对象以及目标方法的入参实例传递给WebDataBinderFactory实例,以创建DataBinder(数据绑定器)实例对象
2.DataBinder在调用装配在Srping MVC上下文中的conversionService
组件进行数据类型转换,数据格式化工作,将Servlet中的请求信息填充到入参对象
中
3.调用validator对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果BindingData对象
4.SpringMVC抽取BindingResult中的入参对象和校验错误对象.将他们赋给处理方法的响应入参
一.基本数据类型(int为例)
jsp:
<form action="testInt" >
id:<input type="text" name="id" value="10"/>
<input type="submit" value="submit">
</form>
controller:
@RequestMapping(value="testInt")
public String testInt(int id){
System.out.println(id);
return "success";
}
input中的name属性和目标方法的参数名相同,不同的话可以使用@RequestParam注解,如果input值为null或“”,目标方法参数为基本数据类型会报数据类型转换异常,解决方案是目标方法参数使用包装类。
二.对象类型
user类:
private int id;
private String username;
private String passsword;
private int age;
private String email;
jsp:
<form action="testUser" >
<input type="hidden" name="id" value="1" />
<input type="text" name="username" value="zhangsan" />
<input type="text" name="age" value="10" />
<input type="text" name="email" value="asd@huawei.com" />
<input type="submit" value="submit" />
</form>
controller:
@RequestMapping("testUser")
public String testUser(User user){
System.out.println("user:"+user);
return "success";
}
input的name属性和user对象的属性名称要一样,且user属性要有对应的set方法
三.list集合类型
UserList类:
public class UserList {
private List<User> userList;
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
@Override
public String toString() {
return "UserList [userList=" + userList + "]";
}
}
jsp:
<form action="testList" >
<table>
<tr>
<td><input name="userList[0].id" value="1"></td>
<td><input name="userList[0].username" value="lisi"></td>
<td><input name="userList[0].age" value="22"></td>
<td><input name="userList[0].email" value="asd@huawei.com"></td>
</tr>
<tr>
<td><input name="userList[1].id" value="2"></td>
<td><input name="userList[1].username" value="wangwu"></td>
<td><input name="userList[1].age" value="23"></td>
<td><input name="userList[1].email" value="qwe@huawei.com"></td>
</tr>
<tr>
<input type="submit" value="submit">
</tr>
</table>
</form>
controller:
@RequestMapping("testList")
public String testList(UserList userList){
for(User user:userList.getUserList()){
System.out.println(user);
}
return "success";
}
userList属性被定义成了list,所以在input的name属性中需要指定list下标
四.set集合类型
set和list类似,但set在使用时需要先在Set对象中add相应的数量的模型对象
private Set<User> userSet = new HashSet<User>();
public UserSet() {
userSet.add(new User());
userSet.add(new User());
}
}