一、GET请求参数获取

get请求参数,一般都是直接挂在请求的url上。

1. 通过HttpServletRequest获取参数

通过javax.servlet.ServletRequest#getParameter 来获取对应的参数:

@RestController
@RequestMapping(path = "webs/demo")
public class DemoController { @RequestMapping(path = "req1")
public String req1(HttpServletRequest request) {
String user = request.getParameter("user");
String password = request.getParameter("password");
return "req1 user: " + user + " pwd: " + password;
}
}
  • 这是一个最基本的获取参数的方式,get,post请求都适用的,通常在filter,intercepter中也是可以通过HttpServletRequest对象来获取请求参数
  • HttpServletRequest可以获取请求头的完整信息
  • 在一次请求的生命周期内,可以通过下面的方式获取Request对象(当然也可以获取response对象)。
HttpServletRequest httpServletRequest = ((ServletRequestAttributes)
RequestContextHolder.getRequestAttributes()).getRequest();

2. 直接方法参数获取

@RequestMapping(path = "req2")
public String req2(String user, String password) {
return "req2 user: " + user + " pwd: " + password;
}

请求验证:

http://127.0.0.1:8080/webs/demo/req2?user=%E5%B0%8F%E7%81%B0%E7%81%B0Blog&password=123456
## 输出: req2 user: 小灰灰Blog pwd: 123456 http://127.0.0.1:8080/webs/demo/req2?password=123456
## 输出: req2 user: null pwd: 123456 http://127.0.0.1:8080/webs/demo/req2?password=123456&User=blog
## 输出: req2 user: null pwd: 123456
  • 将url参数映射到了Controller方法的参数上
  • 方法参数名必须和url参数名完全一致(区分大小写)
  • 顺序无关
  • 若参数没传,则默认为null
  • 如果请求参数与方法参数类型不一致,会抛出转换异常
  • 如果方法参数为非封装基本类型,则url参数必须存在,否则报错

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

通过@RequestParam注解获取参数,与直接方法参数获取方法一样。

@RequestMapping(path = "req3", method = RequestMethod.GET)
public String req3(@RequestParam("user") String username,
@RequestParam("password") String pwd) {
return "req3 user: " + username + " pwd: " + pwd;
}

测试用例:

# case1
http://127.0.0.1:8080/webs/demo/req3?password=123456&user=blog
## 输出: req3 user: blog pwd: 123456 # case2
http://127.0.0.1:8080/webs/demo/req3?password=123456
## 输出:报错, Required String parameter 'user' is not presen
  • 不指定注解的name或value属性时,等同于第二种使用姿势
  • 注解的name属性或value属性,用实际的参数名来指定
  • controller的参数名与url参数名没有强关联(区别第二种方式)
  • 参数类型需要保证一致(同第二种方式)
  • 如果url参数可选,请设置require属性为false,如下
@RequestParam(name = "user",  required = false) String username

4. Bean方式获取参数

请求参数比较复杂的情况下,这种方式较好:

@Data
public static class UserDO {
String user;
String password;
} @RequestMapping(path = "req4", method = RequestMethod.GET)
public String req4(UserDO userDO) {
return "req4 userDO: " + userDO;
}

测试用例:

# case1
http://127.0.0.1:8080/webs/demo/req4?password=123456&user=%E5%B0%8F%E7%81%B0%E7%81%B0Blog
## 输出: req4 userDO: DemoController.UserDO(user=小灰灰Blog, password=123456) # case2
http://127.0.0.1:8080/webs/demo/req4?password=123456
## 输出: req4 userDO: DemoController.UserDO(user=null, password=123456)
  • 定义一个bean,内部属性和请求参数对应
  • 允许参数不存在的情况,会使用null代替(所以,尽量不要使用非封装基本类型,否则参数不传时,会抛异常)
  • bean的属性,可以根据实际情况指定类型

5. ModelAttribute注解方式

@ModelAttribute注解的方法,会优于Controller之前执行,一般更常见于向视图传输数据使用。

6. Path参数

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

http://127.0.0.1:8080/webs/demo/req4?password=123456

上面这个url中,password是我们传统意义上的请求参数,其中path参数则是指其中 req4, demo这种path路径中的一环;

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

@RequestMapping(path = "req6/{user}/info")
public String req6(@PathVariable(name = "user") String user) {
return "req6 user: " + user;
}
  • path参数的使用,需要确保参数存在且类型匹配
  • path参数和url参数不会相互影响

二、POST请求参数获取

