Spring webmvc数据绑定

  使用Spring webmvc开发web项目非常简便,它可以提取了http请求的ParameterRequestBodySessionCookieHeader等信息并将其绑定到Controller中对应的处理方法入参上。并且Spring webmvc为我们提供了丰富的注解来绑定请求信息。

数据绑定注解

  1. @RequestParam:绑定单个请求数据值,可以是URL中的数据,表单提交的数据或上传的文件;
  2. @PathVariable:绑定URL模板变量值;
  3. @RequestBody:绑定请求body中的数据并能进行自动类型转换,不能处理multipart/form-data格式的数据;
  4. @CookieValue:绑定Cookie数据;
  5. @RequestHeader:绑定请求头数据;
  6. @ModelAttribute:绑定数据到Model;
  7. @SessionAttributes:绑定数据到Session;
  8. @RequestPart:绑定multipart/data数据,并可以根据数据类型进行对象转换。

不同数据类型绑定

基本类型&包装类型

  基本类型绑定比较简单,我们只需要在Controller中对应的请求处理方法接受请求参数的入参即可,这里有两点需要注意的:
1. 使用基本类型接受http请求参数,由于基本类型为值类型,不能为null,所以请求参数为必传,如不传系统出报500错误。
2. http请求参数key须和Controller中方法入参对应(key与形参名相同),否则同样会报500错误。

  当然,以上两点是有其他解决方案的,第一点可以使用@RequestParam(required = false)来将参数设为非必须,或者使用包装类型来代替基本类型;第二点我们可以使用@RequestParam(value = "xxx")来指定别名。这里有个小技巧,如果接收参数为boolean类型,可以使用1来表示true,相应0可以表示false

/**
     * 基本类型数据绑定,可接收url param和RequestBody(form-data、x-www-form-urlencoded)数据,参数为必填
     * url: http://localhost/basicType?number=5
     * @param number
     * @return
     */
    @RequestMapping("basicType1")
    public String basicType(int number) {
        return "number:" + number;
    }

    /**
     * 基本类型数据绑定,可接收url param和RequestBody(form-data、x-www-form-urlencoded)数据,参数为必填
     * url: http://localhost/basicType2?discount=true
     * url: http://localhost/basicType2?discount=1
     * @param discount
     * @return
     */
    @RequestMapping("basicType2")
    public String basicType(boolean discount) {
        return "discount:" + discount;
    }


    /**
     * 包装类型数据绑定,可接收url param和RequestBody(form-data、x-www-form-urlencoded)数据,参数为非必填
     * url: http://localhost/packType?num=4
     * @param number
     * @return
     */
    @RequestMapping("packType")
    private String packType(@RequestParam(value = "num", required = false) Integer number) {
        return "number: " + number;
    }

对象绑定&多层级对象

  对象绑定一般来用接收RequestBody数据数据,当然也可以接收url param,处理器接收请求数据时会使用相应的HttpMessageConverter进行解析,然后将解析后的数据绑定到要返回的对象上。这里需要注意的是请求中的key需要与接收对象的属性名一致。

/**
     * 对象绑定,可接收url param和RequestBody(form-data、x-www-form-urlencoded)数据
     * url: http://localhost/spec1?color=白色&size=170
     * @param spec
     * @return
     */
    @RequestMapping("spec1")
    public String addSpec1(Spec spec) {
        return spec.toString();
    }

    /**
     * 对象绑定,只能接收RequestBody(raw)数据
     * json: {"color":"蓝色","size":175}
     * @param spec
     * @return
     */
    @RequestMapping("spec2")
    public String addSpec2(@RequestBody Spec spec) {
        return spec.toString();
    }

  多层级对象是建立在对象绑定之上的,需要注意的是绑定参数中对象的下级对象时,下级对象请求key需要加上.下级对象的属性名。如:spec.color=蓝色

    /**
     * 多层级对象绑定,可接收url param和RequestBody(form-data、x-www-form-urlencoded)数据
     * url: http://localhost/goods1?name=上衣&price=98.9&stock=998&discount=false&spec.color=白色&spec.size=175
     * @param spec
     * @return
     */
    @RequestMapping("goods1")
    public String addGoods1(Goods goods) {
        return goods.toString();
    }

    /**
     * 多层级对象绑定,只能接收RequestBody(raw)数据
     * json: {"name":"牛仔裤","price":158,"stock":200,"discount":true,"spec":{"color":"蓝色","size":31}}
     * @param spec
     * @return
     */
    @RequestMapping("goods2")
    public String addGoods2(@RequestBody Goods goods) {
        return goods.toString();
    }

