一篇文章弄懂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的内容

总结

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

时间: 2019-02-12

springboot注册bean的三种方法

spring在启动时会自己把bean(java组件)注册到ioc容器里,实现控制反转,在开发人员使用spring开发应用程序时,你是看不到new关键字的,所有对象都应该从容器里获得,它们的 生命周期 在放入容器时已经确定! 下面说一下三种注册bean的方法 @ComponentScan @Bean @Import @ComponentScan注册指定包里的bean Spring容器会扫描@ComponentScan配置的包路径,找到标记@Component注解的类加入到Spring容器. 我们经

SpringBoot thymeleaf eclipse热部署方案操作步骤

网上找了好多的springboot热部署方案,也尝试了好几种方法,下面是我的成功方案跟大家分享 操作步骤 1.pom中添加热部署依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency&g

深入理解Spring事务的传播行为

前言 本文主要介绍下Spring事务中的传播行为.事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为.这是Spring为我们提供的强大的工具箱,使用事务传播行可以为我们的开发工作提供许多便利. 下面话不多说了,来一起看看详细的介绍吧 事务传播行为介绍 Spring中的7个事务传播行为: |事务行为|说明 | |:--|:--| |PROPAGATION_REQUIRED | 支持当前事务,假设当前没有事务.就新建一个事务 | | PROPAGATION_SUPP

SpringSessionRedis配置及发现的问题讲解

最近写项目,需要把session放入Redis中,来实现分布式.我本来要用Tomcat部署Redis这种方法,但是依赖于容器了.无意中发现了SpringSession,这可挺不错的,写完了发现不好用,问度娘也没弄明白,最后我写了2个demo一个springMVC的,一个spring整合struts2的,发现SpringSession需要SpringMVC的支持.也就是说我的项目用不了了. 先说说springsession的配置吧: 一.Maven中pom.xml文件中添加(选一种添加上就行):

eclipse下整合springboot和mybatis的方法步骤

1.新建maven项目 先新建一个maven项目,勾选上creat a simple project,填写groupid,artifactid 2.建立项目结构 3.添加依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE<

springboot打包不同环境配置以及shell脚本部署的方法

前言 本篇和大家分享的是springboot打包并结合shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作: profiles指定不同环境的配置 maven-assembly-plugin打发布压缩包 分享shenniu_publish.sh程序启动工具 linux上使用shenniu_publish.sh启动程序 profiles指定不同环境的配置 通常一套程序分为了很多个部署环境:开发,测试,uat,线上 等,我们要想对这些环境区分配置文件,可以通过两种方式: 通过a

Spring Boot中使用Spring-data-jpa的配置方法详解

为了解决这些大量枯燥的数据操作语句,我们第一个想到的是使用ORM框架,比如:hibernate.通过整合Hibernate之后,我们以操作Java实体的方式最终将数据改变映射到数据库表中. 为了解决抽象各个Java实体基本的"增删改查"操作,我们通常会以泛型的方式封装一个模板Dao来进行抽象简化,但是这样依然不是很方便,我们需要针对每个实体编写一个继承自泛型模板Dao的接口,再编写该接口的实现.虽然一些基础的数据访问已经可以得到很好的复用,但是在代码结构上针对每个实体都会有一堆Dao的

Spring框架十一种常见异常的解决方法汇总

在程序员生涯当中,提到最多的应该就是SSH三大框架了.作为第一大框架的Spring框架,我们经常使用. 然而在使用过程中,遇到过很多的常见异常,我在这里总结一下,大家共勉. 一.找不到配置文件的异常 org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [com/herman/ss/controller];

Spring boot配置文件加解密详解

功能介绍 大家都知道在Spring boot开发过程中,需要在配置文件里配置许多信息,如数据库的连接信息等,如果不加密,传明文,数据库就直接暴露了,相当于"裸奔"了,因此需要进行加密处理才行. 在项目中使用jasypt-1.9.4.jar包,能够实现对明文进行加密,对密文进行解密.配置相关加密信息,就能够实现在项目运行的时候,自动把配置文件中已经加密的信息解密成明文,供程序使用 下面话不多说了,来一起看看详细的介绍吧 使用说明 1.pom引入依赖 <dependency>

