【Spring】初识Spring MVC

文章目录

  • 前言
  • 一、MVC是什么?
  • 二、学习Spring MVC
    • 建立连接
    • @RequestMapping注解
    • 注解的使用细节
  • 三、传递参数的情况
    • 传递单个参数
      • 1.传递String
      • 2.传递包装类/基本类型
      • 3.参数重命名(@RequestParam)
    • 传递多个参数
    • 传递对象
    • 传递数组
    • 传递集合
    • 参数为变量
    • 传递文件
    • 小细节
  • 四、JSON
  • 总结
  • 总结


前言

Java中Spring是一个大的集合,包括Spring Boot、Spring Cloud……
而Spring MVC是基于Servlet API构建的原始Web框架,从一开始就在Spring 框架中。
Spring MVC全称为“Spring Web MVC”


一、MVC是什么?

MVC包括三部分:Model、View、Controller
View(视图) 即前端;Model(模型)处理业务逻辑和数据;Controller(控制器)选择处理模型和视图。他们之间的关系可以参考下图。
在这里插入图片描述
在IDEA中就可以创建Spring Web项目,Spring Boot只是实现MVC的一种方式而已。
在这里插入图片描述

二、学习Spring MVC

因为是Web框架,所以Spring MVC需要接收到用户所发送的请求并返回响应。主要分为以下三个方面:

  1. 建立连接:将用户与Java程序连接起来,使用户能够调用Spring程序
  2. 请求:用户向服务器发起请求,在程序中需要想办法获取到请求中存在的参数(也可能不含参数)
  3. 响应:执行业务逻辑之后将程序执行结果返回给用户。

建立连接

在Spring MVC中使用@RequestMapping实现URL路由映射,使得浏览器能够连接程序。 在程序中,为了能够更快找到路由映射,需要使用**@RestController注解**。
当程序运行时,会根据该注解查找类下面是否存在相应的路径。如果没有添加这个注解,程序是不会进入到类里面进行核验的。

@RestController
public class demo01 {@RequestMapping("/hello")//方法名和路径名无需一致public String hello() {return "hello,Spring MVC";}
}

接下来访问: http://127.0.0.1:8080/sayHi, 就可以看到程序返回的数据了
在这里插入图片描述

@RequestMapping注解

@RequestMapping 是Spring MVC中最常被用到的注解,也是十分特殊的注解。它是用来注册URL路径的。

  1. 那么它支持哪些请求?答案是全部支持。即支持Post、Get、Put……请求。(可以在Postman中测试)
    如果我们要让该注解只支持固定类型的请求那么该如何设置?我们可以配置@RequestMapping的参数,控制它请求的方式。当选择参数method,可以理解为以数组的形式放入数据,数据中存放的就是请求的方式。value就是注解的url。
    如果不选择method,那么默认为全部支持。
@RequestMapping(value = "/hello2",method = {RequestMethod.GET,RequestMethod.PUT})public String hello2() {return "hello spring mvc";}

当然了,只支持单个请求方式的注解也是有的。诸如此类的请求注解都是只允许一种请求方式。
在这里插入图片描述
2. 在上面的使用中,我们通过@RequestMapping、@GetMapping等注解加在每个方法上面,让Spring可以根据路实现客户端和服务器之间的请求响应。在方法上的路径成为“方法路径”。随着项目逐渐扩大,很有可能出现方法路径相同的失误。为了防止路径重复,我们建议每个类都加上“类路径”,这样就可以避免不同类之间相同路径难以发现的问题了。
类路径应该如何配置呢?用的就是@RequestMapping ,我们可以通过注解的源码来窥探一二。通过@Target注解,其中有两种:TYPE和METHOD 当为TYPE时,则该注解为类注解,当为METHOD时,该注解为方法注解。

在这里插入图片描述
像@RequestMapping 两种方式都有,因此属于类注解也属于方法注解,而例如@PostMapping 就只有一个METHOD 因此它只能用于方法注解上。
在这里插入图片描述

注解的使用细节

1、同样的url路径,不同的注解请求是互不影响的。
在这里插入图片描述
2、同样的请求方式,同样的路径是会报错的,由于Spring是根据路径进入方法的,而相同路径会造成Spring不知道应该执行哪一个而报错。
在这里插入图片描述
运行后报错截图如下。
在这里插入图片描述

三、传递参数的情况

后端开发自然有需要接收参数和传递参数的情况需要处理。这时候就像方法一样传入参数并执行逻辑。

传递单个参数

1.传递String

