Spring MVC 之获取参数(对象、JSON格式数据、URL地址参数、文件、Cookie)

news2025/6/5 17:34:59

文章目录

  • 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) {
        // 得到全部 Cookie
        Cookie[] 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;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/334673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【GD32F427开发板试用】SysTick定时器的ms中断,us计时

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:远小刘 1、系统滴答定时器 参考资料《Cortex M3与M4权威指南.pdf》中的9.5 The SysTick timer小节,里面详细讲解了 1、为什么要用…

一分钟教会使用ChatGPT,保姆级ChatGPT教程

最近ChatGPT大火!微软退出首款ChatGPT搜索引擎,阿里等国内巨头也纷纷爆出自家产品,一夜之间,全球最大的科技公司仿佛都回到了自己年轻时的样子! 然而,ChatGPT这么火,这么好玩的东西&#xff0c…

Knowledgeowl VS Baklib:你需要知道的一切!

KnowledgeOwl 和 Baklib都是知识库软件的示例。您可以使用每个平台为用户创建自己的知识库和托管文档。每个平台都允许您从同一帐户创建多个知识库,并且可以为用户提供内部和外部知识库。什么是知识库?知识库是一个集中的信息存储库,旨在为无…

Koa2-项目中的基本应用

文章目录安装配置koa2配置nodemon,热更新我们的项目中间件什么是中间件👻洋葱模型路由中间件连接数据库 - mysql后端允许跨域处理请求getpostputdelete后续会继续更新安装配置koa2 👻安装 koa2 npm i koa2 -s👻在package.json 配置,当然是在…

用LCR测试仪测试无线充电系统中的线圈

宽阻抗范围用来表征电感和质量因数– 高精度 DCR 测量– 制造环节快速测量– 大量夹具可供选择智能终端上不断增加新功能,电池寿命成为用户最头痛的问题之一。相比便携式电源和电缆供电而言,无线充电技术因其方便性和多功能性获得了很大的关注&#xff0…

MySQL —— 表的增删查改(一)

目录 表的增删查改(一) 一、create 1. 单行数据全列插入 2. 多行数据指定列插入 3. 插入否则更新 4. 替换 二、Retrieve 1. select列 1. 全列查询 2. 指定列查询 3. 查询字段为表达式 4. 为查询结果指定别名 5. 结果去重 2. where条件 1…

辞旧岁立新年 | 展望前端工程师的2023

「InfoQ 年度技术盘点与展望」是由InfoQ主办的年度技术盘点与展望项目,是 InfoQ 全年最重要的内容选题之一。 近日,字节跳动云原生 PaaS 资深前端工程师黄健受邀参与,分享主题为 《展望前端研发工程师的 2023》 。本文整理自黄健于直播中分享…

中国区注册OpenAI账号,试用ChatGPT指南

OpenAI最近推出ChatGPT,但国内(包括香港)并不支持OpenAI账号注册,多数会提示: OpenAI’s services are not available in your country. 前期准备 科学上网,最好是美国IP(可以购买v屁n&…

(三)循环神经网络RNN之LSTM和GRU

LSTM介绍 LSTM(Long Short Term Memory)是 Hochreater 和 Schmidhuber 在 1997 年提出的一种网络结构,尽管该模型在序列建模上的特性非常突出,但由于当时正是神经网络的下坡期,没有能够引起学术界足够的重视。随着深度学习逐渐发展&#xff…

【数据结构-JAVA】排序

排序在现实生活中的应用可谓相当广泛,比如电商平台中,选购商品时,使用价格排序或是综合排序、高考填报志愿的时候,会参考全国大学排名的情况。下面介绍一些计算机中与排序相关的概念:排序:所谓排序&#xf…

超详细的JAVA高级进阶基础知识03

目录 3. 面向对象高级 - 常用的API 3.1 Object 类 3.1.1 Object 类介绍 3.1.2 Object类的常用方法: 3.1.3 Objects 概述 3.2 Math 类 3.3 System 类 3.3.1 System 类概述 3.3.2 常用方法 3.4 BigDecimal 类 3.4.1 BigDecimal 类概述 3.4.2 BigDecimal 类…

windows 编译 open3d 下

1.安装cmake 快速通道:链接:https://pan.baidu.com/s/1gZYAlGRRj4UVGgaTBaZXjg?pwd1klo 提取码:1klo --来自百度网盘超级会员V4的分享警告不用管编译中成功就是61开始配置 cmake 那时候选的路径glew.libglfw3.libjsoncpp.libOpen3D.libpng.l…

jdk和Android sdk 和 ndk 和 apache-ant环境变量配置

ANDROID_HOMEG:\android-sdk-windowsCLASSPATH.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\jre\lib\rt.jar;%JAVA_HOME%\lib\dt.jar;%ANT_HOME%\libJAVA_HOMEC:\Program Files (x86)\Java\jdk1.8.0_361NDK_HOMEG:\android-ndk-r25cant下载https://www.likecs.com…

win环境安装部署Jenkins

win环境安装部署Jenkins,2022年11月:从2022年 6 月 28 日发布的 Jenkins 2.357 和2022年9 月发布的 LTS 版本开始,Jenkins 需要 Java 11 才能使用,放弃 Java 8,如果用JDK1.8,那么Jenkins版本需要是2.357版本…

ChatGPT逐鹿:谷歌“翻车”,微软抢跑,国内概念股狂飙

2023年开年才一个月,微软、谷歌两大巨头在AI战场就上演了“神仙打架”。 1月里两家公司围绕OpenAI和ChatGPT发布的密集消息余温尚在,2月7日,谷歌就官宣了自家的ChatGPT竞品Bard,并发布演示Demo。2月8日,微软直接上线了…

室内三维地图怎么做的?室内地图怎么做好看?

室内导航、定位中须采用基于建筑平面图生产的室内地图,现有的生产室内地图的方法都是依靠人工去根据建筑平面图使用矢量绘图工具去绘制矢量化的室内地图示意图,然后再去标明具体的区域名称功能或者标注位置点。因此制作室内地图往往都比较耗时&#xff0…

blender基础操作

shiftc:游标回到世界中心 shifta: 添加物体 gx或y或z:沿x轴或y轴或z轴移动 gx加数字:往x轴方向移动几格 rx加度数:绕x轴旋转多少度 分割界面:右键单击间隙,选择verticle tab: 来回切换编辑界面和物体界面&…

下班前几分钟,逮到一个腾讯10年老测试开发,聊过之后大彻大悟...

优秀的人真的是比比皆是,不比不知道,一比吓一跳 老话说的好,这人呐,一单在某个领域鲜有敌手了,就会闲得蛋疼。就在昨天下班的前几分钟认识了一个在阿里工作了 10 年的测试开发,因为本人天赋比较高&#xff…

Nacos 配置管理最佳实践

作者:翼严 Nacos 简介 Nacos 是一个更易于构建云原生应用的微服务基础平台,核心包含动态服务发现,配置管理,服务管理平台。 配置管理是 Nacos 的核心功能,它提供了运行期不重启应用的情况下动态修改配置值的功能。 …

修改Vue项目运行的IP和端口

前言 我们在使用VsCode启动Vue项目的时候,我发现:默认的端口号好像和tomcat一样,默认都是8080,如果8080被占用了,就会使用8081,8082这样的方式以此类推。 那么,我们是否可以像后端一样,通过修改…