springMVC入门总结(二)数据绑定

来源:互联网 发布:被网络监控 编辑:程序博客网 时间:2024/06/05 18:57


将之前入门学习的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.     binder.setFieldDefaultPrefix("admin.");  
  4. }  
  5. @InitBinder("user")  
  6. public void  initUser(WebDataBinder binder){  
  7.     binder.setFieldDefaultPrefix("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.         users = new LinkedHashSet<User>();  
  5.         users.add(new User());  
  6.         users.add(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. }  



0 0
原创粉丝点击