@RequestBody,@RequestParam和@Param的区别

本文深入探讨了MyBatis框架中的@Param注解如何简化XML配置,实现参数命名,确保正确传入SQL语句。同时,详细介绍了SpringMVC中的@RequestBody与@RequestParam注解,分别用于处理JSON内容和默认的表单编码数据,阐述了它们在RESTful API设计中的应用。

@Param

@Param是mybatis中的注解,用注解来简化xml配置的时候,@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中 。请看下面的示例:

public interface Mapper { 
   
@Select("select s_id id,s_name name,class_id classid from student where  s_name= #{aaaa} and class_id = #{bbbb}") 
    public Student select(@Param("aaaa") String name,@Param("bbbb")int class_id);  
   
@Delete...... 
       
@Insert...... 
    
} 

@RequestBody

  1. @requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。
  2. 通过@requestBody可以将请求体中的JSON字符串绑定到相应的bean上,当然,也可以将其分别绑定到对应的字符串上。
        例如说以下情况:
        
           $.ajax({
            url:"/login",
            type:"POST",
            data:'{"userName":"admin","pwd","admin123"}',
            content-type:"application/json charset=utf-8",
            success:function(data){
              alert("request success ! ");
            }
        });
    
    
    
        @requestMapping("/login")
        public void login(@requestBody String userName,@requestBody String pwd){
          System.out.println(userName+" :"+pwd);
        }

        这种情况是将JSON字符串中的两个变量的值分别赋予了两个字符串,但是呢假如我有一个User类,拥有如下字段:
          String userName;
          String pwd;
        那么上述参数可以改为以下形式:@requestBody User user 这种形式会将JSON字符串中的值赋予user中对应的属性上
        需要注意的是,JSON字符串中的key必须对应user中的属性名,否则是请求不过去的。 
  3. 处理HttpEntity传递过来的数据,一般用来处理非Content-Type: application/x-www-form-urlencoded编码格式的数据。
  •       GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。
  •       POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用              HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。

@RequestParam

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

RequestParam可以接受简单类型的属性,也可以接受对象类型。 
 实质是将Request.getParameter() 中的Key-Value参数Map利用Spring的转化机制ConversionService配置,转化成参数接收对象或字段。

在Content-Type: application/x-www-form-urlencoded的请求中, 
get 方式中queryString的值,和post方式中 body data的值都会被Servlet接受到并转化到Request.getParameter()参数集中,所以@RequestParam可以获取的到。

### Spring框架中@RequestBody@RequestParam注解的区别 在Spring框架中,`@RequestBody` `@RequestParam` 是两个常用的注解,用于处理HTTP请求中的数据。它们的主要区别在于数据来源、适用场景以及使用方式。 #### 1. 数据来源 - **`@RequestParam`**:用于从请求的查询参数(Query Parameter)或表单数据(Form Data)中获取参数值。它通常适用于`application/x-www-form-urlencoded`内容类型的数据[^2]。 - **`@RequestBody`**:用于读取HTTP请求体中的JSON或其他格式的数据,并将其绑定到Java对象上。它通常适用于`application/json`内容类型的数据[^3]。 #### 2. 适用场景 - **`@RequestParam`**: - 适合处理简单的键值对形式的参数,例如通过GET请求传递的查询参数或POST请求中的表单数据。 - 示例:当需要传递少量参数时,如分页查询中的`page``size`参数[^4]。 - **`@RequestBody`**: - 适合处理复杂的JSON对象,尤其是当需要将整个对象作为请求体发送时。 - 示例:当客户端发送一个包含多个字段的JSON对象时,可以使用`@RequestBody`直接映射到Java对象[^1]。 #### 3. 使用方式 - **`@RequestParam`**: ```java @GetMapping("/example") public String example(@RequestParam("paramName") String paramValue) { return "Parameter Value: " + paramValue; } ``` 在上述代码中,`paramName`是从请求的查询参数中获取的。 - **`@RequestBody`**: ```java @PostMapping("/example") public String example(@RequestBody MyObject myObject) { return "Received Object: " + myObject.toString(); } ``` 在上述代码中,`MyObject`是一个Java类,表示从请求体中解析出的JSON对象。 #### 4. 内容类型支持 - **`@RequestParam`**:主要支持`application/x-www-form-urlencoded``multipart/form-data`内容类型[^4]。 - **`@RequestBody`**:主要用于处理`application/json`、`application/xml`等复杂数据格式的内容类型。 #### 5. 默认值与可选性 - **`@RequestParam`**:可以通过设置`required=false`来指定参数是否为必填项,并通过`defaultValue`属性设置默认值[^2]。 - **`@RequestBody`**:不支持直接设置默认值,但可以通过编写自定义逻辑来处理空值情况[^4]。 ### 总结 `@RequestParam` 主要用于处理简单的键值对参数,而 `@RequestBody` 则用于处理复杂的JSON对象或其他格式的请求体数据。选择哪个注解取决于具体的应用场景数据格式。 ```java // 示例代码:使用@RequestParam @GetMapping("/greet") public String greet(@RequestParam(value = "name", required = false, defaultValue = "World") String name) { return "Hello, " + name; } // 示例代码:使用@RequestBody @PostMapping("/user") public User createUser(@RequestBody User user) { return userService.save(user); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值