SpringBoot实战之SSL配置详解

1.SSL介绍和说明 SSL的配置也是我们在实际应用中经常遇到的场景 SSL(Secure Sockets Layer,安全套接层)是为网络通信提供安全及数据完整性的一种协议,SSL在网络传输层对网络连接进行加密.SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通信提供安全支持.SSL协议可以分为两层:SSL记录协议(SSL Record Protocal),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装.压缩.加密等基础功能的支持.SSL握手协议(SSL Handsh

SpringBoot+docker环境变量配置详解

项目中遇到springBoot+docker需要配置不同环境变量的问题,做个简单的总结: 1.开发环境ide中启动项目 可以通过ide的环境变量参数配置,启动之后使用哪个配置,比如 这样就使用application-test.yml中的配置 2.通过gradle打包 可以通过-P参数来指定打包后的jar使用哪种环境来运行,比如 gradlew -Pprod bootWar 打包之后运行会使用prod中的配置:我的项目是jhipster生成出来的,现在需要添加test的环境配置,需求修改下项目的g

SpringBoot微信消息接口配置详解

1.申请测试号,并记录appID和appsecret 2.关注测试号 3.添加消息模板 {{topic.DATA}} 用户名: {{user.DATA}} 单车编号:{{car.DATA}} 锁定时间:{{date.DATA}} {{remark.DATA}} 微信接口配置和代码 1.添加微信配置文件 import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframe

IOS开发 支持https请求以及ssl证书配置详解

IOS开发 支持https请求以及ssl证书配置详解 前言: 众所周知,苹果有言,从2017年开始,将屏蔽http的资源,强推https 楼主正好近日将http转为https,给还没动手的朋友分享一二 一.证书准备 1.证书转换 在服务器人员,给你发送的crt证书后,进到证书路径,执行下面语句 // openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der 这样你就可以得到cer类型的证书了.双击,导入电脑. 2.证书放入工程 1.可以直接把转换好

微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)

微信小程序Server环境配置详解 主要内容: 1. SSL免费证书申请步骤 2. Nginx HTTPS 配置 3. TLS 1.2 升级过程 微信小程序要求使用 https 发送请求,那么Web服务器就要配置成支持 https,需要先申请SSL证书 小程序也要求 TLS(传输层安全协议)的版本至少为 1.2,在配置好 https之后,如果 TLS 的版本较低,就涉及到升级问题 所以 Server端环境配置的主要步骤: 申请 SSL 证书 配置web服务器支持https(我使用的是nginx)

SpringBoot登录拦截配置详解(实测可用)

背景:写一个用户登录拦截,在网上找了一圈没找到好用的,于是自己试验了一下,总结出来,分享给大家. 1.自定义登录拦截器LoginInterceptor public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) thr

SpringBoot集成JmsTemplate(队列模式和主题模式)及xml和JavaConfig配置详解

1.导入jar包: <!--jmsTemplate--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> <dependency> <groupId>org.apache.activemq</g

springboot中filter的用法详解

一.在spring的应用中我们存在两种过滤的用法,一种是拦截器.另外一种当然是过滤器.我们这里介绍过滤器在springboot的用法,在springmvc中的用法基本上一样,只是配置上面有点区别. 二.filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter

springboot与mybatis整合实例详解(完美融合)

简介 从 Spring Boot 项目名称中的 Boot 可以看出来,Spring Boot 的作用在于创建和启动新的基于 Spring 框架的项目.它的目的是帮助开发人员很容易的创建出独立运行和产品级别的基于 Spring 框架的应用.Spring Boot 会选择最适合的 Spring 子项目和第三方开源库进行整合.大部分 Spring Boot 应用只需要非常少的配置就可以快速运行起来. Spring Boot 包含的特性如下: 创建可以独立运行的 Spring 应用. 直接嵌入 Tomc

Nginx配置详解(推荐)

序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的.从2004年发布至今,凭借开源的力量,已经接近成熟与完善. Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器.支持FastCGI.SSL.Virtual Host.URL Rewrite.Gzip等功能.并且支持很多第三方的模块扩展. Nginx的稳定性.功能集.示例配置文件和低系统资源的消耗让他后来居上,在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站.