简介
数据绑定是指将界面上的属性绑定到一个对象的某个实例上的某个属性。
1、简单数据
如果是简单数据,可以使用基本类型或是包装类型进行绑定,如果使用基本类型比如int,则说明这里的key是必须传的,如果不传入数据或传入的数据不是数字,则会报错
因此对于可能为空的数据,需要使用包装类型。当然在实际应用中可以通过@RequestParam对是否必须进行配置,设置为@RequestParam(required=“false”),听说用了之后就不会报错?但是这玩意儿事实上我在使用的时候,如果是包装类型那么就算不用也没事,如果是基本类型那用了也没用…
基本类型
URL传参:http://localhost:8090/baseType.do?age=10
//TO DO http://localhost:8090/baseType.do?age=10
@RequestMapping(value="baseType.do")
public String baseType(int age){
return "age:"+age;
}
基本类型 使用@RequestParam
设置别名xage
URL传参:http://localhost:8090/baseType2.do?xage=10
//TO DO http://localhost:8090/baseType2.do?xage=10
@RequestMapping("baseType2.do")
public String baseType2(@RequestParam("xage") int age){
return "age:"+age;
}
基本类型 尝试设置required=false 但似乎不带参数还是会出错
URL传参:http://localhost:8090/baseType3.do?age=10
//TO DO http://localhost:8090/baseType3.do?age=10
@RequestMapping(value="baseType3.do")
public String baseType3(@RequestParam(required=false) int age){
return "age:"+age;
}
使用包装类型【推荐】,参数可以为空
URL传参:http://localhost:8090/baseType4.do
//TO DO http://localhost:8090/baseType4.do
@RequestMapping(value="baseType4.do")
public String baseType4(Integer age){
return "age:"+age;
}
设置在不传参时的默认值,参数可以为空
URL传参:http://localhost:8090/baseType5.do
//TO DO http://localhost:8090/baseType5.do
@RequestMapping(value="baseType5.do")
public String baseType5(@RequestParam(defaultValue = "0") int age){
return "age:"+age;
}
2、数组
URL传参:http://localhost:8090/array.do?name=yogi&name=susan&name=grey
//数组
//TO DO http://localhost:8090/array.do?name=yogi&name=susan&name=grey
@RequestMapping(value="array.do")
public String nameArray(String[] name){
StringBuilder sb = new StringBuilder();
for(String s:name){
sb.append(s).append(" ");
}
return sb.toString();
}
3、简单对象
新建简单对象User类,以下代码省略getter和setter函数和toString函数。
public class User {
private String name;
private Integer age;
}
URL传参:http://localhost:8090/object.do?name=Tom&age=10
//简单对象
//TO DO http://localhost:8090/object.do?name=Tom&age=10
@RequestMapping("object.do")
public String object(User user){
return user.toString();
}
4、多级对象
新建另一个对象ContactInfo,存储联系信息,依旧省略getters、setters以及toString。
public class ContactInfo {
private String phone;
private String address;
}
并在User中添加contactInfo属性
public class User {
private String name;
private Integer age;
ContactInfo contactInfo;
}
URL传参:http://localhost:8090/object2.do?name=Tom&age=10&contactInfo.phone=122
//多级对象,这里尽管改了User,但是改了之后上面那样也是没问题的
//http://localhost:8090/object2.do?name=Tom&age=10&contactInfo.phone=122
@RequestMapping("object2.do")
public String object2(User user){
return user.toString();
}
5、同属性对象
新增一个Admin类,和User类具有部分同属性。
public class Admin {
private String name;
private Integer age;
}
URL传参:http://localhost:8090/object3.do?name=Tom&age=10
此时传的name和age会默认给两个类都赋上值。
//http://localhost:8090/object3.do?name=Tom&age=10
@RequestMapping("object3.do")
public String object3(User user, Admin admin){
return user.toString()+" "+admin.toString();
}
添加如下方法避免被共同赋值,会先初始化InitBinder再进入controller
URL传参:http://localhost:8090/object3.do?user.name=Tom&admin.name=Jerry&age=10
此时age为共同赋值,name就是单独的
如果不定义如下方法在上面这样时使用user.name和admin.name传参则接收不到值,name值为null
//使用如下方法避免被共同赋值,此时age为共同赋值,name就是单独的
//http://localhost:8090/object3.do?user.name=Tom&admin.name=Jerry&age=10
@RequestMapping("object3.do")
public String object3(User user, Admin admin){
return user.toString()+" "+admin.toString();
}
@InitBinder("admin")
public void initAdmin(WebDataBinder binder){
binder.setFieldDefaultPrefix("admin.");
}
@InitBinder("user")
public void initUser(WebDataBinder binder){
binder.setFieldDefaultPrefix("user.");
}
6、集合对象
①list对象
【错误】的写法:
//这么做是错误的 需要自己写一个对象
@RequestMapping("list.do")
public String list(List<User> userList){
return userList.toString();
}
【正确】的做法,编写UserListForm类,省略getter、setter和toString方法
public class UserListForm {
List<User> users;
}
使用UserListForm作为方法的参数
URL传参:http://localhost:8090/list2.do?users%5B0%5D.name=Tom&users%5B1%5D.name=Jerry
注意这里使用%5B代替[,%5D代替] 不然会报Invalid character found in the request target
//使用对象UserListForm
//http://localhost:8090/list2.do?users%5B0%5D.name=Tom&users%5B1%5D.name=Jerry
@RequestMapping("list2.do")
public String list2(UserListForm userListForm){
return userListForm.toString();
}
②Set
有关Set的部分和憨批似的,能不用就不用。首先是必须在UserSetForm中有对users的初始化,直接users = new LinkedHashSet(2)是不行的,会500,必须手动添加两个,详见UserSetForm类.
然后吧Set是用来做什么的?用来去重,但是一旦在User类中重写了hashcode and equals,当判定两个对象重复时,它会认为里面只有一个东西,一旦访问下标[1]就又开始500
UserSetForm类
package com.example.test.object;
import java.util.LinkedHashSet;
import java.util.Set;
public class UserSetForm {
private Set<User> users;
UserSetForm(){
users = new LinkedHashSet<User>();
users.add(new User());
users.add(new User());
}
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
@Override
public String toString() {
return "UserSetForm{" +
"users=" + users +
'}';
}
}
URL传参:http://localhost:8090/set.do?users%5B0%5D.name=Tom&users%5B1%5D.name=Tom
//http://localhost:8090/set.do?users%5B0%5D.name=Tom&users%5B1%5D.name=Tom
@RequestMapping("set.do")
public String set(UserSetForm userSetForm){
return userSetForm.toString();
}
③Map
public class UserMapForm {
private Map<Integer,User> users;
}
URL传参:http://localhost:8090/map.do?users%5B0%5D.name=Tom&users%5B1%5D.name=Jerry
//http://localhost:8090/map.do?users%5B0%5D.name=Tom&users%5B1%5D.name=Jerry
@RequestMapping("map.do")
public String map(UserMapForm userMapForm){
return userMapForm.toString();
}
7、json
//需要使用工具传参
@RequestMapping("json.do")
public String json(@RequestBody User user){
return user.toString();
}