以下面的简单的代码为例,我们在Postman里面进行测试的路径应该为
”http://127.0.0.1:8080/params/param1“ 并且我们必须保证 参数为name,在Postman里面的参数名称也必须为name(我们也可以选择参数重命名的方法,即使用@RequestParam注解) 在下文展示。

@RestController
@RequestMapping("/params")
public class paramDemo {@RequestMapping("/param1")public String getName(String name) {return name;}
}

当我们编写的参数名为name1时,是没有办法获取到数据的;
在这里插入图片描述
当我们正确的输入传递参数名,就能够正常的处理请求。
在这里插入图片描述

2.传递包装类/基本类型

以Integer包装类与基本类型int为例,当传入参数合法时,二者表现无异。当传输参数为空时,Integer返回值为null而int类型则是报错。
在下面的方法中,返回值为String类型,对于传输的数据,Spring能够自动将数据进行类型转换。

	@RequestMapping("/param2")public String getNum(Integer num) {return "接收到参数:" + num;}@RequestMapping("/param3")public String getNum1(int num) {return "接收到参数:" + num;}

在这里插入图片描述
对于报错信息状态码为400,大部分表示客户端信息报错,int类型无法处理空值的数据状况。
在这里插入图片描述

3.参数重命名(@RequestParam)

在前面我们知道,参数的名称顺序必须一一对应,不然无法成功进行请求和响应。那么当前端与后端发生分歧时,可能导致参数名称不一致,这时我们就需要将前端的变量名调回和后端一致的变量。
使用了@RequestParam之后,将参数名name转变为userName,我们可以理解为废弃掉name这一变量名,以后只用userName。
需要注意的是,以后对参数传递就不能使用name了,而是只能使用userName作为参数名。
在使用了该注解之后,该参数就变成了必填项。我们可以配置required = false改变它是否为必填项。

	@RequestMapping("/param1")public String getName(@RequestParam("userName") String name) {return name;}//修改必填项@RequestParam(value = "userName",required = false

在这里插入图片描述
在这里插入图片描述

传递多个参数

以下面的param4为例,传入两个参数为userName和password,当我们传入数据时,我们对于参数的顺序是不严格要求的。

	@RequestMapping("/param4")public String param4(String userName,String passWord) {return "接收到 name:"+userName + "password:"+passWord;}

在Postman中的测试以下图为例。在调整了参数传递顺序之后也不会影响结果的改变。
原因:在传入的数据进入Spring之后,存在类似与Map的数据结构,将变量名和数据一一对应,从而不会出现数据乱套的情况。
在这里插入图片描述

传递对象

传递对象和传递普通参数的步骤其实是一样的,在对象中已经有了所需要的信息。
在代码中创建了UserInfo类,并存入变量name、age、password 而在"/param5’路径下,我们可以直接放入userInfo对象。
在对象中,int为基本类型,是存在默认值为0的,因此出现age未赋值的情况下也不会报错。

@RequestMapping("/param5")public String param5(UserInfo userInfo) {return "接收:"+userInfo;}

在这里插入图片描述
在这里插入图片描述

传递数组

数组中包含了多个数据,我们在Postman测试过程中可以分开传输,也可以统一传输。这边不再赘述。
在这里插入图片描述
在这里插入图片描述

传递集合

集合与数组之间是存在区别的。在下面的案例中,List属于接口,数据无法直接存储。这时候就需要通过@RequestParam的另外一个功能:绑定数据。

	@RequestMapping("/param7")public String param7(@RequestParam("list") List<String> list) {return list + " ";}

在这里插入图片描述

参数为变量

许多url路径都会传入变量如id、name等数据。这些数据是可变的。
在RequestMapping中我们会写入id的数据,而在方法param9中的id通过@PathVariable获取url路径中的id。

	@RequestMapping("/param9/{id}")public String param9(@PathVariable Integer id) {return "id:" + id;}

同时,我们也可以支持获取多个url数据中的变量

	@RequestMapping("/param10/{id}/{name}")public String param10(@PathVariable Integer id,@PathVariable String name) {return "id:" + id + ",name:" + name;}

在这里插入图片描述

传递文件

文件传递需要使用到MultipartFile类,该类中有多个方法包括获取文件名、文件类型等。在下面的源码中,对于文件已经不能用@RequestParam注解来进行参数重命名了,而是需要一个新的注解**@RequestPart**
在这里插入图片描述

小细节

在Postman中,暂时用到两种方式,以Params进行参数的传递。这种方式将所有的参数都拼接到了一起,我们可以发现使用Params方式的情况下url路径都将变量拼接起来了。而以form表单进行提交的情况下并不会发生这种情况。
而传输对象数据的情况下,以form表单进行提交是只能使用Post的方式的,而已Params方式提交只能使用Get和Post两种方式。

