Spring MVC 之获取参数(对象、JSON格式数据、URL地址参数、文件、Cookie)
文章目录
- 1. 获取单个参数
- 2. 获取多个参数
- 3. 获取对象
- 4. 后端参数重命名 @RequestParam
- 5. 接收 JSON 格式的数据 @RequestBody
- 6. 从 URL 地址中获取参数 @PathVariable
- 7. 上传文件 @RequestPart
- 8. 获取Cookie (@CookieValue)/Session/header
- 8.1 获取 Request 和 Response 对象
- 8.2 获取 Cookie
- 8.3 获取 Header(请求头)里面的信息
- 8.4 存储和获取 Session
服务器端要得到用户的请求参数
@Data
public class UserInfo {private int id;private String username;private String password;private int age;
}
1. 获取单个参数
注意这里的参数类型要用 包装类,否则传一个空的值就会出错, 并且这里的参数一定要和前端传递的参数名保持一致,否则就获取不到参数的值了
@Controller
@ResponseBody // 作用: 表示的是返回一个非静态页面的数据
@RequestMapping("/user") // 类上的 RequestMapping 可以省略
public class UserController {@RequestMapping("/getuserbyid")public UserInfo getUserById(Integer id) { //两种命名方式 getUserById | findUserById// 不查数据库,伪代码,返回用户对象UserInfo userInfo = new UserInfo();userInfo.setId(id);userInfo.setUsername("张三");userInfo.setAge(18);return userInfo;}
}

2. 获取多个参数
@Controller
@ResponseBody // 作用: 表示的是返回一个非静态页面的数据
@RequestMapping("/user") // 类上的 RequestMapping 可以省略
public class UserController {@RequestMapping("/login")public String login(String username, String password) {return "用户名: " + username + " | 密码: " + password;}
}

3. 获取对象
如果要获取的参数很多的话,也可以按照第二种方法来写,但是从代码的美观和维护角度来看,就不太建议这样来写了
Spring MVC 可以自动实现参数对象的赋值
@Controller
@ResponseBody // 作用: 表示的是返回一个非静态页面的数据
@RequestMapping("/user") // 类上的 RequestMapping 可以省略
public class UserController {@RequestMapping("/reg")public String reg(UserInfo userInfo) {return "用户信息:" + userInfo;}
}

4. 后端参数重命名 @RequestParam
有些特殊情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,比如前端传递了一个 time 给后端,而后端又是用 createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用 @RequestParam 来重命名前后端的参数值
@Controller
@ResponseBody // 作用: 表示的是返回一个非静态页面的数据
@RequestMapping("/user") // 类上的 RequestMapping 可以省略
public class UserController {@RequestMapping("/login")public String login(@RequestParam(value = "name", required = false) String username, String password) {return "用户名: " + username + " | 密码: " + password;}
}


5. 接收 JSON 格式的数据 @RequestBody
服务器端实现 JSON 数据的接收需要使用 @RequestBody 注解
@Controller
@ResponseBody // 作用: 表示的是返回一个非静态页面的数据
@RequestMapping("/user") // 类上的 RequestMapping 可以省略
public class UserController {@RequestMapping("/reg")public String reg(@RequestBody UserInfo userInfo) {return "用户信息:" + userInfo;}
}

6. 从 URL 地址中获取参数 @PathVariable
@Controller
@ResponseBody // 作用: 表示的是返回一个非静态页面的数据
@RequestMapping("/user") // 类上的 RequestMapping 可以省略
public class UserController {@RequestMapping("/hero/{id}/{name}")public String getHeroInfo(@PathVariable String id, @PathVariable String name) {return "ID:" + id + " | Name: " + name;}
}

7. 上传文件 @RequestPart
@Slf4j
@Controller
@ResponseBody // 作用: 表示的是返回一个非静态页面的数据
@RequestMapping("/user") // 类上的 RequestMapping 可以省略
public class UserController {@RequestMapping("/upimg")public boolean upImg(Integer uid, @RequestPart("img") MultipartFile file) {boolean result = false;// 保存图片到本地目录try {file.transferTo(new File("D:/IDEA/img.png"));result = true;} catch (IOException e) {log.error("上传图片失败: " + e.getMessage());}return result;}
}

文件上传,这样还有一个问题,这里上传文件到的目录是写为固定了的,那么比如说张三上传图片到这个位置,李四上传另一个图片也是到这个位置,李四的图片就会把张三的图片覆盖了,所以说就会有这样的一个问题
针对这个问题可以对上面的代码进行改进,主要就是这三个方面

(1)解决目录问题:不同平台的配置文件设置
比如说在开发环境,需要将上传的文件保存到这个目录,但在生产环境中又需要将文件保存到 Linux 中的某个目录上,如果在开发时写了很多个需要上传文件的目录,那么到项目上线时,需要修改到 Linux 目录,是极为麻烦的,所以这就需要进行不同平台的配置文件设置

application-dev.yml
# 开发环境的配置文件# 图片保存的路径
img:path: D:/IDEA/
application-prod.yml
# 生产环境的配置# 图片保存的路径
img:path: /root/img/
application.yml
# 设置配置文件的运行平台
spring:profiles:active: dev
UserController.java
@Slf4j
@Controller
@ResponseBody // 作用: 表示的是返回一个非静态页面的数据
@RequestMapping("/user") // 类上的 RequestMapping 可以省略
public class UserController {// 从配置文件中读取图片的保存路径@Value("${img.path}")private String imgPath;@RequestMapping("/sayhi")public String sayHi() {return "66666" + imgPath;}
}
如果 application.yml 中设置的配置文件运行平台是开发环境,也就是 application-dev.yml,运行程序可以看到

反之如果在 application.yml 中设置为生产环境,运行程序

(2)生成图片名称:UUID

(3)获取原图片的上传格式:获取原文件名称,并根据原文件名称的后缀,来截取 “.” 后面的字符
@Slf4j
@Controller
@ResponseBody // 作用: 表示的是返回一个非静态页面的数据
@RequestMapping("/user") // 类上的 RequestMapping 可以省略
public class UserController {// 从配置文件中读取图片的保存路径@Value("${img.path}")private String imgPath;@RequestMapping("/upimg")public boolean upImg(Integer uid, @RequestPart("img") MultipartFile file) {boolean result = false;// 1.目录=imgPath// 2.图片名称(图片名称不能重复,如果重复就会把重名的图片覆盖)【UUID】// 3.获取原上传图片的格式(获取原文件名称,并根据原文件名称的后缀,来截取 “.” 后面的字符)String fileName = file.getOriginalFilename(); // 得到原图片的名称(xxx.png)fileName = fileName.substring(fileName.lastIndexOf(".")); // 得到图片后缀 (png)fileName = UUID.randomUUID().toString() + fileName; //UUID + 后缀格式// 保存图片到本地目录try {
// file.transferTo(new File("D:/IDEA/img.png"));file.transferTo(new File(imgPath+fileName));result = true;} catch (IOException e) {log.error("上传图片失败: " + e.getMessage());}return result;}
}
可以看到这里使用 Postman,多点几次 Send,每次上传图片的名字是不同的

8. 获取Cookie (@CookieValue)/Session/header
8.1 获取 Request 和 Response 对象
因为 Spring MVC是基于 Servlet 的,所以这里可以直接写
@Slf4j
@Controller
@ResponseBody // 作用: 表示的是返回一个非静态页面的数据
@RequestMapping("/user") // 类上的 RequestMapping 可以省略
public class UserController {@RequestMapping("/sayhi")public String sayHi(HttpServletRequest request) {return "66666" + request.getParameter(("name"));}
}

8.2 获取 Cookie
(1)Servlet 获取 Cookie 的方法
@Slf4j
@Controller
@ResponseBody // 作用: 表示的是返回一个非静态页面的数据
@RequestMapping("/user") // 类上的 RequestMapping 可以省略
public class UserController {@RequestMapping("/cookie")public void getCookie(HttpServletRequest request) {// 得到全部 CookieCookie[] cookies = request.getCookies();for (Cookie item : cookies) {log.info("Cookie Name:" + item.getName() + " | Cookie Value: " + item.getValue());}}
(2)使用 @CookieValue 注解实现 Cookie 的读取
@RequestMapping("/cookie2")public String getCookie2(@CookieValue("666")String cookie) {return "Cookie Value: " + cookie;}
8.3 获取 Header(请求头)里面的信息
(1)Servlet 获取 Header 的方法
@RequestMapping("getua")public String getHead(HttpServletRequest request) {return "header: " + request.getHeader("User-Agent");}

(2)使用 @RequestHeader 注解实现 Header 的获取
@RequestMapping("getua2")public String getHead(@RequestHeader("User-Agent")String userAgent) {return "header: " + userAgent;}

8.4 存储和获取 Session
(1)Session 存储和 Servlet 类似,是使⽤ HttpServletRequest 中获取的
@RequestMapping("/setsess")public boolean setSession(HttpServletRequest request) {boolean result = false;// 1.得到 HttpSession// true =》 如果没有会话,那就创建HttpSession session = request.getSession(true);// 2.使用 setAtt 设置值session.setAttribute("userinfo","userinfo");result = true;return result;}

(2)获取 Session 方法1(Servlet 模式)
@RequestMapping("/getsess")public String getSession(HttpServletRequest request) {String result = null;// 1. 先得到HttpSession 对象HttpSession session = request.getSession(false);// 2. getAttribute 得到 Session 信息if(session != null && session.getAttribute("userinfo") != null) {result = (String) session.getAttribute("userinfo");}return result;}

(3)获取 Seesion 方法2:@SessionAttribute
通常情况下需要添加 required = false ,如果不添加,那么当 session 中不存在此属性的时候程序运行就会报错
@RequestMapping("/getsess2")public String getSession2(@SessionAttribute(value = "userinfo",required = false)String userinfo) {return "会话:" + userinfo;}
相关文章:
Spring MVC 之获取参数(对象、JSON格式数据、URL地址参数、文件、Cookie)
文章目录1. 获取单个参数2. 获取多个参数3. 获取对象4. 后端参数重命名 RequestParam5. 接收 JSON 格式的数据 RequestBody6. 从 URL 地址中获取参数 PathVariable7. 上传文件 RequestPart8. 获取Cookie (CookieValue)/Session/header8.1 获取 Request 和 Response 对象8.2 获取…...
永磁同步电机中BEMF电阻的作用
一、电路原理图 二、原理分析 如图一我们测的是相电压,从理论上我们知道我们测得相电压是一个马鞍波形,马鞍波形中并没有隐含 转子的位置和速度信息。那么为什么我们还要有这样一个电路呢? 这个问题其实困惑了我好久?直到有一天…...
JAVA练习45-二叉树的层序遍历
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 提示:这里可以添加本文要记录的大概内容: 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目二叉树的层序遍历 …...
超高精度PID调节器的特殊功能(3)——变送输出(转发)功能及其应用
摘要:变送输出是高级PID控制器的一项重要扩展功能,可用于多区控制、串级控制、比值控制和差值控制以及数据采集及记录。为展示变送输出功能的强大作用,本文主要针对超高精度VPC 2021系列PID控制器,介绍了变送输出的具体功能、参数…...
【C++】nullptr C++中的空指针(C++11)
前言 在平时我们写C/C代码时你可能会看到有人使用NULL表示空指针,也有人用nullptr表示空指针,那么你可能会很好奇它们都是空指针吗?为什么空指针有两种写法?下面就带你了解这背后的原理。 我们都知道NULL是C语言中的空指针&#x…...
笔试题-2023-大疆-数字IC设计【纯净题目版】
回到首页:2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录 推荐内容:数字IC设计学习比较实用的资料推荐 题目背景 笔试时间:2022.08.07应聘岗位:数字IC设计笔试平台:赛码题目评价 难易程度:★★★★★知识覆盖:★★★☆☆超纲范围:★★★☆☆值得一刷:★★★…...
Python dict字典方法完全攻略(全)
我们知道,Python 字典的数据类型为 dict,我们可使用 dir(dict) 来查看该类型包含哪些方法,例如: >>> dir(dict) [clear, copy, fromkeys, get, items, keys, pop, popitem, setdefault, update, values] keys()、value…...
用“AI“挑选一件智慧礼物
在久违的烟火气回归之际,充满希望的生活可能就从精心挑选一件新年礼物开始。在罗列礼品清单时,你会想到 “数据”也是其中之一吗?事实上,几乎所有时下最受欢迎的带有“智能”一词的设备,都是由大量高质量的数据创建。我…...
【Spark分布式内存计算框架——Spark Core】4. RDD函数(下) 重分区函数、聚合函数
重分区函数 如何对RDD中分区数目进行调整(增加分区或减少分区),在RDD函数中主要有如下三个函数。 1)、增加分区函数 函数名称:repartition,此函数使用的谨慎,会产生Shuffle。 2)、…...
智能工厂自动化设备如何将数据采集到物联网云平台上
制造业工厂在进行生产管理、数字化转型升级的过程中,大量自动化设备的数据采集上云一直是困扰厂商的难题之一。因设备种类多、工艺复杂、设备老旧无多余通信接口导致数据无法集中、工艺无法实时管控,加上设备服务商的本地支持比较有限,因此设…...
SpringBoot整合Mybatis的核心原理
0. 前言:1. 自动配置类MybatisAutoConfiguration:1.1. SqlSessionFactory的生成:1.2. Mapper的扫描和代理生成:1.2.1. MapperScannerConfigurer1.2.2. MapperFactoryBean1.2.3. getMapper生成代理对象2. 小结:0. 前言&…...
滴滴一面:order by 调优10倍,思路是啥?
背景说明: Mysql调优,是大家日常常见的调优工作。 所以,Mysql调优是一个非常、非常核心的面试知识点。 在40岁老架构师 尼恩的读者交流群(50)中,其相关面试题是一个非常、非常高频的交流话题。 近段时间,有小伙伴面…...
Vue框架学习篇(五)
Vue框架学习篇(五) 1 组件 1.1 组件的基本使用 1.1.1 基本流程 a 引入外部vue组件必须要的js文件 <script src"../js/httpVueLoader.js"></script>b 创建.vue文件 <template><!--公共模板内容--></template><script><!…...
(蓝桥杯 刷题全集)【备战(蓝桥杯)算法竞赛-第1天(基础算法-上 专题)】( 从头开始重新做题,记录备战竞赛路上的每一道题 )距离蓝桥杯还有75天
🏆🏆🏆🏆🏆🏆🏆 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录&a…...
C++——继承那些事儿你真的知道吗?
目录1.继承的概念及定义1.1继承的概念1.2 继承定义1.2.1定义格式1.2.2继承关系和访问限定符1.2.3继承基类成员访问方式的变化2.父类和子类对象赋值转换3.继承中的作用域4.派生类的默认成员函数5.继承与友元6. 继承与静态成员7.复杂的菱形继承及菱形虚拟继承如何解决数据冗余和二…...
leetcode 困难 —— N 皇后(简单递归)
(不知道为啥总是给这种简单的递归设为困难题,虽然优化部分很不错,但是题目太好过了) 题目: 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个…...
AWS实战:Dynamodb到Redshift数据同步
AWS Dynamodb简介 Amazon DynamoDB 是一种完全托管式、无服务器的 NoSQL 键值数据库,旨在运行任何规模的高性能应用程序。DynamoDB能在任何规模下实现不到10毫秒级的一致响应,并且它的存储空间无限,可在任何规模提供可靠的性能。DynamoDB 提…...
机器学习评估指标的十个常见面试问题
评估指标是用于评估机器学习模型性能的定量指标。它们提供了一种系统和客观的方法来比较不同的模型并衡量它们在解决特定问题方面的成功程度。通过比较不同模型的结果并评估其性能可以对使用哪些模型、如何改进现有模型以及如何优化给定任务的性能做出正确的决定,所…...
常见的安全问题汇总 学习记录
声明 本文是学习2017中国网站安全形势分析报告. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 2017年重大网站安全漏洞 CVE-2017-3248 :WebLogic 远程代码执行 2017年1月27日,WebLogic官方发布了一个编号为CVE-2017-3248 的…...
元宵晚会节目预告没有岳云鹏,是不敢透露还是另有隐情
在刚刚结束的元宵节晚会上,德云社的岳云鹏,再一次参加并引起轰动,并获得了观众朋友们的一致好评。 不过有细心的网友发现,早前央视元宵晚会节目预告,并没有看到小岳岳,难道是不敢提前透露,怕公布…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
