将之前入门学习的springMVC粗略总结一下,技术有限,如有错误,望指出。
SpringMVC常见的几种常见的数据绑定
一、数据绑定的方式
1 . 通过注解 @RequestParam 绑定url参数, 如绑定url参数上的age属性:
[java] view plain copy
1. public String baseType(@RequestParam("age") Integer age){
2. return "age: "+age;
3. }
当url上的参数名与形参相同时,如url参数也为 user时,注解后可不特意加 user .如下:
[java] view plain copy
1. public String baseType(@RequestParam User user){
2. return "user: "+ user;
3. }
此处该注意基本类型还是加上具体参数,原因见下注意点。
2. 通过 @PathVariable("courseId")获取 不过需要在Mapping路径下加上/{courseId}
这是用/后加而不是加url参数的方式,如:
[java] view plain copy
1. @RequestMapping("/view2/{courseId}")
2. public String viewCourse2(@PathVariable("courseId") Integer courseId)
3 SpringMVC自动注入
[java] view plain copy
1. @RequestMapping("/user")
2. public String viewCourse2(User user)</span>
当访问/user时,会执行此方法,springMVC 会自动将传递过来的User类型的参数 注入到 user 中。
注意!!在使用SpringMVC绑定基本类型(如String,Integer等)参数时,应通过@RequestParam注解指定具体的参数名称,或者采取第二种方式,这是因为只有在debug模式下编译,其参数名称才存储在编译好的代码中。 否则,当代码在非debug模式下编译后,运行时会引发HandlerMethodInvocationException异常。
二、数据绑定的类型
1. 单个 基本数据类型的绑定
int类型的数据: Int 类型的参数不能为空Integer 却可以。因此如果允许为空时可使用 Integer 绑定int 数据。如
[java] view plain copy
1. public String baseType(@RequestParam("age") Integer age){
2. return "age: "+age;
3. }
2 多个相同数据的绑定
url请求有多个相同,如:http://localhost:8080/courses?courseId=1&courseId=2&courseId=3
用数组接收,此处可用int[] courseId 接收
3 传递一个对象,比如 User { name=”Tom”, age=10} (一个学生对象,传递名字和年龄时)
当url请求为 http://localhost:8080/baseDemo/object?name=%22tom%22&age=12
[java] view plain copy
1. @RequestMapping(value = "/object",method = RequestMethod.GET)
2. @ResponseBody
3. // 传递对象只需要对象的key值,即 User 的name 和 age
4. public String baseType(User user){
5. return user.toString();
6. }
4 绑定参数中对象的下级属性:
比如在User中加入联系信息的类ContactInfo。使得User类为: User{ name ; age ;contactInfo } ContactInfo{ phone; address ;}
想传递User的name,age,以及contactnfo的phone属性,使得
User{name='Tom',age=12, contactInfo=ContactInfo{phone='123', adress='null'}}(Json格式 下同),
可以在url中传递 name=Tom age=12 contactInfo.phone=123,即以
http://localhost:8080/baseDemo/object?name=Tom&age=12&contactInfo.phone=123 传递。
5 拥有同属性的多对象的情况
当有一个 admin { name ; age } 和 User{ name ; age ;contactInfo } 同时拥有name 和age的属性需要进行赋值,使得 User{name=”Tom”;age=16;contactInfo=null} admin{name=”Jerry”; age=16} ,Controller绑定代码如下:(直接让SpringMVC自动注入 User 和A d min 的参数)
[java] view plain copy
1. <span style="font-size:18px;">@RequestMapping(value = "/object_object2",method = RequestMethod.GET)
2. @ResponseBody
3. // 传递对象只需要对象的key值,即 User 的name 和 age
4. public String object_object2(User user,Admin admin){
5. return user.toString() +admin.toString();}
6. </span>
如果直接在 url 使用 name 参数传递:
http://localhost:8080/baseDemo/object_object2?name=Tom 会使得 user 和 Tom 都被注入了相同的 name 值,
结果为: User{ name='Tom', age=0, contactInfo=null } Admin{ name='Tom', age=0}
我们发现, User.name 和 Admin.name 相同,此时,我们可使用@InitBinder 注解先进行加前缀,从而区别两个name分别属于谁。
在Controller加入
[java] view plain copy
1. @InitBinder("admin")
2. public void initAdmin(WebDataBinder binder){
3. "admin.");
4. }
5. @InitBinder("user")
6. public void initUser(WebDataBinder binder){
7. "user.");
8. }
当进入一个Controller时会将含有 @InitBinder 注解的方法进行初始化,再调用对应的请求方法(指定的Controller方法)。此时使用
http://localhost:8080/baseDemo/object_object2?user.name=Tom&admin.name=Jerry&age=16
结果为: User{ name='Tom', age=16, contactInfo=null} Admin{name='Jerry',age=16}
我们发现,我们成功将 User 和 Admin 的 name 都赋值,同时由于 age没有使用
6 List集合的数据绑定。
当传递多个User 时,不可以用 List<User>users为方法参数进行接收。需要间接写一个有List<User> users 属性的类,UserForm。
[java] view plain copy
1. public class UserForm {
2. private List<User> users;
3.
4. public List<User> getUsers() {
5. return users;
6. }
7. public void setUsers(List<User> users) {
8. this.users = users;
9. }
10. @Override
11. public String toString() {
12. return "UserForm{" +
13. "users=" + users +
14. '}';
15. }
16.
17. }
Controller方法用UserForm 进行绑定数据
[java] view plain copy
1. @RequestMapping(value = "/list")
2. @ResponseBody
3. // List的数据绑定
4. public String doList(UserForm userForm){
5. return userForm.toString();
6. }
传递多个User, url形式为 users[0].name=Tom&users[1].name=Jerry
访问 http://localhost:8080/baseDemo/list?users[0].name=Tom&users[1].name=Jerry
返回的UserForm.toString()显示为
UserForm{users=[User{name='Tom', age=0, contactInfo=null},User{name='Jerry', age=0, contactInfo=null}]}
此处应注意,当不对users[]集合按顺序赋值时,比如user[0]和user[5]赋值时,
访问 http://localhost:8080/baseDemo/list?users[0].name=Tom&users[21].name=Jerry
会发现输出为
UserForm{ users=[
User{name='Tom',age=0, contactInfo=null},
User{name='null', age=0, contactInfo=null},
User{name='null', age=0, contactInfo=null},
User{name='null', age=0, contactInfo=null},
User{name='null', age=0, contactInfo=null},
User{name='null', age=0,contactInfo=null},
User{name='Jerry', age=0, contactInfo=null }
] }
会导致List长度为7,有5个属性为Null,造成内存浪费。
7 Set类型的数据绑定
Set 与 List有所不同,对Set进行数据绑定的时候,需要对set进行初始化。
当Set没有初始化,与List按上述方法执行时,会抛出异常,提示Set的size为0。同时,赋值时不能越界。举个例子,同样用使用UserSetForm传递数据,
[java] view plain copy
1. public class UserSetForm {
2. private Set<User> users;
3. public UserSetForm(){
4. new LinkedHashSet<User>();
5. new User());
6. new User());//需要对Set进行初始化
7. }
8.
9. public Set<User> getUsers() {
10. return users;
11. }
12.
13. public void setUsers(Set<User> users) {
14. this.users = users;
15. }
16.
17. @Override
18. public String toString() {
19. return "UserSetForm{" +
20. "users=" + users +
21. '}';
22. }
23. }
当url请求为:
http://localhost:8080/baseDemo/set?users[0].name=Tom&users[1].name=Jerry
输出为
UserSetForm{ users= [
User{name='Tom',age=0, contactInfo=null},
User{name='Jerry', age=0, contactInfo=null}
] }
越界时,如对 users[0].name 和 users[6].name 赋值:
http://localhost:8888/baseDemo/set?users[0].name=Tom&users[6].name=Jerry
抛出异常,” Cannot get element with index 6 from Set of size 2”。即使用Set进行数据绑定时,要进行初始化,同时使用时不能越界。这是与List的区别。
8. Map的数据绑定
同样用建立UserMapForm传递数据,
[java] view plain copy
1. public class UserMapForm {
2. private Map<String,User> users;
3.
4. public Map<String, User> getUsers() {
5. return users;
6. }
7.
8. public void setUsers(Map<String, User> users) {
9. this.users = users;
10. }
11.
12. @Override
13. public String toString() {
14. return "UserMapForm{" +
15. "users=" + users +
16. '}';
17. }
18. }
Controller方法如下:
[java] view plain copy
1. @RequestMapping(value = "/map")
2. @ResponseBody
3. // map的数据绑定
4. public String doMap(UserMapForm userMapForm){
5. return userMapForm.toString();
6. }
url参数形式以users[‘(key)’]索引 的形式进行赋值 如
http://localhost:8080/baseDemo/map?users[‘X’].name=Tom&users[‘Y’].name=Jerry
对 key 为 X 和 key 为 Y 分别赋值value
输出为
UserMapForm{ users={
X=User{name='Tom',age=0, contactInfo=null},
Y=User{name='Jerry', age=0, contactInfo=null}
} }
9. JSon数据绑定 添加@RequestBody 注解。此处就不需多举例了。要注意的是,之前我们举例的方法前加 @ResponseBody 注解是 让返回的数据为JSon格式。而绑定时需要在参数前加此注解。
10. xml的数据绑定。
(1) Controller 添加@RequestBody注解.
(2) 同时对传递对象添加@XmlRootElement(name=”(名称)”) 注解。在其的Getter方法添加@XmlElement(name=”名称(名称)”)的注解。
举个例子,以xml传递一个admin对象,Admin需要写成
[java] view plain copy
1. @XmlRootElement(name ="admin")
2. public class Admin {
3. private String name;
4. private int age;
5.
6. @Override
7. public String toString() {
8. return "Admin{" +
9. "name='" + name + '\'' +
10. ", age=" + age +
11. '}';
12. }
13. @XmlElement(name="name")
14. public String getName() {
15. return name;
16. }
17.
18. public void setName(String name) {
19. this.name = name;
20. }
21. @XmlElement(name="age")
22. public int getAge() {
23. return age;
24. }
25.
26. public void setAge(int age) {
27. this.age = age;
28. }
29. }
Controller方法使用@RequestBody注解
[java] view plain copy
1. @RequestMapping(value = "/xml")
2.
3. // xml的数据绑定
4. public String doXml(@RequestBody Admin admin){
5. return admin.toString();
6. }