POST请求参数,更多的是看提交表单参数是否可以获取到,以及如何获取。

2.1 HttpServletRequest方式获取参数

测试:

# case1
curl -d "user=小灰灰Blog&password=123456" "http://127.0.0.1:8080/webs/demo/req1"
## 输出: req1 user: 小灰灰Blog pwd: 123456 # case2
curl -d "user=小灰灰Blog" "http://127.0.0.1:8080/webs/demo/req1?password=123456"
## 输出:req1 user: 小灰灰Blog pwd: 12345 # case3
curl -d "user=小灰灰Blog" "http://127.0.0.1:8080/webs/demo/req1?user=greyBlog"
## 输出:req1 user: greyBlog pwd: null

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

var formData = new FormData();
formData.append("user", "小灰灰Blog"); $.ajax({
url: 'http://127.0.0.1:8080/webs/demo/req1?password=123456',
type: 'post',
cache: false,
data: formData,
processData: false,
contentType: false
});
  • 对于HttpServletReuqest方式获取参数时,get和post没什么区别
  • 若url参数和表单参数同名了,测试结果显示使用的是url参数。

2.2 方法参数获取

# case 1
curl -d "user=小灰灰Blog&password=123456" "http://127.0.0.1:8080/webs/demo/req2"
## 输出: req2 user: 小灰灰Blog pwd: 123456 # case 2
curl -d "password=123456" "http://127.0.0.1:8080/webs/demo/req2"
## 输出:req2 user: null pwd: 123456 # case 3
curl -d "password=123456" "http://127.0.0.1:8080/webs/demo/req2?user=blog"
## 输出: req2 user: blog pwd: 123456

2.3 RequestParam注解方式

# case 1
curl -d "password=123456&user=blog" "http://127.0.0.1:8080/webs/demo/req3"
## 输出: req3 user: blog pwd: 123456 # case 2
curl -d "password=123456" "http://127.0.0.1:8080/webs/demo/req3?user=blog"
## 输出: req3 user: blog pwd: 123456 # case 3
curl -d "password=123456&user=blog" "http://127.0.0.1:8080/webs/demo/req3?password=900"
## 输出:req3 user: blog pwd: 900,123456
  • 和前面的两种方式不同的是,当post表单的参数和url参数同名时,会合并成一个字符串

2.4 Bean方式

## case1
curl -d "password=123456&user=blog" "http://127.0.0.1:8080/webs/demo/req4?password=900"
## 输出 req4 userDO: DemoController.UserDO(user=blog, password=900,123456) ## case2
curl -d "password=123456&user=blog" "http://127.0.0.1:8080/webs/demo/req4"
## 输出 req4 userDO: DemoController.UserDO(user=blog, password=123456) ## case3
curl -d "password=123456" "http://127.0.0.1:8080/webs/demo/req4"
## 输出 req4 userDO: DemoController.UserDO(user=null, password=123456)

2.5 PathVariable

三、多媒体上传参数获取

@RequestMapping(path = {"wx/upload", "wx/wx/upload"}, method = {RequestMethod.GET, RequestMethod.POST, RequestMethod.OPTIONS})
@ResponseBody
public String upload(HttpServletRequest request) {
MultipartFile file = null;
if (request instanceof MultipartHttpServletRequest) {
file = ((MultipartHttpServletRequest) request).getFile("image");
} if (file == null) {
throw new IllegalArgumentException("图片不能为空!");
} return "success";
}
  • 主要是利用HttpServletRequest来获取上传的文件
  • 如果接口必须要求上传文件,可以直接把参数声明为 MultipartHttpServletRequest, 此时调用方如果不传参数,会被异常拦截(可以通过@ControllerAdvice来拦截全局异常)
  • 如果可以不上传文件,则可以用上面的这种猥琐姿势,内部进行判断
  • ((MultipartHttpServletRequest) request).getFile(xxx)来获取指定名的上传文件

四、小结

五种方法获取参数:




原文:

灰灰Blog

