详解Java之Spring MVC篇一


目录
Spring MVC
官方介绍
MVC
RequestMapping
传递参数
无参数
单个参数
针对String类型
针对Integer类型
针对int类型
针对自定义类型
多个参数
参数重命名
参数强制一致
参数不强制一致
传递数组
编辑传递List
编辑
传递JSON
编辑
从路径中获取参数
获取单个参数
获取多个参数
编辑
上传文件
Spring MVC
官方介绍

翻译:
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC”。
MVC
MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构模式,它把软件系统分
为模型、视图和控制器三个基本部分。

Model(模型)是应⽤程序中⽤于处理应⽤程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
View(视图)是应⽤程序中处理数据显示的部分。通常视图是依据模型数据创建的。
Controller(控制器)是应⽤程序中处理⽤户交互的部分。通常控制器负责从视图读取数据,控制⽤户输⼊,并向模型发送数据。
MVC和Spring MVC的区别
MVC 是⼀种思想,⽽ Spring MVC 是对 MVC 思想的具体实现。
总结来说,Spring MVC 是⼀个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。既然是 Web 框架,那么当⽤户在浏览器中输⼊了 url 之后,我们的 Spring MVC 项⽬就可以感知到⽤户的请求。
RequestMapping
@RequestMapping 是 Spring Web 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的路
由映射的。
路由映射:所谓的路由映射指的是,当⽤户访问⼀个 url 时,将⽤户的请求对应到程序中某个类的某个⽅法的过程就叫路由映射。
@RequestMapping 即可修饰类,也可以修饰⽅法,当修饰类和⽅法时,访问的地址是类 + ⽅法。
@RequestMapping是处理get请求还是处理post请求的?
@RequestMapping("/request")
@RestController
public class RequestController {@RequestMapping("/hello")public String say(){return "hello, Spring mvc";}
}
使用get请求

使用post请求

我们发现, @RequestMapping既能处理get请求也能处理post请求。
传递参数
无参数
@RequestMapping("/request")
@RestController
public class RequestController {@RequestMapping("/hello")public String say(){return "hello, Spring mvc";}
}
结果:

单个参数
针对String类型
@RequestMapping("/request")
@RestController
public class RequestController {@RequestMapping("/r1")public String r1(String name){return "接收到参数,name:"+name;}
}
正确传参的结果:

不传递参数的结果(结果为null):

传递错误参数的结果(结果为null):

由此我们知道,传递单个参数时,参数名必须保持一致!!!
针对Integer类型
@RequestMapping("/r2")
public String r2(Integer age){return "接收到参数,age:"+age;
}
正确传参的结果:

错误传参的结果(结果为null):

不传参的结果(结果为null):

由此我们知道,对于Integer类型的参数,当不传参数时,默认值为null,如果传参名字不一致,值也是默认值null。
针对int类型
@RequestMapping("/r3")
public String r2(int age){return "接收到参数,age:"+age;
}
正确传参的结果:

错误传参的结果(错误码500) :

不传参的结果(错误码500):

由此我们知道,对于int类型的参数, 如果传参的参数名不一致时,会报错且错误码为500;如果不传参,也会报错且错误码为500,这一点与int的包装类型Integer不一样!!!
针对自定义类型
@RequestMapping("/r5")
public String r5(Student student){return "接收到参数,student:"+student;
}
正确传参的结果:

部分传参的结果:

错误传参的结果:

由此我们知道,针对自定义类型,如果不传参也不会报错,包装类型参数的默认值为null,如果传参类型不匹配会报错!!!
多个参数
@RequestMapping("/r4")
public String r4(String name,Integer age){return "接收到参数,name:"+name+",age:"+age;
}

参数重命名
参数强制一致
@RequestMapping("/r6")
public String r6(@RequestParam("name") String userName){return "接收到参数,name:"+userName;
}
正确传参的结果:

不传参的结果(错误码400):
错误传参的结果(错误码400):

由此我们知道,当参数重命名之后,默认要求该参数必须传参,否则会报错!!!
参数不强制一致
@RequestMapping("/r7")
public String r7(@RequestParam(value = "name",required = false) String userName){return "接收到参数,name:"+userName;
}
正确传参的结果:

错误传参的结果(结果为null):

不传参的结果(结果为null):

由此我们知道,当参数重命名之后,添加required=false之后,该参数就不要求必须传递了.
传递数组
@RequestMapping("/r8")
public String r8(String[] array){return "接收到参数,array:"+ Arrays.toString(array);
}
可以这样传递:

也可以这样传递:
传递List
@RequestMapping("/r9")
public String r9(List<String> list){return "接收到参数,list:"+list;
}
响应:

解决方法
@RequestMapping("/r9")
public String r9(@RequestParam(required = false) List<String> list){return "接收到参数,list:"+list;
}
响应:
由此我们知道,当参数类型时List类型时,必须添加@RequestParam注解,否则会报错且错误码为500。
传递JSON
@RequestMapping("/r10")
public String r10(@RequestBody Student student){return "接收到参数,student:"+student;
}
响应:

通过fiddler抓包:

原因分析:
是因为它把Json字符串当成了一个不可拆分的整体,所以这样拿不到传递的参数。
解决办法:
@RequestMapping("/r10")
public String r10(@RequestBody Student student){return "接收到参数,student:"+student;
}
响应:
由此我们知道,当传递Json字符串时,必须添加@RequestBody注解!!!
从路径中获取参数
获取单个参数
@RequestMapping("/article/{articleId}")
public String r11(Integer articleId){return "接收到参数,article:"+articleId;
}
响应(出错):

解决方法,使用@PathVariable注解。
@RequestMapping("/article/{articleId}")
public String r11(@PathVariable("articleId") Integer articleId){return "接收到参数,article:"+articleId;
}
响应:

关于为什么需要加@PathVariable("articleId"),这里有几个关键点:
1.明确性:@PathVariable注解明确指出了哪个URL模板变量应该被绑定到方法的哪个参数上。虽然Spring MVC也可以尝试通过参数名来自动匹配(如果参数名与URL模板中的变量名相同),但使用@PathVariable增加了代码的清晰度和明确性。
2.灵活性:在某些情况下,URL模板中的变量名可能与你想在控制器方法中使用的参数名不同。通过@PathVariable,你可以指定一个不同的参数名,这提供了额外的灵活性。
3.可读性:对于阅读代码的人来说,@PathVariable注解使得URL模板变量到方法参数的绑定一目了然,有助于理解代码的功能和目的。
4.强制类型转换:@PathVariable注解允许你指定参数的类型(如Integer),这意味着Spring MVC会尝试将URL模板变量的值转换为指定的类型。如果没有这个注解,你可能需要手动进行类型转换。
5.必需性:虽然在这个特定示例中@PathVariable可能看起来不是绝对必需的(因为参数名与URL模板变量名相同),但在更复杂的URL模板或更复杂的控制器方法中,使用@PathVariable可以确保你的代码更加健壮和易于维护。
获取多个参数
@RequestMapping("/article/{articleId}/{name}")
public String r12(@PathVariable("articleId") Integer articleId,@PathVariable("name") Integer name){return "接收到参数,article:"+articleId+",name:"+name;
}
响应:
在通过路径获取参数时,如果从路径中获取多个参数,传参时必须每个都传递,否则会报错,因为不知道是哪个/哪些参数没有传递!!!
上传文件
@RequestMapping("/r13")
public String r13(@RequestPart("file")MultipartFile file){String originalFilename=file.getOriginalFilename();return "接收到参数,文件名称:"+originalFilename;
}
响应:

在上传文件时,文件不能太大,否则会上传失败!!!
- 欢迎您在主页查看我的更多文章--》主页链接
- 欢迎您订阅我的博客专栏--》专栏链接
相关文章:
详解Java之Spring MVC篇一
目录 Spring MVC 官方介绍 MVC RequestMapping 传递参数 无参数 单个参数 针对String类型 针对Integer类型 针对int类型 针对自定义类型 多个参数 参数重命名 参数强制一致 参数不强制一致 传递数组 编辑传递List 编辑 传递JSON 编辑 从路径中获取参…...
ubuntu20.04上使用 Verdaccio 搭建 npm 私有仓库
安装nvm 首先安装必要的工具: apt update apt install curl下载并执行nvm安装脚本: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash添加环境变量(如果安装脚本没有自动添加)。编辑 ~/.bash…...
Python实现办公自动化的数据可视化与报表生成
在 Python 中,可以利用多个库来实现办公自动化中的数据可视化与报表生成。以下是具体的方法: 一、数据可视化 使用 matplotlib 库 matplotlib 是一个强大的 Python 绘图库,可以创建各种类型的静态、动态和交互式图表。示例代码:i…...
前端知识串联笔记(更新中...)
1.MVVM MVVM 是指 Model - View - ViewModel,Model 是数据与业务逻辑,View 是视图,ViewModel 用于连接 View 和 Model Model ---> View:将数据转化成所看到的页面,实现的方式:Data Bindings -- 数据绑定…...
PostgreSQL根据字符串的长度排序
PostgreSQL根据字符串的长度排序 在 PostgreSQL 中,你可以使用 LENGTH 函数来获取字符串的长度,并根据这个长度进行排序。LENGTH 函数会返回字符串的字符数。 以下是一个基本的 SQL 查询示例,它根据 some_column 字符串列的长度对表中的行进…...
计算机网络:网络层 —— IP数据报的发送和转发过程
文章目录 IP数据报的发送和转发过程主机发送IP数据报路由器转发IP数据报示例 IP数据报的发送和转发过程 IP 数据报的发送和转发过程包含以下两个过程: 主机发送IP数据报路由器转发IP数据报 直接交付:源主机与目的主机在同一网络中间接交付:…...
【算力基础】GPU算力计算和其他相关基础(TFLOPS/TOPS/FP32/INT8...)
文章目录 :one: 算力的常见指标:two: 算力计算:three: 常用链接 🚀 本文主要是聚焦于深度学习领域的 GPU的算力估计,其他类型的硬件设备如CPU可以类比参考。 1️⃣ 算力的常见指标 算力衡量主要与运算速度和精度这两个指标有关。 🌔速度指…...
UI自动化测试(app端)4.0
✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…...
C#与C++交互开发系列(十):数组传递的几种形式
前言 在C#和C的交互开发中,数组传递是一个非常常见且实用的场景。数组可以作为方法的参数,也可以作为响应结果返回。在本篇博客中,我们将探讨几种常见的数组传递方式,展示如何在C#与C之间进行有效的数据交换。我们将主要介绍以下…...
【C++复习】第一弹-基础性语法
前言 学习了C语法这么久了,我其实觉得,我们学习一门语言应该更加注重使用性,对于语法的细节可以通过具体的项目去重新造轮子的时候再去抠细节,也就是说你得学会先走,在去想我们如何走的,身体的哪些肌肉在发…...
软考高级备考记录
一 报考条件和报名流程 报考条件 该考试具有水平考试性质,报考任何级别不需要学历、资历条件,只要达到相应的专业技术水平就可以报考相应的级别 报名流程 软考报名官网:中国计算机技术职业资格网 官网上有 报名时间,考试…...
图为大模型一体机新探索,赋能智能家居行业
在21世纪的今天,科技的飞速进步正以前所未有的速度重塑着我们的生活方式。从智能手机到物联网,从大数据到人工智能,每一项技术创新都在为人类带来前所未有的便利与效率。其中,图为AI大模型一体机作为人工智能领域的最新成果&#…...
精氨酸/赖氨酸多肽(芋螺肽)
产品简介: 芋螺肽,源自瑞士尖端科技,是一种模拟芋螺毒素的生物活性肽。它以其独特的分子结构和高选择性作用于电压门控钠离子通道(特别是Nav1.4),为您提供安全、自然且不僵硬的回春效果。芋螺肽࿰…...
C++音视频04:音视频编码、生成图片
视频编码 #include <libavutil/log.h> #include <libavutil/opt.h> #include <libavcodec/avcodec.h>static int encode(AVCodecContext *ctx, AVFrame *frame, AVPacket *pkt, FILE *out) {int ret -1;ret avcodec_send_frame(ctx, frame);if (ret < …...
ImageSharp报错
错误信息 System.MissingMethodException: Method not found: System.Span1<SixLabors.ImageSharp.PixelFormats.Rgba32> SixLabors.ImageSharp.Memory.Buffer2D1.GetRowSpan(Int32).需要升级项目 原来仅升级了SixLabors.ImageSharp没有升级drawing,都升级到…...
Android中常用adb命令
目录 1.adb连接安卓模拟器 2.adb列出所有已经连接的设备 3.adb显示设备的日志信息 4.adb 电脑文件推送到安卓模拟器中 5.adb 手机传送文件到电脑 6.adb获取安卓应用的包名和Activity名 附录 1--命令 1)adb devices 2)adb install 路径> 3)…...
PostgreSQL的奥秘:全面解读JSONB——非结构化数据支持的深入探索
引言 PostgreSQL的JSONB数据类型非常灵活,提供了一套操作符来操作JSON数据。本指南将引导您创建一个包含JSONB数据的表,演示各种JSONB操作符,并讨论如何使用倒排索引和部分索引来优化性能。 理解PostgreSQL中的JSONB JSONB,即JS…...
tornado,flaskd这两个框架主要是干什么的
Tornado是一个Python的Web框架,主要用于构建高性能的异步Web应用程序。它基于非阻塞的网络I/O模型,可以处理大量并发连接,适用于需要处理实时性要求较高的应用场景,如实时聊天、实时数据推送等。 Flask是另一个Python的Web框架&a…...
Sigrity Power SI Noise coupling analysis模式如何进行压降仿真分析操作指导
Sigrity Power SI Noise coupling analysis模式如何进行压降仿真分析操作指导 Sigrity除了可以进行交流噪声分析,同样也可以进行压降仿真分析,以下图为例. 3D view...
国产游戏技术能否引领全球?
国产游戏技术能否引领全球? 引言 近年来,中国游戏产业如同春天的嫩芽,迅速成长为全球最大的市场之一。或许你会想,国内的游戏开发者到底在技术上取得了多大的成就?这些成就又能否推动中国游戏走向世界,甚…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...



