【Spring MVC】这几种传参方式这么强大,让我爱不释手,赶快与我一起去领略吧 ! ! !

news2025/2/1 19:41:44

前言:
大家好,我是良辰丫,在上2一篇文章中我们已经初步认识了Spring MVC,并且学习了热部署的配置,今天我们将继续开始我们的Spring MVC的学习! ! !💌💌💌

🧑个人主页:良辰针不戳
📖所属专栏:javaEE进阶篇之框架学习
🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。
💦期待大家三连,关注,点赞,收藏。
💌作者能力有限,可能也会出错,欢迎大家指正。
💞愿与君为伴,共探Java汪洋大海。

在这里插入图片描述

目录

  • 1. Spring MVC
  • 2. 整型等基本类型传参的问题
  • 3. 参数传递对象
  • 4. 表单传递参数
  • 5. 后端参数重命名(映射)
  • 6. 后端接收前端的JSON对象
  • 7. 获取URL中参数
  • 8. 上传文件

1. Spring MVC

  • 我们在上一篇文章了学习了Spring MVC在Spring Boot的重要性,但是Spring MVC毕竟不是Spring Boot,我还是带大家一起去了解一下Spring MVC.
  • Spring MVC是Spring Framework提供的Web组件,全称是Spring Web MVC,是目前主流的实现MVC设计模式的框架,提供前端路由映射、视图解析等功能.
  • 有人可能会问?这就够了?确实够了,咱们已经会使用Spring MVC了,现在我们又了解了Spring MVC在Spring Boot中干了什么,这就够了,在我们脑海中一定默念Spring MVC并不是Spring Boot.

2. 整型等基本类型传参的问题

在上一篇文章我们学习了基本参数的参数的传递,但忽略了一个细节,我们来看一下是什么呢?

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user3")
public class User3 {
    @RequestMapping("/hello")
    public String say(int id){
        return id + " , " + "叶良辰";
    }
}

当我们代码中传递的是整型的基本参数的时候,如果访问页面的时候进行传参了,那么能够访问成功.

在这里插入图片描述

但是当我们访问页面不进行传参的时候,页面就会报错.

在这里插入图片描述
如果我们把基本类型换成包装类型呢,我们把int换成Integer?

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user3")
public class User3 {
    @RequestMapping("/hello")
    public String say(Integer id){
        return id + " , " + "叶良辰";
    }
}

在这里插入图片描述

我们会发现访问页面不传参的时候,属性会为null,但并不会报错.

3. 参数传递对象

我们的Student类还是使用Lombok的注解,毕竟这个东西是真的香.

package com.example.demo;

import lombok.Data;

@Data
public class Student {
    private int id;
    private String name;
}

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user4")
public class User4 {
    @RequestMapping("/show")
    public String show(Student student){
        return student.toString();
    }
}

在这里插入图片描述

4. 表单传递参数

在这里我们先用postman构造,后面我们会血洗前后端交互,大家不要着急哦.

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user5")
public class User5 {
    @RequestMapping("/show")
    public Object func(int id,String name){
        return "/test.html";
    }
}

在这里插入图片描述

5. 后端参数重命名(映射)

  • 有时候前端传递的参数 key 和我们后端接收的 key 可以不⼀致,⽐如前端传递了⼀个num 给后端,⽽后端⼜是有 id 字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使⽤ @RequestParam 来重命名前后端的参数值。
  • 也就是通过RequestParam这个注解,前后端字段名字不一样的时候也可以进行交互.
package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/user6")
@RestController
public class User6 {
    @RequestMapping("/show")
    public String show(@RequestParam("num") Integer id, 
                       @RequestParam("str") String name){
        return "id : "+id+"<br>"
                +"name : "+name;
    }
}

在这里插入图片描述

@RequestParam这个注解还有隐藏的功能,进入该注解的源码中,我们会发现,它有一个required方法,表示请求,它默认为true,也就是说如果有参数前端页面必须要传.

在这里插入图片描述

