转载出处: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之请求参数的获取方式的更多相关文章

  1. SpringMVC请求参数的获取方式

    一.GET请求参数获取 1. 通过HttpServletRequest获取参数 2. 直接方法参数获取 3. RequestParam注解方式获取请求参数 4. Bean方式获取参数 5. Model ...

  2. 16 SpringMVC 的请求参数的绑定与常用注解

    1.SpringMVC 绑定请求参数 (1)支持的数据类型 基本类型参数: 包括基本类型和 String 类型POJO 类型参数: 包括实体类,以及关联的实体类数组和集合类型参数: 包括 List 结 ...

  3. SpringMvc接受请求参数的几种情况演示

    说明: 通常get请求获取的参数是在url后面,而post请求获取的是请求体当中的参数.因此两者在请求方式上会有所不同. 1.直接将接受的参数写在controller对应方法的形参当中(适用于get提 ...

  4. springmvc请求路径和请求参数的获取注解- @PathVariable和@RequestParam

    @PathVariable和@RequestParam @PathVariable是从路径里面去获取变量,也就是把路径当做变量. @RequestParam是从请求里面获取参数. 如:url:http ...

  5. springboot获取URL请求参数的多种方式

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

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

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

  7. SpringMVC RequestMapping & 请求参数

    SpringMVC 概述 Spring 为展现层提供的基于 MVC 设计理念的优秀的Web 框架,是目前最主流的 MVC 框架之一 Spring3.0 后全面超越 Struts2,成为最优秀的 MVC ...

  8. SpringMVC 接受请求参数、作用域传值

    目录 原生servlet接收参数 Spring MVC最基础的参数获取 接收基本数据类型参数 方法参数列表和请求参数不一致的处理方式 接收对象引用数据类型 接收复选框这种多个同名的参数 接收obj.f ...

  9. SpringMVC接受请求参数、

    1. 接收请求参数 1.1. [不推荐]通过HttpServletRequest 在处理请求的方法中,添加HttpServletRequest对象作为参数,在方法体中,直接调用参数对象的getPara ...

随机推荐

  1. 51nod 1175 区间第k大 整体二分

    题意: 一个长度为N的整数序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,第K大的数是多少. 分析: 仅仅就是一道整体二分的入门题而已,没听说过整体二分? 其实就是一个分治的函数 ...

  2. element-UI 多表单重置的时候的坑

    问题细化一下是这样的:比如我有一个用来修改数据的表单,第一条数据是{name: 'Xixi', age: 12},打开表单后就有两个输入框分别填的是Xixi和12,此时我修改Xixi为Haha,调用t ...

  3. 分数拆分(刘汝佳紫书P183)

    枚举,由已知条件推得y大于k,小于等于2K AC代码: #include"iostream"#include"cstring"using namespace s ...

  4. [bzoj2822][AHOI2012]树屋阶梯 (卡特兰数+分解质因数+高精度)

    Description 暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题.由于地上露营湿气重,必须选择在高处的树屋露营.小龙分配的树屋建立在一颗高度为 ...

  5. 数据库SQL实战练习

    http://blog.csdn.net/iamyvette/article/details/77151925

  6. python 几种点积运算方式效率分析

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51793984 本文列举出几种pytho ...

  7. ElasticSearch全文搜索引擎(A)

    文章:[Elasticsearch] 全文搜索 (一) - 基础概念和match查询 全文检索,是从最初的字符串匹配和简单的布尔逻辑检索技术,演进到能对超大文本.语音.图像.活动影像等非结构化数据进行 ...

  8. bash shell & front-end & auto publish & auto deploy

    bash shell & front-end & auto publish & auto deploy $ zip -r apitool-2018-11-22.zip apit ...

  9. 【转载】Spring Boot【快速入门】2019.05.19

    原文出处:https://www.cnblogs.com/wmyskxz/p/9010832.html   Spring Boot 概述 Build Anything with Spring Boot ...

  10. HashSet源码分析2

    package com.test1; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public ...