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 的…...

元宵晚会节目预告没有岳云鹏,是不敢透露还是另有隐情
在刚刚结束的元宵节晚会上,德云社的岳云鹏,再一次参加并引起轰动,并获得了观众朋友们的一致好评。 不过有细心的网友发现,早前央视元宵晚会节目预告,并没有看到小岳岳,难道是不敢提前透露,怕公布…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001
qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类,直接把源文件拖进VS的项目里,然后VS卡住十秒,然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分,导致编译的时候找不到了。因…...