springMVC数据绑定

SpringMVC数据绑定

数据绑定是将控件属性绑定到一个对象属性上的方法。

基础知识

1.分为三种类型:基本类型(int),包装类型(integer),数组。
基本类型的key是必须传的,只能是int类型的。
包装类型的key可以不传,integer可以为空的。

integer类型可以为空。
在这里插入图片描述
int不能为空
@RequestParam注解可以配置是否需要为空@RequestParam详解。
@RequestMapping注解详解。
@ResponseBody说明方法返回值放在Body数据区中。

1.基本类型处理

//todo     http://localhost:8080/baseType.do?age=10
//todo 500 http://localhost:8080/baseType.do
//todo 400 http://localhost:8080/baseType.do?age=abc
@RequestMapping(value = "baseType.do")
@ResponseBody
public String baseType(int age){
    return "age:"+age;
}

2.包装类处理

//todo     http://localhost:8080/baseType2.do?age=10
//todo     http://localhost:8080/baseType2.do
//todo 400 http://localhost:8080/baseType2.do?age=abc
@RequestMapping(value = "baseType2.do")
@ResponseBody
public String baseType2(Integer age){
    return "age:"+age;
}

3.数组类处理

   //todo http://localhost:8080/array.do?name=Tom&name=Lucy&name=Jim   
   
    @RequestMapping(value = "array.do")
    @ResponseBody
    public String array(String[] name){
        StringBuilder sbf = new StringBuilder();
        for(String item : name){
            sbf.append(item).append(" ");
        }
        return sbf.toString();
    }

3.简单对象与多层级对象及同属性多对象

@InitBinder注解解决同属性多对象问题

//todo http://localhost:8080/object.do?name=Tom&age=10 简单对象
//TODO http://localhost:8080/object.do?name=Tom&age=10&contactInfo.phone=10086 多层级对象
//TODO http://localhost:8080/object.do?user.name=Tom&admin.name=Lucy&age=10 同属性多对象
@RequestMapping(value = "object.do")
@ResponseBody
public String object(User user,Admin admin){
    return user.toString()+" "+admin.toString();
}

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

4.List类处理

//TODO http://localhost:8080/list.do?users[0].name=Tom&users[1].name=Lucy
//TODO http://localhost:8080/list.do?users[0].name=Tom&users[1].name=Lucy&users[20].name=Jim
@RequestMapping(value = "list.do")
@ResponseBody
public String list(UserListForm userListForm){
    return "listSize:"+userListForm.getUsers().size() + "  " + userListForm.toString();
}

5.set类处理

//TODO http://localhost:8080/set.do?users[0].name=Tom&users[20].name=Lucy
@RequestMapping(value = "set.do")
@ResponseBody
public String set(UserSetForm userSetForm){
    return userSetForm.toString();
}

UserSetForm代码如下:

    public class UserSetForm {
      private Set<User> users;

    private 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 +
                '}';
    }
}

注意set的数据绑定需要重写equals()方法和hashcode()方法来实现重复判断逻辑。虽然user.add()有两个,但是如果key重复,也会自去除一个,如下面的图片所示:
在这里插入图片描述

6.map类处理

//TODO http://localhost:8080/map.do?users['X'].name=Tom&users['X'].age=10&users['Y'].name=Lucy
@RequestMapping(value = "map.do")
@ResponseBody
public String map(UserMapForm userMapForm){
    return userMapForm.toString();
}

7.json数据绑定

//    {
//        "name": "Jim",
//            "age": 16,
//            "contactInfo": {
//                "address": "beijing",
//                "phone": "10010"
//              }
//    }
    //application/json
    @RequestMapping(value = "json.do")
    @ResponseBody
    public String json(@RequestBody User user){
        return user.toString();
    }

8.xml数据绑定

//    <?xml version="1.0" encoding="UTF-8" ?>
//    <admin>
//      <name>Jim</name>
//      <age>16</age>
//    </admin>
    //application/xml
    @RequestMapping(value = "xml.do")
    @ResponseBody
    public String xml(@RequestBody Admin admin){
        return admin.toString();
    }
    //下面是Admin类的实现
@XmlRootElement(name="admin")
public class Admin {
    private String name;
    private Integer age;

    @XmlElement(name="name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlElement(name="age")
    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Admin{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

9.自定义的类型转化器

——PropertyEditor(这是一个接口)一般不直接实现这个接口,而是通过继承PropertyEditorSupport来扩展的。如下图所示,函数能将逗号前后的内容分别赋值给u.name和u.age。

public class MyPropertyEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        User u = new User();
        String[] textArray = text.split(",");
        u.setName(textArray[0]);
        u.setAge(Integer.parseInt(textArray[1]));
        this.setValue(u);
    }

    public static void main(String[] args) {
        MyPropertyEditor editor = new MyPropertyEditor();
        editor.setAsText("tom,22");
        System.out.println(editor.getValue());
    }
}

——Formatter(格式化器,也是一个接口)比如说拥有货币转换等的接口
——Converter<source,target>(一个接口,不可扩展)
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值