SpringMVC请求参数的获取方式的更多相关文章

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

    转载出处:https://www.toutiao.com/i6510822190219264516/ SpringMVC之请求参数的获取方式 常见的一个web服务,如何获取请求参数? 一般最常见的请求 ...

  2. SpringMVC请求参数接收总结

    前提 在日常使用SpringMVC进行开发的时候,有可能遇到前端各种类型的请求参数,这里做一次相对全面的总结.SpringMVC中处理控制器参数的接口是HandlerMethodArgumentRes ...

  3. SpringMVC请求参数接收总结(一)

    前提 在日常使用SpringMVC进行开发的时候,有可能遇到前端各种类型的请求参数,这里做一次相对全面的总结.SpringMVC中处理控制器参数的接口是HandlerMethodArgumentRes ...

  4. SpringMVC请求参数总结

    前提 在日常使用SpringMVC进行开发的时候,有可能遇到前端各种类型的请求参数,这里做一次相对全面的总结.SpringMVC中处理控制器参数的接口是HandlerMethodArgumentRes ...

  5. 2.5万字长文简单总结SpringMVC请求参数接收

    这是公众号<Throwable文摘>发布的第22篇原创文章,暂时收录于专辑<架构与实战>.暂定下一篇发布的长文是<图文分析JUC同步器框架>,下一篇发布的短文是&l ...

  6. springmvc请求参数异常统一处理

    1.ExceptionHandlerController package com.oy.controller; import java.text.MessageFormat; import org.s ...

  7. springmvc请求参数异常统一处理,结合钉钉报告信息定位bug位置

    参考之前一篇博客:springmvc请求参数异常统一处理 1.ExceptionHandlerController package com.oy.controller; import java.tex ...

  8. springmvc请求参数的绑定和获取

    请求参数的绑定和获取: 获取页面请求的参数,是javaweb必不可少的一个环节,在struts中,是通过再Action中定义属性,或者Model的方式进行数据绑定和获取.需要提供setter或gett ...

  9. springmvc请求参数获取的几种方法

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

随机推荐

  1. TodoMVC Example知识点总结

    案例来自于vue.js的官方示例:https://cn.vuejs.org/v2/examples/todomvc.html,我在案例学习过程中,试着对其中的一些知识点进行记录: 一.浏览器数据存储, ...

  2. jsonp详解及跨域请求

    什么是JSONP? JSON是一种轻量级的数据传输格式语言,被广泛应用于当前Web应用中.JSON格式数据的编码和解析基本在所有主流语言中都被实现,所以现在大部分前后端分离的架构都以JSON格式进行数 ...

  3. 重温Java JDK安装,希望帮助更多的学习在路上的小白

    JDK卸载和安装 现在JDK已经升级到JDK11版本了,但是JDK1.8(JDK8)仍然有很多小伙伴在使用,这里也记录一下jdk1.8的下载及安装过程,对于刚学习java的小伙伴可以参考,熟手可忽略, ...

  4. JavaScript AMD模块化规范

    浏览器环境 有了服务器端模块以后,很自然地,大家就想要客户端模块.而且最好两者能够兼容,一个模块不用修改,在服务器和浏览器都可以运行. 但是,由于一个重大的局限,使得CommonJS规范不适用于浏览器 ...

  5. SpringBoot项目,如何优雅的把接口参数中的空白值替换为null值?

    问题发生 我们公司代码生成的时候,查询列表统一都是使用了setEntity() ,查询写法如下: public List<BasReservoirArea> selectList(BasR ...

  6. L(kali)A(apache)M(mysql)P(php)环境+wordpress站点搭建

    一:LAMP环境配置 首先LAMP(linux+apache+mysql+php)即为本次搭建网站所需的环境,由于本次使用的debian衍生版kali版本自带lamp,因此只要在服务器上启动相应服务既 ...

  7. Head First 设计模式 —— 15. 与设计模式相处

    模式 是在某情境(context)下,针对某问题的某种解决方案. P579 情景:应用某个模式的情况 问题:你想在某情境下达到的目标,但也可以是某情境下的约束 解决方案:一个通用的设计,用来解决约束. ...

  8. 【Linux】fdisk -l发现有加号"+"

    今天分区不够了,打算扩下分区,想起当时创建机器的时候还有大约80多个G没有用,今天打算重新利用上 就用了fdisk /dev/sda 创建了两个分区,但是发现分区下面有加号,感到而别的困惑 最后在很多 ...

  9. 【Oracle】下载11.2.0.4的地址

    https://updates.oracle.com/download/13390677.html 这个地址就是下载Oracle 11.2.0.4版本的地址,需要有metalink账号才可以下载

  10. PeleeNet:精修版DenseNet,速度猛增至240FPS | NeurIPS 2018

    PeleeNet是DenseNet的一个变体,没有使用流行的深度可分离卷积,PeleeNet和Pelee仅通过结构上的优化取得了很不错的性能和速度,读完论文可以学到很多网络设计的小窍门.   来源:晓 ...