当前位置: 首页 > 编程笔记 >

一篇文章弄懂Spring MVC的参数绑定

桑博远
2023-03-14
本文向大家介绍一篇文章弄懂Spring MVC的参数绑定,包括了一篇文章弄懂Spring MVC的参数绑定的使用技巧和注意事项,需要的朋友参考一下

前言

参数绑定,简单来说就是客户端发送请求,而请求中包含一些数据,那么这些数据怎么到达 Controller ?这在实际项目开发中也是用到的最多的,那么 SpringMVC 的参数绑定是怎么实现的呢?

下面我们来详细的讲解。

SpringMVC参数绑定,简单来说就是将客户端请求的key/value数据绑定到controller方法的形参上,然后就可以在controller中使用该参数了

下面通过5个常用的注解演示下如何进行参数绑定:

1. @PathVariable注解

@PathVariable 是用来获得请求url中的动态参数的,可以将URL中的变量映射到功能处理方法的参数上,其中URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的入参中。

示例代码:

 @ResponseBody
 @RequestMapping("/testUrlPathParam/{param1}/{param2}")
 public void testUrlPathParam(HttpServletRequest request, @PathVariable String param1,
     @PathVariable String param2) {
 System.out.println("通过PathVariable获取的参数param1=" + param1);
 System.out.println("通过PathVariable获取的参数param2=" + param2);
 }

Postman发送请求截图:

输出结果:

通过PathVariable获取的参数param1=1
通过PathVariable获取的参数param2=2

2.@RequestHeader注解

@RequestHeader 注解,可以把Request请求header部分的值绑定到方法的参数上。

示例代码:

 @ResponseBody
 @RequestMapping("/testHeaderParam")
 public void testHeaderParam(HttpServletRequest request, @RequestHeader String param1) {
 System.out.println("通过RequestHeader获取的参数param1=" + param1);
 }

Postman发送请求截图:

输出结果:

通过RequestHeader获取的参数param1=abc

3.@CookieValue注解

@CookieValue 可以把Request header中关于cookie的值绑定到方法的参数上。

示例代码:

 @ResponseBody
 @RequestMapping("/testCookieParam")
 public void testCookieParam(HttpServletRequest request, HttpServletResponse response,
         @CookieValue String sessionid) {
  System.out.println("通过CookieValue获取的参数sessionid=" + sessionid);
 }

Postman发送请求截图:

输出结果:

通过CookieValue获取的参数sessionid=ebef978eef6c46f8a95cc0990d2d360a

4.@RequestParam注解

@RequestParam注解用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。提交方式为get或post。(Http协议中,form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded);

@RequestParam注解实质是将Request.getParameter() 中的Key-Value参数Map利用Spring的转化机制ConversionService配置,转化成参数接收对象或字段,
get方式中queryString的值,和post方式中body data的值都会被Servlet接受到并转化到Request.getParameter()参数集中,所以@RequestParam可以获取的到;

该注解有三个属性: value、required、defaultValue; value用来指定要传入值的id名称,required用来指示参数是否必录,defaultValue表示参数不传时候的默认值。

示例代码:

 @ResponseBody
 @RequestMapping("/testRequestParam")
 public void testRequestParam(HttpServletRequest request,
         @RequestParam(value = "num", required = true, defaultValue = "0") int num) {
  System.out.println("通过RequestParam获取的参数num=" + num);
 }

Postman发送请求截图:


输出结果:

通过RequestParam获取的参数num=10

5.@RequestBody注解

@RequestBody注解用来处理HttpEntity(请求体)传递过来的数据,一般用来处理非Content-Type: application/x-www-form-urlencoded编码格式的数据;

GET请求中,因为没有HttpEntity,所以@RequestBody并不适用;

POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用HandlerAdapter配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。

示例代码:

 @ResponseBody
 @RequestMapping("/testRequestBody")
 public void testRequestBody(HttpServletRequest request, @RequestBody String bodyStr){
  System.out.println("通过RequestBody获取的参数bodyStr=" + bodyStr);
 }

Postman发送请求截图:

代码运行结果:

通过RequestBody获取的参数bodyStr=这是body的内容

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。

 类似资料:
  • 本文向大家介绍一篇文章看懂JavaScript中的回调,包括了一篇文章看懂JavaScript中的回调的使用技巧和注意事项,需要的朋友参考一下 前言 回调函数是每个前端程序员都应该知道的概念之一。回调可用于数组、计时器函数、promise、事件处理中。 本文将会解释回调函数的概念,同时帮你区分两种回调:同步和异步。 回调函数 首先写一个向人打招呼的函数。 只需要创建一个接受 name 参数的函数

  • 主要内容:一、场景引入,问题初现,二、volatile的作用及背后的原理,三、总结 & 提醒一、场景引入,问题初现 很多同学出去面试,都会被问到一个常见的问题:说说你对volatile的理解? 不少初出茅庐的同学可能会有点措手不及,因为可能就是之前没关注过这个。但是网上百度一下呢,不少文章写的很好,但是理论扎的太深,文字太多,图太少,让人有点难以理解。 基于上述痛点,这篇文章尝试站在年轻同学的角度,用最简单的大白话,加上多张图给大家说一下,volatile到底是什么? 当然本文不会把理论

  • 本文向大家介绍一篇文章看懂C#中的协变、逆变,包括了一篇文章看懂C#中的协变、逆变的使用技巧和注意事项,需要的朋友参考一下 1. 基本概念 官方:协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型,后者指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型。[MSDN] 公式:           协变:IFoo<父类> = IFoo<子类>;    

  • 本文向大家介绍一篇文章搞懂Python的类与对象名称空间,包括了一篇文章搞懂Python的类与对象名称空间的使用技巧和注意事项,需要的朋友参考一下 代码块的分类 python中分几种代码块类型,它们都有自己的作用域,或者说名称空间: 文件或模块整体是一个代码块,名称空间为全局范围 函数代码块,名称空间为函数自身范围,是本地作用域,在全局范围的内层 函数内部可嵌套函数,嵌套函数有更内一层的名称空间

  • 我正在尝试将帖子ID添加到下一个和上一个帖子中。当前使用下面的代码给我带来了不希望看到的页面的post id的效果。

  • 我正在使用的十二主题,我正在尝试输出下一个帖子和前一个帖子在底部的内页。 谢谢你。