将之前入门学习的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. }