转载出处:https://www.toutiao.com/i6510822190219264516/

SpringMVC之请求参数的获取方式

常见的一个web服务,如何获取请求参数?

一般最常见的请求为GET和POST,get请求的参数在url上可以获取,post请求参数除了url上还有可能在表单中,文件上传时,获取方式又和一般的参数获取不一样

本篇则主要集中在不同请求方式下,获取参数的使用姿势

首先需要搭建一个后端的请求,为了快速演示

利用spring-boot创建了一个机器简单的工程,依赖版本1.5.4.RELEASE

I. GET请求参数获取

get请求参数,一般都是直接挂在请求的url上,所以获取这些参数还是比较简单的

1. 通过 HttpServletRequest获取参数

这个可以说是最基本最常见的的方式了,javax.servlet.ServletRequest#getParameter来获取对应的参数,下面各处一个实例

根据上面暴露的接口,我们测试的case就很简单了

说明

  • 这是一个最基本的获取参数的方式,get,post请求都适用的,通常在filter,intercepter中也是可以通过HttpServletRequest对象来获取请求参数

  • 除了获取常见的请求参数之外,HttpServletRequest可以获取请求头的完整信息

  • 在一次请求的生命周期内,可以通过下面的方式获取Request对象(当然也可以获取response对象)

2. 直接方法参数获取

直接给出case, 这个方法依然是放在上面的DemoController下面的

请求验证

注意:

  • 上面这种使用方式,相当于直接将url参数映射到了Controller方法的参数上了

  • 方法参数名必须和url参数名完全一致(区分大小写)

  • 顺序无关

  • 若参数没传,则默认为null

一个疑问

上面的demo中Controller的方法参数都是String还好,如果将password改成int,会出现什么情况

代码稍作修改

实际测试

结果说明

  • 如果请求参数与方法参数类型不一致,会抛出转换异常

  • 如果方法参数为非封装基本类型,则url参数必须存在,否则报错

3. RequestParam注解方式获取请求参数

通过@RequestParam注解获取参数的方式和上面的一种比较类似,case如下

测试case

说明

  • 不指定注解的name或value属性时,等同于第二种使用姿势

  • 注解的name属性或value属性,用实际的参数名来指定

  • controller的参数名与url参数名没有强关联(区别第二种方式)

  • 参数类型需要保证一致(通第二种方式)

  • 如果url参数可选,请设置require属性为false,如下

    @RequestParam(name = "user", required = false) String username

4. Bean方式获取参数

对于请求参数比较复杂的情况下,我比较喜欢这种使用姿势,管理起来方便简单

测试case

说明

  • 定义一个bean,内部属性和请求参数对应

  • 允许参数不存在的情况,会使用null代替(所以,尽量不要使用非封装基本类型,否则参数不传时,会抛异常)

  • bean的属性,可以根据实际情况指定类型

5. ModelAttribute注解方式

@ModelAttribute注解的方法,会优于Controller之前执行,一般更常见于向视图传输数据使用,此处不详细展开,正常来讲,专门的获取参数不太会用这这种方式来玩

6. Path参数

Path参数,专指的是请求路径的参数,如

上面这个url中,password是我们传统意义上的请求参数,其中path参数则是指其中req4,demo这种path路径中的一环;对此,最常见的一个case就是常见的博客中,如开源中国的一个博客链接

  • 566591 : 这个参数主要用来区分用户

  • 1601400 : 这个参数则主要是表示对应的博文

一般path参数的获取方式如下

测试case

注意:

  • path参数的使用,需要确保参数存在且类型匹配

  • path参数和url参数不会相互影响

II. POST请求参数获取

POST请求参数,更多的是看提交表单参数是否可以获取到,以及如何获取,主要的手段依然是上面几种方式,下面验证下是否ok

1. HttpServletRequest方式获取参数

测试case,可以借助curl来实现post请求

curl也可以换成js请求测试方式

说明

  • 对于HttpServletReuqest方式获取参数时,get和post没什么区别

  • 若url参数和表单参数同名了,测试结果显示使用的是url参数(待确认,当然最好不要这么干)

2. 方法参数获取

几个测试demo如下

基本上使用姿势和get没什么区别

3. RequestParam注解方式

注意

  • 和前面的两种方式不同的是,当post表单的参数和url参数同名时,会合并成一个字符串

4. Bean方式

这种方式不区分get,post,所以完全复杂的交互接口,完全可以考虑用bean的方式来定义请求参数

5. PathVariable

这个没法玩...

III. 多媒体上传参数获取

上传文件的支持,对于传统的spring-mvc来说,可能需要一些添加一些相关配置,不在本文的范畴内,下面默认已经配置好

实例支持

简单来说,主要是利用HttpServletRequest来获取上传的文件

注意:

  • 如果接口必须要求上传文件,可以直接把参数声明为MultipartHttpServletRequest, 此时调用方如果不传参数,会被异常拦截(可以通过@ControllerAdvice来拦截全局异常)

  • 如果可以不上传文件,则可以用上面的这种猥琐姿势,内部进行判断

  • ((MultipartHttpServletRequest) request).getFile(xxx)来获取指定名的上传文件

IV. 小结

1. 五种获取参数的姿势

