SpringMVC之请求参数的获取方式
转载出处: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. 其他
声明
尽信书则不如,已上内容,纯属一家之言,因本人能力一般,见解不全,如有问题,欢迎批评指正
SpringMVC之请求参数的获取方式的更多相关文章
- SpringMVC请求参数的获取方式
一.GET请求参数获取 1. 通过HttpServletRequest获取参数 2. 直接方法参数获取 3. RequestParam注解方式获取请求参数 4. Bean方式获取参数 5. Model ...
- 16 SpringMVC 的请求参数的绑定与常用注解
1.SpringMVC 绑定请求参数 (1)支持的数据类型 基本类型参数: 包括基本类型和 String 类型POJO 类型参数: 包括实体类,以及关联的实体类数组和集合类型参数: 包括 List 结 ...
- SpringMvc接受请求参数的几种情况演示
说明: 通常get请求获取的参数是在url后面,而post请求获取的是请求体当中的参数.因此两者在请求方式上会有所不同. 1.直接将接受的参数写在controller对应方法的形参当中(适用于get提 ...
- springmvc请求路径和请求参数的获取注解- @PathVariable和@RequestParam
@PathVariable和@RequestParam @PathVariable是从路径里面去获取变量,也就是把路径当做变量. @RequestParam是从请求里面获取参数. 如:url:http ...
- springboot获取URL请求参数的多种方式
1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交. /** * 1.直接把表单的参数写在Controller相应的方法的形参中 * @pa ...
- springMVC接收请求参数的几种方式
1. 用注解@RequestParam绑定请求参数 用注解@RequestParam绑定请求参数a到变量a,当请求参数a不存在时会有异常发生,可以通过设置属性required=false解决,例如: ...
- SpringMVC RequestMapping & 请求参数
SpringMVC 概述 Spring 为展现层提供的基于 MVC 设计理念的优秀的Web 框架,是目前最主流的 MVC 框架之一 Spring3.0 后全面超越 Struts2,成为最优秀的 MVC ...
- SpringMVC 接受请求参数、作用域传值
目录 原生servlet接收参数 Spring MVC最基础的参数获取 接收基本数据类型参数 方法参数列表和请求参数不一致的处理方式 接收对象引用数据类型 接收复选框这种多个同名的参数 接收obj.f ...
- SpringMVC接受请求参数、
1. 接收请求参数 1.1. [不推荐]通过HttpServletRequest 在处理请求的方法中,添加HttpServletRequest对象作为参数,在方法体中,直接调用参数对象的getPara ...
随机推荐
- PyQt5实现第一个桌面应用程序
import sysfrom PyQt5.QtWidgets import QApplication,QWidget,QDialogfrom PyQt5.QtCore import Qt if __n ...
- [转载]在网页中插入media,RealPlayer等控件
[转载]在网页中插入media,RealPlayer等控件 (2012-11-02 20:27:43) 转载▼ 标签: 转载 原文地址:在网页中插入media,RealPlayer等控件作者:Mo ...
- element--ui使用tab切换时如何获取当前对象的id或者其他属性
1. 问题 当使用tab切换时,部分特殊场景需要获取当前元素的类名或者id. 2.解决思路,tab切换是绑定函数,函数会传递过去当前对象,通过当前对象获取对象属性 vue部分代码:本项目是在vue-c ...
- Python之条件判断
Python之条件判断 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if语句实现: age = 20 if age ...
- Linux最常用的基础命令 下篇
Linux最常用的基础命令个人总结 shell脚本 脚本就是:写一堆指令存成一个文本,用于完成一些小任务 a="123" linux中定义一个变量 echo $a echo $b ...
- hibernate-validator验证请求参数
开发接口要进行请求参数内容格式校验,比如在接收到请求参数后依次需要进行数据内容判空.数据格式规范校验等,十分麻烦,于是尝试用hibernate-validator进行参数校验,简单记录一下使用步骤: ...
- reactNative 打包那些事儿
我们项目测试时一般是debug版本,打包上线,一般是release版本,所以在测试和打包时会走不同的方法,如上图所示. 在debug版本中,会走我们本地服务器,也就是自己电脑上的服务.在release ...
- devstck 部署OpenStack Queens allinone
1.环境信息 1台虚拟机 8C16G CentOS 7.2 2.准备工作 #!/bin/bash set -x #配置aliyun的centos和epel mirror mkdir /etc/yu ...
- xtu read problem training 4 B - Multiplication Puzzle
Multiplication Puzzle Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. O ...
- Android BGABadgeView:新消息/未接来电/未读消息/新通知圆球红点提示(1)
Android BGABadgeView:新消息/未接来电/未读消息/新通知圆球红点提示(1) 现在很多的APP会有新消息/未接来电/未读消息/新通知圆球红点提示,典型的以微信.QQ新消息提示为 ...