@RequestBody,@RequestParam和@Param的区别说明

作者:白雪茫茫 时间:2023-07-20 06:29:03 

@RequestBody,@RequestParam和@Param区别

@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

@requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。

通过@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中的属性名,否则是请求不过去的。 

处理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可以获取的到。

@RequestParam使用注意事项

  • @RequestParam:将请求参数绑定到你控制器的方法参数上

该注解中有一个属性required,表示是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。

但是大家使用的时候不要产生误区,required=true是能校验请求中是否包含该参数,但是不能校验参数值是否为空.

比如下面的接口

@RequestBody,@RequestParam和@Param的区别说明

http://127.0.0.1:9802/api/order/vr/testRequestParam这样是可以被拦截下来的,因为请求参数中不存在param1这个参数

但是http://127.0.0.1:9802/api/order/vr/testRequestParam?param1是可以请求成功的

为了拦截到参数为空的请求

还需要在参数中加 @Valid @NotBlank

如下:

@RequestBody,@RequestParam和@Param的区别说明

来源:https://blog.csdn.net/chenmin_test/article/details/84324920

标签:RequestBody,RequestParam,Param
0
投稿

猜你喜欢

  • C++调试追踪class成员变量的方法

    2022-11-21 01:32:12
  • Android开发使用URLConnection进行网络编程详解

    2022-01-07 22:49:28
  • gradle使用maven-publish发布jar包上传到私有maven配置

    2022-11-22 07:07:54
  • Struts 2中的constant配置详解

    2023-11-10 08:18:18
  • java文件操作输入输出结构详解

    2023-07-30 21:48:30
  • 详解在java中进行日期时间比较的4种方法

    2022-09-03 23:35:52
  • springboot整合腾讯云短信开箱即用的示例代码

    2023-04-02 06:06:38
  • SpringCloud实现灰度发布的方法步骤

    2023-03-17 05:18:37
  • C#语法新特性之元组实例详解

    2022-09-20 03:05:53
  • Spring MVC+FastJson+Swagger集成的完整实例教程

    2023-08-11 22:50:02
  • SpringMVC form标签引入及使用方法

    2023-02-16 17:58:41
  • Java中的静态绑定和动态绑定详细介绍

    2023-01-18 19:54:06
  • Spring Bean生命周期之属性赋值阶段详解

    2022-09-28 04:34:11
  • WinForm中实现picturebox自适应图片大小的方法

    2022-09-07 21:14:01
  • Spring 事务事件监控及实现原理解析

    2023-12-24 04:20:20
  • Mybatis中的mapper模糊查询语句LIKE

    2022-02-17 16:21:15
  • Android studio 3.5.2安装图文教程详解

    2022-06-27 19:15:46
  • Java并发LinkedBlockingQueue源码分析

    2022-09-01 08:35:30
  • 使用Java visualVM监控远程JVM的流程分析

    2022-03-19 16:56:02
  • 详解java封装实现Excel建表读写操作

    2023-12-24 11:17:20
  • asp之家 软件编程 m.aspxhome.com