SpringMVC 中提供了多种数据绑定,可以把请求中的数据绑定为简单类型,简单数组,对象,对象的数组等。
简单数组
1 2 3 4 5
| @RequestMapping("/array") @ResponseBody public String[] array(@RequestParam("name") String[] names) { return names; }
|
1 2 3 4 5
| @RequestMapping("/list") @ResponseBody public List<String> list(@RequestParam("name") List<String> names) { return names; }
|
显示:
[“Tom”,”Lucy”]
简单对象
1 2 3 4 5
| @RequestMapping("/object") @ResponseBody public User object(User user) { return user; }
|
显示:
1 2 3 4 5
| { "username": "Tom", "age": 10, "address": null }
|
复杂对象
1 2 3 4 5
| @RequestMapping("/nested-object") @ResponseBody public User nestedObject(User user) { return user; }
|
显示:
1 2 3 4 5 6 7 8
| { "username": "Tom", "age": 10, "address": { "city": "Beijing", "street": "SCI" } }
|
同属性多对象
如果 URL 都使用 username 和 age 的话,会同时作用于 user 和 admin,使用 WebDataBinder
可对其加前缀,就能在映射的时候区分开是给谁使用的。
user.username
and admin.username
分别映射到对象 user 和 admin,age 同时映射到他们的 age 属性上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @RequestMapping("/intersect-object") @ResponseBody public Map intersectObject(User user, Admin admin) { Map<String, Object> map = new HashMap<String, Object>(); map.put("user", user); map.put("admin", admin); return map; }
@InitBinder("user") public void initUser(WebDataBinder binder) { binder.setFieldDefaultPrefix("user."); }
@InitBinder("admin") public void initAdmin(WebDataBinder binder) { binder.setFieldDefaultPrefix("admin."); }
|
显示:
1 2 3 4 5 6 7 8 9 10 11
| { "admin": { "username": "Jim", "age": 10 }, "user": { "username": "Tom", "age": 10, "address": null } }
|
对象数组
1 2 3 4 5
| @RequestMapping("/object-list") @ResponseBody public UserList objectList(UserList userList) { return userList; }
|
显示:
1 2 3 4 5 6 7 8 9 10 11
| { "users": [{ "username": "Tom", "age": 0, "address": null }, { "username": "Lucy", "age": 0, "address": null }] }
|
对象的 Map
1 2 3 4 5
| @RequestMapping("/object-map") @ResponseBody public UserMap objectMap(UserMap users) { return users; }
|
显示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| { "users": { "x": { "username": "Tom", "age": 0, "address": null }, "y": { "username": "Lucy", "age": 0, "address": null } } }
|
AJAX 数据绑定
如果是 AJAX 传递数据给服务器端,然后要绑定为对象,那么 AJAX 不能是 GET 操作,如果只是使用 AJAX 从服务器端获取数据,则可以是 GET,POST 等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| <!DOCTYPE html> <html> <head> <title></title> <script src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script> <script> $(document).ready(function() { var data = {username: 'Biao', age: 111};
$.ajax({ url: '/json-bind', type: 'POST', dataType: 'json', contentType: 'application/json', data: JSON.stringify(data) }) .done(function(result) { console.log(result); }) .fail(function() { console.log("error"); }) .always(function() { console.log("complete"); }); }); </script> </head> <body> </body> </html>
|
接受 AJAX 传递过来的数据,映射为对象时必须要有 @RequestBody
修饰方法的参数
1 2 3 4 5 6
| @RequestMapping("/json-bind") @ResponseBody public User json(@RequestBody User user) { System.out.println(user.getUsername()); return user; }
|
浏览器控制台输出
1 2 3 4 5
| { username: "Biao", age: 111, address: null }
|
需要的类
User
1 2 3 4 5 6 7
| public class User { private String username; private int age; private Address address;
}
|
Address
1 2 3 4 5 6
| public class Address { private String city; private String street;
}
|
Admin
1 2 3 4 5 6
| public class Admin { private String username; private int age;
}
|
UserList
1 2 3 4 5
| public class UserList { private List<User> users;
}
|
UserMap
1 2 3 4 5
| public class UserMap { private Map<String, User> users;
}
|