主要介绍SpringMVC 数据绑定的数据绑定,包含数据类型、对象、集合的绑定。
一、基本数据类型的绑定
@RequestMapping("test/int") @ResponseBody public String basic(int age) { return "age = " + age; }
浏览器中输入:http://localhost:8080/test/int?age=10
返回:age = 10
注:基本数据类型作为形参,传递的参数必须填写,否则会报错。如http://localhost:8080/test/int
二、包装类型的绑定
@RequestMapping("test/integer") @ResponseBody public String basic1(Integer age) { return "age = " + age; }
浏览器中输入:http://localhost:8080/test/integer?age=24
返回:age = 24
注:包装类型是对象,传递的参数可以为空,如http://localhost:8080/test/integer
拓展:接收的参数可以使用@RequestParam定义别名,如
@RequestMapping("test/param") @ResponseBody public String basic2(@RequestParam(value = "aa", required = false) Integer age) { return "age = " + age; }
浏览器中输入:http://localhost:8080/test/param?aa=24
返回:age = 24
注:RequestParam注解有三个参数:value(接收的参数名),required(参数是否必填),defaultValue(参数默认值)
三、数据的绑定
@RequestMapping("test/array") @ResponseBody public String array(String[] name) { String str = ""; for (String s : name) { str += s + " "; } return str; }
浏览器中输入:http://localhost:8080/test/array?name=Jane&name=Tom&name=Lily
返回:Jane Tom Lily
四、单个对象的绑定
定义基本对象User,包含 姓名name,年龄age 两个属性,重写toString方法
public class User { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
@RequestMapping("test/user") @ResponseBody public String user(User user) { return user.toString(); }
浏览器中输入:http://localhost:8080/test/user?name=Jane&age=10
返回:User{name='Jane', age=10}
五、层级对象的绑定
public class Manager { private String code; private User user; public String getCode() { return code; } public void setCode(String code) { this.code = code; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String toString() { return "Manager{" + "code='" + code + '\'' + ", user=" + user + '}'; } }
@RequestMapping("test/manager") @ResponseBody public String manager(Manager manager) { return manager.toString(); }
浏览器中输入:http://localhost:8080/test/manager?code=A123&user.name=Jane
返回:Manager{code='A123', user=User{name='Jane', age=0}}
六、多个对象的绑定
新增Admin对象,属性同User对象
@RequestMapping("admin/user") @ResponseBody public String basic2(User user, Admin admin) { return user.toString() + "\n" + admin.toString(); }
浏览器输入:http://localhost:8080/admin/user?name=Jane&age=10
返回:User{name='Jane', age=10} Admin{name='Jane', age=10}
注:由于两个对象含有相同的属性,这时浏览器中输入的参数值会为两个对象都赋值。这种情况下需要使用@InitBinder注解,为两个参数指定前缀,分别对应不同的对象
@InitBinder("user") public void initUser(WebDataBinder binder) { binder.setFieldDefaultPrefix("user."); } @InitBinder("admin") public void initAdmin(WebDataBinder binder) { binder.setFieldDefaultPrefix("admin."); }
浏览器输入:http://localhost:8080/admin/user?user.name=Jane&user.age=10&admin.age=34
返回:User{name='Jane', age=10} Admin{name='null', age=34}
拓展:InitBinder作用范围 - 当前Controller
可用于类型转换,如页面提交的日期和javaBean中的日期格式的转换,SpringMvc默认不支持这种转换,需要手动自定义数据绑定
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
}
七、List集合的绑定
定义接收对象
public class UserList { private List<User> users; public List<User> getUsers() { return users; } public void setUsers(List<User> users) { this.users = users; } @Override public String toString() { return "UserList{" + "users=" + users + '}'; } }
@RequestMapping("test/list") @ResponseBody public String list(UserList user) { return user.toString(); }
浏览器输入:
http://localhost:8080/test/list?users[0].name=Jane&users[0].age=12&users[1].name=Tom&users[1].age=23
返回:UserList{users=[User{name='Jane', age=12}, User{name='Tom', age=23}]}
注:
- 接收List集合不能直接用形参List<T>接收,SpringMVC不辨识该类型,必须先定义收集类,使用该类来接收对象
- 参数中的前缀必须和收集类中定义的属性名称一样,如示例中的users,不能使用形参中的user
- 如果传参 users[0].name=Jane&users[0].age=12&users[20].name=Tom 则接收到的list长度是21
八、Set集合的绑定
public class UserSet { private Set<User> users; public Set<User> getUsers() { return users; } public void setUsers(Set<User> users) { this.users = users; } @Override public String toString() { return "UserSet{" + "users=" + users + '}'; } public UserSet() { users = new HashSet<User>(); users.add(new User()); } }
@RequestMapping("test/set") @ResponseBody public String set(UserSet user) { return user.toString(); }
浏览器输入:
http://localhost:8080/test/list?users[0].name=Jane&users[0].age=12
返回:UserSet{users=[User{name='Jane', age=12}]}
注: 如果此时输入
http://localhost:8080/test/list?users[0].name=Jane&users[0].age=12&users[1].name=Tom&users[1].age=23,则会报500的错误,因为Set对象初始时,只添加了一个user对象,故接收参数时,如果接收到两个对象,就会失败
总结:Set集合绑定时,必须先初始化Set对象;Set对象的长度在初始化时就固定了,接收的参数数量必须一致
九、Map集合的绑定
public class UserMap { private Map<String, User> users; public Map<String, User> getUsers() { return users; } public void setUsers(Map<String, User> users) { this.users = users; } @Override public String toString() { return "UserMap{" + "users=" + users + '}'; } }
@RequestMapping("test/map") @ResponseBody public String map(UserMap user) { return user.toString(); }
浏览器输入:
http://localhost:8080/test/map?users["x"].name=Jane&users["X"].age=12&users["y"].name=Tom&users["y"].age=23
返回:UserMap{users={x=User{name='Jane', age=12}, y=User{name='Tom', age=23}}}
十、Json 的绑定
pom文件中引入jar包依赖
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.4</version> </dependency>
@RequestMapping(value = "test/json", method = RequestMethod.POST) @ResponseBody public String json(@RequestBody Manager manager) { return manager.toString(); }
POST请求地址:http://localhost:8080/test/json
请求报文:{"code":"A123", "user":{"name":"Jane", "age":24}}
返回数据:Manager{code='A123', user=User{name='Jane', age=24}}
十一、Xml 的绑定
pom文件中引入jar包依赖(jar包的版本必须和项目中的Spring版本一样)
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>4.0.3.RELEASE</version> </dependency>
@XmlRootElement(name = "admin") public class Admin { private String name; private int age; @XmlElement(name = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlElement(name = "age") public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Admin{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
@RequestMapping(value = "test/xml", method = RequestMethod.POST) @ResponseBody public String xml(@RequestBody Admin admin) { return admin.toString(); }
POST请求地址:http://localhost:8080/test/xml
请求报文:<admin> <name>Jane</name><age>24</age></admin>
返回数据:Admin{name='Jane', age=24}