前端页面没有传它有的某个参数的时候,它会报错.

在这里插入图片描述

我们接下来把name属性修改为false,这个时候呢,不传该参数也不会报错.

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/user6")
@RestController
public class User6 {
    @RequestMapping("/show")
    public String show(@RequestParam("num") Integer id,
                       @RequestParam(value = "str",required = false) String name){
        return "id : "+id+"<br>"
                +"name : "+name;
    }
}

在这里插入图片描述

6. 后端接收前端的JSON对象

  • 很多情况下前后端的交互是通过json的格式来进行传递的,因此呢,这种方式是我们必须掌握的.
  • json是通过body来构造请求的,post请求中有body,get请求往往没有body,因此我们采取post的方式.

后端代码如下:

package com.example.demo;

import lombok.Data;

@Data
public class Student {
    private int id;
    private String name;
}

package com.example.demo;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user7")
public class User7 {
    @PostMapping("/show")
    public String show(@RequestBody Student student){
        return student.toString();
    }
}

接下来我们通过postman来构造前端的json请求.

在这里插入图片描述

7. 获取URL中参数

这种方式不需要去使用问号去连接,我们可以按照我们指定的方式.

package com.example.demo;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/user8")
@RestController
public class User8 {
    @RequestMapping("/login/{username}/{password}")
    public String login(@PathVariable("username") String username,
                        @PathVariable("password") String password) {
        return "账号 : "+username + "<br>" + "密码 : "+password;
    }
}

在这里插入图片描述

当然我们也可以在我们的传参中加上别的东西,比如and,加了之后,必须要按照这种格式进行页面访问.

package com.example.demo;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/user8")
@RestController
public class User8 {
    @RequestMapping("/login/{username}/and/{password}")
    public String login(@PathVariable("username") String username,
                        @PathVariable("password") String password) {
        return "账号 : "+username + "<br>" + "密码 : "+password;
    }
}

在这里插入图片描述

8. 上传文件

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
@RequestMapping("/user9")
@RestController
public class User9 {
    @RequestMapping("/file")
    public String upfile(@RequestPart("myfile") MultipartFile file) throws IOException {
        String path = "D:\\aaa\\img.png";
        // 把文件保存到path路径
        file.transferTo(new File(path));
        return path;
    }
}

我们使用postman来构造一下上传图片的请求.

  • 自己输入自己后端定义的key : myfile.
  • 选择file.
  • select选择自己要上传的图片
  • 点击send上传成功.

在这里插入图片描述

我们接下来看一下我们的文件夹里面是否有该图片,可见图片已经保存在该路径下.

在这里插入图片描述

但是在这里我们有发现一系列的问题.

  • 如果我们多次上传不同的图片,新的图片就会把旧的图片覆盖掉.
  • 这里指的是上传文件,但是我们已经指定了后缀,那么如果我们想上传别的文件呢?
  • 一系列的问题油然而生,接下来我们就要去解决它.

我们的做法是把目录的每个部分进行拼接.

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

@RestController
@RequestMapping("/user10")
public class User10 {
    @RequestMapping("/file")
    public String myUpFile(@RequestPart("myfile") MultipartFile file) throws IOException {
        // 根目录
        String path = "D:\\aaa\\";
        // 根目录 + 文件名(这是随机生成的)
        path += UUID.randomUUID().toString().replace("-", "");
        // 根目录 + 文件名 + 文件的后缀(这是截取到的)
        path += file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        // 保存到指定的路径中
        file.transferTo(new File(path));
        return path;
    }
}

在这里插入图片描述

现在我们可以上传各种各样的代码.

在这里插入图片描述

后序:
今天我们的内容到这里就结束了,想必大家已经对Spring MVC的几种传参方式熟悉了,希望小小的文章可以帮助到大家.🚀🚀🚀

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

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

相关文章

JDK9~17+Springboot3 @Resource常见问题和解决方案