四、JSON

json是轻量级数据交互格式,我们可以通过json传递对象或数组的信息。
JSON中的各项数据使用键值对来表示,以逗号分隔。key 和value之间通过 :分割
数据类型没有受限制。
数组使用[]表示,对象使用{}表示
在json中,接收数据需要使用到@RequestBody注解。在postman中也需要通过“raw”来填写json数据。

	@RequestMapping("/param7")public String param8(@RequestBody UserInfo userInfo) {return userInfo +" ";}

在这里插入图片描述

总结

Spring MVC是Java中十分常用的一个设计思想。其中的注解有多般变化,PostMapping是其中十分重要的注解。此外类注解和方法注解都有自己的标识。传递参数的方式有多种,需要仔细思考。
源码Spring MVC


总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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

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

相关文章

【数据结构篇】~二叉树(堆)

【数据结构篇】~二叉树&#xff08;堆&#xff09; 二叉树1.树2.树的组成3.二叉树4.堆1.向上调整算法2.向下调整算法3.堆排序 4.topk问题源码 二叉树 1.树 树的概念与结构​ 树是一种非线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09; 个有限结点组成一个…

Redis管道(Pipeline)

Pipeline是为了解决RTT&#xff0c;仅仅是将命令打包一次性发送&#xff0c;对整个Redis的执行不造成其它任何影响。是批处理命令变种优化措施&#xff0c;类似Redis的原生批命令&#xff08;如mset和mget&#xff09;。 问题由来 Redis是一种基于客户端-服务端模型以及请求/响…

【机器学习】特征工程的基本概念以及LASSO回归和主成分分析优化方法

引言 特征工程是机器学习中的一个关键步骤&#xff0c;它涉及到从原始数据中提取和构造新的特征&#xff0c;以提高模型的性能和预测能力LASSO&#xff08;Least Absolute Shrinkage and Selection Operator&#xff09;回归是一种用于回归分析的线性模型&#xff0c;它通过引入…

leetcode刷题之二分算法

目录 简介 第一个错误的版本 算法思路 代码实现 两个数组的交集 算法思路 代码实现 两个数组的交集2 算法思路 代码实现 有效的完全平方数 算法思路 代码实现 猜数字大小 算法思路 代码实现 排列硬币 算法思路 代码实现 寻找比目标字母大的最小字母 代码实…

Redis系列之事务

概述 Redis事务提供一种将多个命令打包&#xff0c;然后一次性、按顺序地执行的机制&#xff0c;在事务执行的期间不会主动中断&#xff0c;服务器在执行完事务中的所有命令之后&#xff0c;才会继续处理其他客户端的其他命令。 三个重要的保证&#xff1a; 批量操作在发送E…

[Algorithm][贪心][跳跃游戏][加油站][单调递增的数字][坏了的计算器]详细讲解

目录 1.跳跃游戏1.题目链接2.算法思路详解3.代码实现 2.加油站1.题目链接2.算法原理详解3.代码实现 3.单调递增的数字1.题目链接2.算法原理详解3.代码实现 4.坏了的计算器1.代码实现2.算法原理详解3.代码实现 1.跳跃游戏 1.题目链接 跳跃游戏 2.算法思路详解 贪心&#xff1…

WPF—资源的使用

资源的使用 资源是可以在应用中的不同位置重复使用的对象。 资源的示例包括画笔和样式。 <Window.Resources><!--定义颜色资源--><SolidColorBrush x:Key"MyBrush" Color"#05E0E9"/><!--定义样式资源--><Style TargetType&quo…

uniapp在线视频监控开发

我这里是uniapp开发的H5项目 视频流是flv模式 用到的插件是flv.js Flv.js Flv.js 是 HTML5 Flash 视频&#xff08;FLV&#xff09;播放器&#xff0c;纯原生 JavaScript 开发&#xff0c;没有用到 Flash。。由 bilibili 网站开源。 常见直播协议 RTMP: 底层基于TCP&…

TinyVision 使用 SyterKit 启动 Linux 6.7 主线内核

TinyVision 使用 SyterKit 启动 Linux 6.7 主线内核 SyterKit SyterKit 是一个纯裸机框架&#xff0c;用于 TinyVision 或者其他 v851se/v851s/v851s3/v853 等芯片的开发板&#xff0c;SyterKit 使用 CMake 作为构建系统构建&#xff0c;支持多种应用与多种外设驱动。同时 Sy…

