第六节:@PathVariable @RequestRaram @RequestBody

在一章中,我们使用了@PathVariable获取了pathInfo中的变量,使用@RequestBody获取到了post过来json数据。除了上述两种方法外,来有一种获取输入变量的注解@RequestRaram

本节中,让我们结合班级管理,同时通过三个测试代码段,来更深一步的对其进行学习。

首先,我们参考类图及时序图新建控制器。

/SpringMVC/assets/image/chapter3/18.png

新建控制器

新建控制器,并引用日志类org.slf4j.Logger

package com.mengyunzhi.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * Created by panjie on 17/4/13.
 */
@RestController
@RequestMapping("/klass")
public class KlassController {
    // 引入日志类的固有写法
    private final static Logger logger = LoggerFactory.getLogger(KlassController.class);
}

然后,我们分别进行测试:

@PathVariable

    @RequestMapping("/test/{value}")
    public void test(
            @PathVariable String value,) {
        logger.info("获取到的pathVariable为:" + value);
    }

测试:

/SpringMVC/assets/image/chapter3/3.gif

@RequestParam

    @RequestMapping("/test/{value}")
    public void test(
            @PathVariable String value,
            @RequestParam String param) {
        logger.info("获取到的pathVariable为:" + value);
        logger.info("获取到的requestParam为:" + param);

    }

测试:

/SpringMVC/assets/image/chapter3/4.gif

@RequestBody

相对前面两个注解,@Requestbody比较灵活。

1.直接转化为字符串

    @RequestMapping("/test/{value}")
    public void test(
            @PathVariable String value,
            @RequestParam String param,
            @RequestBody(required = false) String requestBody) {
        logger.info("获取到的pathVariable为:" + value);
        logger.info("获取到的requestParam为:" + param);
        logger.info("获取到的RequestBody为:" + requestBody);
    }

required = false表示,此项非必须。 分别点一下这些标签卡,然后随便加一些信息,最后点击code查看postman为我们自动生成的数据提交代码,看看最终我们在控制台都打印出了什么内容。

2.转化为MultiValueMap

下面,为了更清晰的查看的@RequestBody绑定行为,我们去掉获取@PathVariable@RequestParam的代码,并我们对代码进行如下改写:

    @RequestMapping("/test/")
    public void test(@RequestBody MultiValueMap<String, String> requestBody) {
        logger.info("获取到的RequestBody为:" + requestBody.toString());
    }

自己测试一下吧,看看在控制台中,都打印了什么信息。

3.绑定(转化为)到对象

package com.mengyunzhi.controller;

import com.mengyunzhi.service.KlassService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;

import com.mengyunzhi.repository.Klass;

/**
 * Created by panjie on 17/4/13.
 */
@RestController
@RequestMapping("/klass")
public class KlassController {
    private final static Logger logger = LoggerFactory.getLogger(KlassController.class);

    @Autowired
    private KlassService klassService;

    @RequestMapping("/test/")
    public void test(@RequestBody JsonInput jsonInput) {
        logger.info("获取到的RequestBody为:" + jsonInput.toString());
    }

    private static class JsonInput {
        private String name;
        private String sex;

        public String getName() {
            return name;
        }

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

        public String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
        }

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

        public JsonInput() {
        }

        public JsonInput(String name, String sex) {
            this.name = name;
            this.sex = sex;
        }
    }
}

/SpringMVC/assets/image/chapter3/28.png

上面的代码中,我们建立了一个私有对象,并使用@RequestBody将传入的Json数据绑定到了这个私有对象上,最终成功的在控制台将其打印了出来。

总结:

@PathVariable 接收pathInfo中的变量
@RequestParam 接收get和post信息,当两者都存在同一变时,进行字符串拼接。
@RequestBody 形式多样,但做API,我们主要接收Content-Typeapplication/jsonjson信息。

参考文档:

@PathVariable 官方文档
@RequestParam 官方文档
@RequestBody 官方文档
MultiValueMap http://blog.csdn.net/yanzhenjie1003/article/details/51550264

最终测试代码:

package com.mengyunzhi.controller;

import com.mengyunzhi.service.KlassService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.*;


/**
 * Created by panjie on 17/4/13.
 */
@RestController
@RequestMapping("/klass")
public class KlassController {
    private final static Logger logger = LoggerFactory.getLogger(KlassController.class);

    @Autowired
    private KlassService klassService;

    @RequestMapping("/test/")
    public void test(@RequestBody JsonInput jsonInput) {
        logger.info("获取到的RequestBody为:" + jsonInput.toString());
    }

    private static class JsonInput {

        private String name;
        private String sex;

        public String getName() {
            return name;
        }

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

        public String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
        }

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

        public JsonInput() {
        }

        public JsonInput(String name, String sex) {
            this.name = name;
            this.sex = sex;
        }
    }
}