一、常见问题描述 因为JDK版本升级的改动&#xff0c;在Jdk9~17环境下&#xff0c;搭建Springboot项目&#xff0c;会出现原有Resource&#xff08;javax.annotation.Resource&#xff09;不存在的问题&#xff0c;导致项目从Jdk8迁移到高版本时遇到的问题 原因 你可能会问&…

TiDB亿级数据亚秒响应查询将MySql数据全量迁移到TiDB

目录 1 下载安装TiDB工具包1.1 检查最新版本1.2 下载tidb-toolkit 2 Dumpling导出数据2.1 Dumpling工具简介2.2 导出需要的权限2.3 创建用户并授权2.4 验证数据库2.5 导出sql文件2.6 查看导出文件 3 TiDB Lightning导入数据3.1 TiDB Lightning简介3.2 TiDB Lightning 整体架构3…

蓝桥杯【第14届国赛】Python B组

本题解仅代表个人观点&#xff0c;仅供参考&#xff0c;欢迎各位指正 A&#xff1a;弹珠堆放 【问题描述】 小蓝有 20230610 颗磁力弹珠&#xff0c;他对金字塔形状尤其感兴趣&#xff0c;如下图所示&#xff1a; 高度为 1 的金字塔需要 1 颗弹珠&#xff1b; 高度为 2 的金字…

【Jetpack】使用 Room 中的 Migration 升级数据库异常处理 ( 多个数据库版本的迁移 | fallbackToDestructiveMigration() 函数处理升级异常 )

文章目录 一、Room#Migration 迁移工具升级数据库二、多个数据库版本的迁移三、数据库异常处理 - RoomDatabase.Builder#fallbackToDestructiveMigration() 函数四、完整代码示例 一、Room#Migration 迁移工具升级数据库 Room Migration 数据库迁移工具 是 Android Jetpack Arc…

【AI实战营第二期】第三次作业——基于 RTMDet 的气球检测(包含数据集)

作业&#xff1a;基于 RTMDet 的气球检测 背景&#xff1a;熟悉目标检测和 MMDetection 常用自定义流程。 任务&#xff1a; 基于提供的 notebook&#xff0c;将 cat 数据集换成气球数据集; 按照视频中 notebook 步骤&#xff0c;可视化数据集和标签; 使用MMDetection算法库…

01_Linux字符设备驱动开发

目录 字符设备驱动简介 驱动模块的加载和卸载 字符设备注册与注销 实现设备的具体操作函数 添加LICENSE和作者信息 Linux设备号的组成 设备号的分配 chrdevbase字符设备驱动开发实验 创建VSCode工程 添加头文件路径 编写实验程序 C库文件操作基本函数 编写测试APP…

苹果Vision Pro正式发布,下一个iPhone诞生了?

在库克即将退休之际&#xff0c;苹果开启了下一个十年。 2023年6月6日&#xff0c;在苹果WWDC开发者大会上&#xff0c;苹果发布了15寸的MacBook Air&#xff0c;以及一众iOS 17、iPad OS 17、Mac OS等系统的更新。当我们觉得这些常规更新有点不痛不痒&#xff0c;甚至想大呼“…

​selenium中元素定位正确但是操作失败,6种解决办法全稿定

selenium中元素定位正确但是操作失败的原因无外乎以下4种&#xff1a; 一、页面没加载好 解决方法&#xff1a;添加等待方法&#xff0c;如&#xff1a; time.sleep() 二、页面提交需要等待给数据后台 解决方法&#xff1a;添加等待方法&#xff0c;如&#xff1a; time.sl…

一套完整的三甲医院医学影像科PACS系统源码

一、PACS系统概述&#xff1a; 基于VC MSSQL开发的一套三甲医院医学影像PACS系统源码&#xff0c;集成3D影像后处理技术和功能&#xff0c;包括三维多平面重建、三维容积重建、三维表面重建、三维虚拟内窥镜、最大/小密度投影、心脏动脉钙化分析等能满足影像科功能。 二、PAC…

C/C++ 作用域,生命周期,执行线程的概念