方式 注意事项
HttpServletRequest获取参数 最常见通用
方法参数与请求参数同名 注意参数名统一,注意类型一致,尽量不用非包装基本类型
@RequestParam注解 同上,可注解内指定http参数名
Bean方式 定义一个bean,会将同名的http参数赋值进去,推荐
@PathVariable 注解 请求url参数

2. 传文件使用姿势

使用MultipartHttpServletRequest来获取上传的文件,当然也可以获取基本的请求参数

V. 其他

声明

尽信书则不如,已上内容,纯属一家之言,因本人能力一般,见解不全,如有问题,欢迎批评指正

转载于:https://www.cnblogs.com/klslb/p/8286762.html

SpringMVC之请求参数的获取方式相关推荐

  1. springboot获取多个请求参数_springboot获取URL请求参数的多种方式

    1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交. /** * 1.直接把表单的参数写在Controller相应的方法的形参中 * @pa ...

  2. SpringMVC的请求参数,类型转换器(日期格式),请求映射

    SpringMVC的请求参数,类型转换器(日期格式),请求映射 请求参数 springMVC将传递的参数封装到处理的方法形参中,达到快速访问参数的目的 普通参数类型 参数名与处理器方法形参名保持一致 ...

  3. Express请求处理-GET和POST请求参数的获取

    场景 Node的Web应用框架Express的简介与搭建HelloWorld: Node的Web应用框架Express的简介与搭建HelloWorld_霸道流氓气质的博客-CSDN博客 注: 博客: ...

  4. springMVC接收请求参数的几种方式

    1.  用注解@RequestParam绑定请求参数 用注解@RequestParam绑定请求参数a到变量a,当请求参数a不存在时会有异常发生,可以通过设置属性required=false解决,例如: ...

  5. java get请求 参数_HttpServletRequest获取GET请求参数5种方法

    首页 > Java Web > SpringMvc应用 > HttpServletRequest HttpServletRequest获取GET请求参数5种方法 HttpServle ...

  6. 获取referer中的请求参数_Servlet获取AJAX POST请求中参数以form data和request payload形式传输的方法...

    本文实例讲述了Servlet获取AJAX POST请求中参数以form data和request payload形式传输的方法.分享给大家供大家参考,具体如下: HTTP请求中,如果是get请求,那么 ...

  7. SpringMVC框架----请求参数的绑定

    1.请求参数绑定入门 作为web层框架,客户端发请求过来,一定会携带请求参数,把数据传给我,拿到数据的过程称之为参数的绑定. 表单提交数据,都是一组键值对,比如username=hehe&pa ...

  8. java 页面接收参数_详解SpringMVC——接收请求参数和页面传参

    spring接收请求参数: 1,使用HttpServletRequest获取 @RequestMapping("/login.do") public String login(Ht ...

  9. springmvc接收请求参数(springmvc教程二)

    目录 工程代码 普通接收请求参数 pojo接收请求参数 @RequestParam接收请求参数 restful风格 URL接收请求参数 json接收请求参数 Array数据接收请求参数 接收请求参数序 ...

最新文章

  1. linux如何关闭防火墙
  2. des解密 given final_人设不能崩[无限]作者:条纹花瓶(无限流+解密+闯关+直播+爽文)...
  3. 在Ubuntu 20.04 LTS中配置Java开发环境
  4. Select的OnChange()事件中获取选中的值
  5. 在 WSL Ubuntu 上使用 .NET 进行跨平台开发新手入门
  6. 基于Abp VNext框架设计 - Masstransit分布式消息
  7. 【牛客 - 303D第十五届浙江大学宁波理工学院程序设计大赛(同步赛)】Campaign(二进制枚举,位运算,暴力,思维)
  8. 炼数成金数据分析课程---10、python中如何画图
  9. 高考作文也被AI攻克?B站UP主爆肝100天,开发会写高考作文的AI
  10. Unity3D 游戏贴图(法线贴图,漫反射贴图,高光贴图)
  11. CentOS 7 虚拟机网卡失效问题:ens33:<NO-CARRIER,BROADCAST,MULTICAST,UP>mtu 1508 gdisc pf ifo_fast state DOWN
  12. javacv 人脸追踪_基于JavaCV的人脸识别程序
  13. python 简单点餐系统
  14. 【学习笔记】投资理财,基金基础知识科普入门学习,凭运气赚回来的钱,会凭实力亏掉_20210115
  15. 初探Spring Boot + MySQL + jpa
  16. nvme固态硬盘开机慢_6个固态硬盘优化设置技巧 让你的SSD速度飞起来 (全文)
  17. Linux基础-2、基本命令
  18. 三节课-产品视角养成
  19. MySQL中聚合函数count的使用和性能优化
  20. 快速启动以管理员身份运行命令行窗口命令

热门文章

  1. C++中函数指针的使用
  2. 【OpenCV】读取csv文件
  3. linux驱动:i2c驱动(三)流程图之注册设备
  4. 哪个工具编译java_用什么工具来编译JAVA啊?
  5. splitcontainer如何设置两边一样打_墙洞加筋如何计算?
  6. 施工管理在计算机上的应用论文,【计算机专业毕业论文】关于计算机应用技术在工程项目管理中的应用...
  7. HikariPool 连接池问题
  8. 安卓饼状图设置软件_话单及银行卡交易智能分析软件
  9. Java中的拆箱与装箱
  10. python3笔记_python3基础笔记(一)