数组的数据绑定

  数组绑定用于绑定请求中有一个多个相同的key时,在方法中使用数组的形式接收。如果url与requestBody存在同个key时,也可以数组接收,spring先会处理url中的值,然后再处理requestBody中的值。

/**
     * 数组绑定
     * url: http://localhost/array?name=aaa&name=bbb
     */
    @RequestMapping("array")
    public String array1(String[] name) {
        String nameStr = "";
        for (String n : name) {
            nameStr += n + "\n";
        }
        return nameStr;
    }

Map的数据绑定

  绑定Map数据也有两种方式,一种是不使用注解(可绑定url param和RequestBody(form-data、x-www-form-urlencoded),另一种是使用@RequestBody注解(只能绑定RequestBody(raw)数据)。由于Spring mvc在绑定数据时会反射调用参数的set方法,这里我们需要建一个类做为数据收集对象来存储绑定的map对象。

/**
     * Map绑定,可接收url param和RequestBody(form-data、x-www-form-urlencoded)数据
     * http://localhost/map1?map['nike'].name=耐克&map['nike'].price=899&map['adidas'].name=阿迪达斯&map['adidas'].price=998
     */
    @RequestMapping("map1")
    public String map1(GoodsMap goodsMap) {
        String mapStr = "";
        Map map = goodsMap.getMap();
        for (Map.Entry entry : map.entrySet()) {
            mapStr += entry.getKey() + ":" + entry.getValue() + "\n";
            ;
        }
        return mapStr;
    }

    /**
     * Map绑定,只能接收RequestBody(raw)数据
     * url: http://localhost/map2
     * json: {"map":{"adidas":{"name":"衣服","price":98},"nike":{"name":"裤子","price":89}}}
     */
    @RequestMapping("map2")
    public String map2(@RequestBody GoodsMap goodsMap) {
        String mapStr = "";
        Map map = goodsMap.getMap();
        for (Map.Entry entry : map.entrySet()) {
            mapStr += entry.getKey() + ":" + entry.getValue() + "\n";
            ;
        }
        return mapStr;
    }

List的数据绑定

  list和map相同,也需要加数据收集对象来存储绑定的list对象。同样也针对不同请求有两种不同的处理方式。

/**
     * list绑定,可接收url param和RequestBody(form-data、x-www-form-urlencoded)数据
     * url: http://localhost/list1
     */
    @RequestMapping("list1")
    public String list1(GoodsList goodsList) {
        String listStr = "";
        for (Goods goods : goodsList.getList()) {
            listStr += goods.toString() + "\n";
        }
        System.out.println(JSONObject.toJSON(goodsList));
        return listStr;
    }

    /**
     * list绑定,只能接收RequestBody(raw)数据
     * url: http://localhost/list2
     * json: {"list":[{"name":"衣服","price":100},{"name":"裤子","price":98}]}
     */
    @RequestMapping("list2")
    public String list2(@RequestBody GoodsList goodsList) {
        String listStr = "";
        for (Goods goods : goodsList.getList()) {
            listStr += goods.toString() + "\n";
        }
        return listStr;
    }

示例代码地址:https://git.oschina.net/Leeafei/springboot-study

你可能感兴趣的:(spring-boot,spring)