SpringMVC 数据绑定

主要介绍SpringMVC 数据绑定的数据绑定,包含数据类型、对象、集合的绑定。

一、基本数据类型的绑定

@RequestMapping("test/int")
@ResponseBody
public String basic(int age) {
    return "age = " + age;
}

浏览器中输入:http://localhost:8080/test/int?age=10

返回:age = 10

注:基本数据类型作为形参,传递的参数必须填写,否则会报错。如http://localhost:8080/test/int

二、包装类型的绑定

@RequestMapping("test/integer")
@ResponseBody
public String basic1(Integer age) {
    return "age = " + age;
}

浏览器中输入:http://localhost:8080/test/integer?age=24

返回:age = 24

注:包装类型是对象,传递的参数可以为空,如http://localhost:8080/test/integer

拓展:接收的参数可以使用@RequestParam定义别名,如

@RequestMapping("test/param")
@ResponseBody
public String basic2(@RequestParam(value = "aa", required = false) Integer age) {
    return "age = " + age;
}

浏览器中输入:http://localhost:8080/test/param?aa=24

返回:age = 24

注:RequestParam注解有三个参数:value(接收的参数名),required(参数是否必填),defaultValue(参数默认值)

三、数据的绑定

@RequestMapping("test/array")
@ResponseBody
public String array(String[] name) {
    String str = "";
    for (String s : name) {
        str += s + " ";
    }
    return str;
}

浏览器中输入:http://localhost:8080/test/array?name=Jane&name=Tom&name=Lily

返回:Jane Tom Lily

四、单个对象的绑定

定义基本对象User,包含 姓名name,年龄age 两个属性,重写toString方法

public class User {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
@RequestMapping("test/user")
@ResponseBody
public String user(User user) {
    return user.toString();
}

浏览器中输入:http://localhost:8080/test/user?name=Jane&age=10

返回:User{name='Jane', age=10}

五、层级对象的绑定

public class Manager {
    private String code;
    private User user;
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    @Override
    public String toString() {
        return "Manager{" +
                "code='" + code + '\'' +
                ", user=" + user +
                '}';
    }
}
@RequestMapping("test/manager")
@ResponseBody
public String manager(Manager manager) {
    return manager.toString();
}

浏览器中输入:http://localhost:8080/test/manager?code=A123&user.name=Jane

返回:Manager{code='A123', user=User{name='Jane', age=0}}

六、多个对象的绑定

新增Admin对象,属性同User对象

@RequestMapping("admin/user")
@ResponseBody
public String basic2(User user, Admin admin) {
    return user.toString() + "\n" + admin.toString();
}

浏览器输入:http://localhost:8080/admin/user?name=Jane&age=10

返回:User{name='Jane', age=10} Admin{name='Jane', age=10}

注:由于两个对象含有相同的属性,这时浏览器中输入的参数值会为两个对象都赋值。这种情况下需要使用@InitBinder注解,为两个参数指定前缀,分别对应不同的对象

@InitBinder("user")
public void initUser(WebDataBinder binder) {
    binder.setFieldDefaultPrefix("user.");
}
@InitBinder("admin")
public void initAdmin(WebDataBinder binder) {
    binder.setFieldDefaultPrefix("admin.");
}

浏览器输入:http://localhost:8080/admin/user?user.name=Jane&user.age=10&admin.age=34

返回:User{name='Jane', age=10} Admin{name='null', age=34}

拓展:InitBinder作用范围 - 当前Controller
可用于类型转换,如页面提交的日期和javaBean中的日期格式的转换,SpringMvc默认不支持这种转换,需要手动自定义数据绑定
@InitBinder
public void initBinder(WebDataBinder binder) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    dateFormat.setLenient(false);
    binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
}

七、List集合的绑定

定义接收对象

public class UserList {
    private List<User> users;
    public List<User> getUsers() {
        return users;
    }
    public void setUsers(List<User> users) {
        this.users = users;
    }
    @Override
    public String toString() {
        return "UserList{" +
                "users=" + users +
                '}';
    }
}
@RequestMapping("test/list")
@ResponseBody
public String list(UserList user) {
    return user.toString();
}

浏览器输入:

http://localhost:8080/test/list?users[0].name=Jane&users[0].age=12&users[1].name=Tom&users[1].age=23

返回:UserList{users=[User{name='Jane', age=12}, User{name='Tom', age=23}]}

注:
- 接收List集合不能直接用形参List<T>接收,SpringMVC不辨识该类型,必须先定义收集类,使用该类来接收对象
- 参数中的前缀必须和收集类中定义的属性名称一样,如示例中的users,不能使用形参中的user
- 如果传参 users[0].name=Jane&users[0].age=12&users[20].name=Tom 则接收到的list长度是21

八、Set集合的绑定

public class UserSet {
    private Set<User> users;
    public Set<User> getUsers() {
        return users;
    }
    public void setUsers(Set<User> users) {
        this.users = users;
    }
    @Override
    public String toString() {
        return "UserSet{" +
                "users=" + users +
                '}';
    }
    public UserSet() {
        users = new HashSet<User>();
        users.add(new User());
    }
}
@RequestMapping("test/set")
@ResponseBody
public String set(UserSet user) {
    return user.toString();
}

浏览器输入:

http://localhost:8080/test/list?users[0].name=Jane&users[0].age=12

返回:UserSet{users=[User{name='Jane', age=12}]}

注: 如果此时输入

http://localhost:8080/test/list?users[0].name=Jane&users[0].age=12&users[1].name=Tom&users[1].age=23,则会报500的错误,因为Set对象初始时,只添加了一个user对象,故接收参数时,如果接收到两个对象,就会失败

总结:Set集合绑定时,必须先初始化Set对象;Set对象的长度在初始化时就固定了,接收的参数数量必须一致

九、Map集合的绑定

public class UserMap {
    private Map<String, User> users;
    public Map<String, User> getUsers() {
        return users;
    }
    public void setUsers(Map<String, User> users) {
        this.users = users;
    }
    @Override
    public String toString() {
        return "UserMap{" +
                "users=" + users +
                '}';
    }
}
@RequestMapping("test/map")
@ResponseBody
public String map(UserMap user) {
    return user.toString();
}

浏览器输入:

http://localhost:8080/test/map?users["x"].name=Jane&users["X"].age=12&users["y"].name=Tom&users["y"].age=23

返回:UserMap{users={x=User{name='Jane', age=12}, y=User{name='Tom', age=23}}}

十、Json 的绑定

pom文件中引入jar包依赖

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.4</version>
</dependency>
@RequestMapping(value = "test/json", method = RequestMethod.POST)
@ResponseBody
public String json(@RequestBody Manager manager) {
    return manager.toString();
}

POST请求地址:http://localhost:8080/test/json

请求报文:{"code":"A123", "user":{"name":"Jane", "age":24}}

返回数据:Manager{code='A123', user=User{name='Jane', age=24}}

十一、Xml 的绑定

pom文件中引入jar包依赖(jar包的版本必须和项目中的Spring版本一样)

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-oxm</artifactId>
    <version>4.0.3.RELEASE</version>
</dependency>
@XmlRootElement(name = "admin")
public class Admin {
    private String name;
    private int age;
    @XmlElement(name = "name")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @XmlElement(name = "age")
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Admin{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
@RequestMapping(value = "test/xml", method = RequestMethod.POST)
@ResponseBody
public String xml(@RequestBody Admin admin) {
    return admin.toString();
}

POST请求地址:http://localhost:8080/test/xml

请求报文:<admin> <name>Jane</name><age>24</age></admin>

返回数据:Admin{name='Jane', age=24}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值