@RequestBody,@RequestParam和@Param的区别

时间:2025-03-19 11:44:20

@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){
    (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可以接受简单类型的属性,也可以接受对象类型。 
 实质是将() 中的Key-Value参数Map利用Spring的转化机制ConversionService配置,转化成参数接收对象或字段。

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