相互影响 在C中&#xff0c;对象的生命周期、作用域和执行线程是三个相互关联但又相对独立的概念。它们共同决定了对象在程序中的行为和状态。下面我将详细解释这三个概念以及它们之间的关系和互相影响。 生命周期&#xff1a;对象的生命周期是指从对象被创建&#xff08;构造…

Python暑假自律打卡学习班,免费,速来(2)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 和猫妹学Python&#xff0c;一起趣味学编程。 很快就放暑假了&#xff0c;还有20多天吧&#xff01; 猫妹对这个暑假相当期待啊&#xff0c; 想想今年的五一劳动节有多火爆…

仙境传说RO:npc汉化方法

仙境传说RO&#xff1a;npc汉化方法 大家好我是艾西&#xff0c;在我们说了那么多期的教程中大家应该有发现游戏内很多都还是英文的&#xff0c;如果对于国内的玩家开展这个游戏可能有些不熟悉的小伙伴玩起来会有点难受&#xff0c;今天艾西跟大家分享下怎么汉化NPC等。 我们…

异常数据检测 | Python实现基于高斯概分布的异常数据检测

文章目录 文章概述模型描述源码分享学习小结参考资料文章概述 高斯分布也称为正态分布。它可以被用来进行异常值检测,不过我们首先要假设我们的数据是正态分布的。不过这个假设不能适应于所有数据集。但如果我们做了这种假设那么它将会有一种有效的方法来发现异常值。 模型描述…

多元分类预测 | Matlab人工蜂群算法(ABC)优化随机森林(RF)的分类预测,ABC-RF分类预测模型,多输入单输出模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab人工蜂群算法(ABC)优化随机森林(RF)的分类预测,ABC-RF分类预测模型,多输入单输出模型 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,…

「一文讲透」快消行业营销数字化转型

历经疫情的洗礼&#xff0c;各行业都在开启新一轮市场需求的盘点&#xff0c;无论消费者习惯、市场零售终端还是渠道分销。在供需变革、消费升级、服务传达诸多方面&#xff0c;都对品牌商产-营-销-服系统化管理提出了新的挑战。 面对激烈的市场环境竞争&#xff0c;品牌商核心…

代码随想录第56天

1.两个字符串的删除操作 动规五部曲&#xff0c;分析如下&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结尾的字符串word2&#xff0c;想要达到相等&#xff0c;所需要删除元…

2023了,软件测试如何获得高薪?

做自动化测试后悔吗&#xff1f; 后悔&#xff0c;真的后悔&#xff01; 后悔没有早点学..... 虽然到处都在散播35的焦虑&#xff0c;姑且信之&#xff0c;那么反问你&#xff0c;如果你30岁了&#xff0c;那么给你5年&#xff0c;能够在某个领域成为专家呢&#xff1f;希望你…

『手撕 Mybatis 源码』05 - SqlSession 执行主流程

SqlSession 执行主流程 获取 BoundSql 经过加载完所有配置之后&#xff0c;继续梳理执行 sql 的过程 public class MybatisTest {Testpublic void test1() throws IOException {...// 4. 委派给 Executor 来执行&#xff0c;Executor 执行时又会调用很多其他组件&#xff08…

ceph分布式存储

1、存储基础 //单机存储设备 ●DAS&#xff08;直接附加存储&#xff0c;是直接接到计算机的主板总线上去的存储&#xff09; IDE、SATA、SCSI、SAS、USB 接口的磁盘 所谓接口就是一种存储设备驱动下的磁盘设备&#xff0c;提供块级别的存储 ●NAS&#xff08;网络附加存储&am…

LCHub 6 月低代码平台排行榜发布

LCHub低代码平台排行榜 2023 国产低代码名录和产品信息一览 2023国产低代码平台排行榜 低代码最新视频课程 最新解读报告:2023年6月低代码平台排行榜:维格表 伙伴云上升最快 共有120个低代码平台参与排名, 点击查看排名规则更新 TOP 10 低代码平台 6月 LCHub 指数走势