docker GBase 8sV8.8使用的常见错误

因项目需要GBase 8sV8.8数据库环境&#xff0c;所以在搭建使用过程中有一些坑和错误&#xff0c;所以记录和分享 docker搭建 docker.com获取镜像 docker pull liaosnet/gbase8s:v8.8_3503x1_x64创建容器 docker run -d -p 19088:9088 \-e SERVERNAMEgbase01 \-e USERPASSGB…

Linux 基础命令大全

Linux是一个功能强大、灵活的操作系统&#xff0c;为用户提供了稳定性、安全性和庞大的开发者和用户社区。它是个人和企业使用的流行选择。 当涉及到Linux基础命令时&#xff0c;以下是一些常用的命令及其功能介绍&#xff1a; 1.ls 查看目录 语法&#xff1a;ls [选项] [文件…

C#实现数据采集系统-数据反写(3)ModbusTcp写入数据模块开发

写入报文分析 ModbusTcp报文详细解析见 ModbusTCP协议报文解析 写入常用的四个功能码&#xff0c;线圈 05,15&#xff08;0x0F&#xff09;,寄存器06,16&#xff08;0x10&#xff09; 详细报文如下&#xff1a; //00 01 00 00 00 06 FF 05 00 01 FF 00 写单个线圈 //00 01 …

PHPStorm如何使用Phalcon框架的依赖

问题背景 在上一篇文章里面写的如何把Phalcon 集成到PhpStorm里面,发现有个地方讲得不是很清楚,就是在使用Phalcon开发的过程中,会发现没有Phalcon框架的代码提示,这个让人感到很难受,写代码的效率也会降低不少。当时讲得是在项目的外部库下导入依赖源, 然后在写代码的时…

HTML简单了解和基础知识记录

参考视频 html的用途 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;&#xff0c;用来显示网页的文字和框架结构&#xff0c;可以认为是网页的骨架。 标签/元素 用于定义文字图片连接等&#xff0c;分…

R 语言学习教程,从入门到精通,R 绘图饼图(23)

1、R 绘图 条形图 条形图&#xff0c;也称为柱状图条形图&#xff0c;是一种以长方形的长度为变量的统计图表。 条形图可以是水平或垂直的&#xff0c;每个长方形可以有不同的颜色。 R 语言使用 barplot() 函数来创建条形图&#xff0c;格式如下&#xff1a; barplot(H,xlab,…

JavaScript初级——DOM和事件简介

一、什么是DOM&#xff1f; 二、模型 三、对象的 HTML DOM 树 四、节点 浏览器已经为我们提供了文档节点对象&#xff0c;这个对象是window属性&#xff0c;可以再网页中直接使用&#xff0c;文档节点代表的是整个网页。 五、事件简介 事件&#xff0c;就是用户和浏览器之间的交…

Linux系统下的容器安全:深入解析与最佳实践

在云计算和微服务架构的推动下&#xff0c;容器技术因其高效、可移植和灵活的特点&#xff0c;已经成为现代软件开发和部署的首选方案。然而&#xff0c;容器的广泛应用也带来了新的安全挑战&#xff0c;尤其是在Linux系统下&#xff0c;容器安全的实现和维护变得尤为重要。本文…

C++ 设计模式——单例模式

单例模式 C 设计模式——单例模式1. 单例模式的基本概念与实现2. 多线程环境中的问题3. 内存管理问题1. 内存泄漏风险2. 自动释放策略3. 垃圾回收机制4. 嵌套类与内存管理 4. UML 图UML 图解析 优缺点适用场景总结 C 设计模式——单例模式 单例模式&#xff08;Singleton Patt…

【Redis】渐进式遍历和数据库管理

渐进式遍历和数据库管理 渐进式遍历scan 数据库管理切换数据库清除数据库 渐进式遍历 Redis 使⽤ scan 命令进⾏渐进式遍历键&#xff0c;进⽽解决直接使⽤ keys 获取键时可能出现的阻塞问题。每次 scan 命令的时间复杂度是 O(1)&#xff0c;但是要完整地完成所有键的遍历&…

360发布FancyVideo:通过跨帧文本指导实现动态且一致的视频生成SOTA!

文章链接&#xff1a;https://arxiv.org/pdf/2408.08189 项目链接&#xff1a;https://360cvgroup.github.io/FancyVideo/ 亮点直击 本文介绍了FancyVideo&#xff0c;据众所知的首个探索T2V任务中跨帧文本指导的开创性尝试。该方法为增强当前的文本控制方法提供了新的视角。 …