zoukankan      html  css  js  c++  java
  • @PathVariable @RequestParam @RequestBody等参数绑定注解详解

    一、分类

    handler method 参数绑定常用的注解,我们根据他们处理的Request的内容不同分为四类:

    • 处理request uri 部分的注解:   @PathVariable;(这里指uri template中variable,不含queryString部分)
    • 处理request header部分的注解:   @RequestHeader, @CookieValue;
    • 处理request body部分的注解:@RequestParam,  @RequestBody;
    • 处理attribute类型是注解: @SessionAttributes, @ModelAttribute;

    二、主要注解详解

    1、@PathVariable

    当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上。

    下面代码把URI template 中变量 ownerId的值和petId的值,绑定到方法的参数上。

    @Controller
    @RequestMapping("/owners/{ownerId}")
    public class RelativePathUriTemplateController {
    
      @RequestMapping("/pets/{petId}")
      public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {    
        // implementation omitted
      }
    }

    2、@RequestParam

      用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)

    • RequestParam可以接受简单类型的属性,也可以接受对象类型。常用来处理简单类型的绑定。
    • 提交方式为:GET、POST;
    • 该注解有两个属性: value、required; value用来指定要传入值的id名称,required用来指示参数是否必须绑定;
    @Controller
    @RequestMapping("/pets")
    @SessionAttributes("pet")
    public class EditPetForm {
    
        // ...
    
        @RequestMapping(method = RequestMethod.GET)
        public String setupForm(@RequestParam("petId") int petId, ModelMap model) {
            Pet pet = this.clinic.loadPet(petId);
            model.addAttribute("pet", pet);
            return "petForm";
        }
    
        // ...

    3、@RequestBody

      该注解常用来处理Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;
    它是通过使用HandlerAdapter 配置的HttpMessageConverters来解析post data body,然后绑定到相应的bean上的。
    因为配置有FormHttpMessageConverter,所以也可以用来处理 application/x-www-form-urlencoded的内容,处理完的结果放在一个MultiValueMap<String, String>里,这种情况在某些特殊需求下使用,详情查看FormHttpMessageConverter api;

    @RequestMapping(value = "/something", method = RequestMethod.PUT)
    public void handle(@RequestBody String body, Writer writer) throws IOException {
      writer.write(body);
    }

    4、@RequestParam,@RequestBody小结

    • 在GET请求中,不能使用@RequestBody。
    • 在POST请求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,对于参数转化的配置必须统一。

    举个例子,在SpringMVC配置了HttpMessageConverters处理栈中,指定json转化的格式,如Date转成‘yyyy-MM-dd’,则参数接收对象包含的字段如果是Date类型,就只能让客户端传递年月日的格式,不能传时分秒。因为不同的接口,它的参数可能对时间参数有不同的格式要求,所以这样做会让客户端调用同事对参数的格式有点困惑,所以说扩展性不高。
    如果使用@RequestParam来接受参数,可以在接受参数的model中设置@DateFormat指定所需要接受时间参数的格式。
    另外,使用@RequestBody接受的参数是不会被Servlet转化统一放在request对象的Param参数集中,@RequestParam是可以的。

    综上所述,一般情况下,推荐使用@RequestParam注解来接受Http请求参数。

    参考文献:

    (1)https://blog.csdn.net/walkerjong/article/details/7946109#

    (2)https://www.cnblogs.com/guoyinli/p/7056146.html

  • 相关阅读:
    webpack4.x相关笔记整理
    vue原理探索--响应式系统
    git常用命令备忘
    小程序开发知识点及坑点总结
    无异常日志,就不能排查问题了???
    【从单体架构到分布式架构】(三)请求增多,单点变集群(2):Nginx
    【从单体架构到分布式架构】(二)请求增多,单点变集群(1):负载均衡
    【从单体架构到分布式架构】(一)万丈高楼平地起:环境准备
    一个接口查询关联了十几张表,响应速度太慢?那就提前把它们整合到一起
    docker基础:容器操作命令
  • 原文地址:https://www.cnblogs.com/gavincoder/p/9040178.html
Copyright © 2011-2022 走看看