美文网首页
SpringMVC-参数绑定(一)

SpringMVC-参数绑定(一)

作者: 张明学 | 来源:发表于2020-04-12 20:49 被阅读0次

    本文主要介绍SpringMVC中@PathVariable、@RequestParam、@RequestBody、@RequestHeader、@CookieValue的用法

    @PathVariable


    @PathVariable可以用来接收:Get,Post,Put,Delete等请求URL中的参数,如:
    @RequestMapping(value = "/test1/{name}/{id}")

    @ResponseBody
    public String demoPathVariable(@PathVariable String name, @PathVariable Long id) {
         logger.debug("name={}", name);
         logger.debug("id={}", id);
         return "SUCCESS";
    }
    

    以上方式可以响应:URL:http://127.0.0.1:8080/demo/test1/zmx/123 获取结果:name=zmx,id=123

    @RequestParam


    @RequestParam用来接收通过HttpServletRequest.getParameter()获取的参数,这包括以下情况:

    • 以任何请求方式,在URL中传送的参数
    • 以application/x-www-form-urlencoded或multipart/form-data请求中HTTP请求体中的参数
    @RequestMapping(value = "/test2")
    @ResponseBody
    public String demoRequestParam(@RequestParam("name") String name) {
         logger.debug("name={}", name);
         return "name=" + name;
    }
    

    以上代码可以响应:

    1. (GET,POST,PUT,DELETE等)http://127.0.0.1:8080/demo/test2?name=zmx
    2. (POST请求,Content-Type: multipart/form-data或application/x-www-form-urlencoded)http://127.0.0.1:8080/demo/test2
      注意:POST请求Content-Type不是multipart/form-dat或application/x-www-form-urlencoded是接收不到的

    @RequestBody


    @RequestBody用来接收Content-Type=application/json的请求体中的参数

    @RequestMapping(value = "/test3")
    @ResponseBody
    public String demoRequestBody(@RequestBody Map argParamMap) {
         logger.debug(JSON.toJSONString(argParamMap));
         return JSON.toJSONString(argParamMap);
    }
    

    以上代码可以响应以下http报文:

    POST /demo/test3 HTTP/1.1
    Content-Type: application/json
    User-Agent: PostmanRuntime/7.24.0
    Accept: */*
    Cache-Control: no-cache
    Postman-Token: d14c2160-f7e2-4fc2-9365-86a8140c0927
    Host: 127.0.0.1:8080
    Accept-Encoding: gzip, deflate, br
    Connection: keep-alive
    Content-Length: 23
    {"name":"zmx","age":20}
    HTTP/1.1 200 OK
    Content-Type: text/plain;charset=UTF-8
    Content-Length: 30
    Date: Sun, 12 Apr 2020 12:43:34 GMT
    结果={"name":"zmx","age":20}
    

    注意上面的Content-Type:application/json。RequestBody是不支持Content-Type为application/x-www-form-urlencoded或multipart/form-data的,但是经过本人简单测试发现application/xml也不支持,后面待补充原因

    @RequestHeader


    @RequestHeader用来获取Header信息

    @CookieValue


    @CookieValue 可以获取Request Header中关于cookie的值

    直接用Controller的形参接收参数


    直接用Controller的形参接收参数即为Controller的方法名上没有添加以上任何一个注解如:public String test6(String name, Integer age, String remark)。这种等价于@RequestParam直接从HttpServletRequest.getParameter()获取的参数。

    1. 可以直接获取任何方式请求中URL参数(URL没有对应的参数获取空值),如:http://127.0.0.1:8080/demo/test6?name=张三&age=18
    2. 可以直接获取以application/x-www-form-urlencoded或multipart/form-data请求中HTTP请求体中的参数
    @RequestMapping(value = "/test6")
    public String test6(String name, Integer age, String remark) {
          logger.debug("remark={}", remark);
          return name + "_" + age;
    }
    

    总结:直接用Controller的形参接收参数等价于直接从HttpServletRequest.getParameter()获取的参数。在java中,反射的调用对于方法参数的赋值是根据参数数组的顺序进行赋值的,而在JDK1.8之前的反射调用是无法获取到形参的名称的,只能得到arg0,arg1,argx 之类的名称,那么想要在没有配置参数信息的情况下,获取到形参与请求参数之前的对应关系,势必需要进行一次解析。如果是低于JDK1.8的版本,在springmvc中是通过ASM框架对于class文件进行解析.在JDK1.8之后 Java支持通过在javac生产class文件过程中添加额外的命令行参数-parameters,便可以通过之前反射获取参数的方式获取到方法形参的参数名.

    相关文章

      网友评论

          本文标题:SpringMVC-参数绑定(一)

          本文链接:https://www.haomeiwen.com/subject/bazbmhtx.html