Spring MVC: 一种简洁且强大的Web应用框架

news2025/1/11 14:59:54

在这里插入图片描述
⭐️前言⭐️

这篇文章介绍Spring MVC,Spring MVC是现在基本所有Java程序的主流开发框架,这篇文章主要介绍三部分内容:

  • 实现用户和程序的映射(在浏览器输入URL地址之后,能够在程序中匹配到相应方法)。
  • 服务器端得到用户的请求参数
  • 服务器端将结果返回给用户(前端)

🍉博客主页: 🍁【如风暖阳】🍁
🍉精品Java专栏【JavaEE进阶】、【JavaEE初阶】、【MySQL】、【数据结构】
🍉欢迎点赞 👍 收藏留言评论 📝私信必回哟😁

🍉本文由 【如风暖阳】 原创,首发于 CSDN🙉

🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言

🍉博客中涉及源码及博主日常练习代码均已上传GitHub


请添加图片描述

📍内容导读📍

  • 🍅1.什么是Spring MVC?
    • 1.1 MVC的定义
    • 1.2 MVC和Spring MVC的关系
    • 1.3 Spring、Spring Boot、Spring MVC三者的关系
  • 🍅2.使用用户和程序的映射
    • 2.1 @RequestMapping注解
    • 2.2 @GetMapping和@PostMapping
  • 🍅3.服务端得到用户的请求参数
    • 3.1 获取单个参数
    • 3.2 获取多个参数
    • 3.3 参数重命名
    • 3.4 获取对象
      • 基于form表单构造请求:
      • 构造JSON格式请求:
    • 3.5 从URL地址中获取参数
    • 3.6 获取文件
    • 3.7 获取Cookie
    • 3.8 获取Header
    • 3.9 存储和获取Session
  • 🍅4.服务端返回结果给用户
    • 4.1 返回静态页面
    • 4.2 返回非静态页面数据
      • `@ResponseBody`
      • `@RestController`
    • 4.3 返回JSON对象
    • 4.4 综合练习
      • 计算器
      • 登录
    • 4.5 请求转发或请求重定向
      • 经典面试题:请求转发和请求重定向的区别

🍅1.什么是Spring MVC?

1.1 MVC的定义

MVC是Model View Controller的缩写,它是软件工程中的一种软件架构模式,它把软件系统分为模型、视图和控制器三个部分。
在这里插入图片描述

  • Model(模型) 是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存储数据。
  • View(视图) 是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
  • Controller(控制器) 是应用程序中处理用户交互的部分。通常控制器负责从视图中读取数据,控制用户输入,并向模型发送数据

1.2 MVC和Spring MVC的关系

MVC是一种思想,而Spring MVC是对MVC思想的具体实现。就类似于我们在学习Spring时的IoCDI一样,IoC是一种思想,而DI是具体的实现。

1.3 Spring、Spring Boot、Spring MVC三者的关系

Spring是包含了众多工具方法的IoC容器。

Spring Boot是为了简化Spring开发而产生的脚手架。

Spring MVC是一个基于MVC设计模式和Servlet API实现的Web项目,同时Spring MVC又是Spring框架中的一个Web模块,它是随着Spring的诞生而存在的一个框架。

🍅2.使用用户和程序的映射

Spring MVC项目创建和Spring Boot创建项目相同(Spring MVC使用Spring Boot),在创建的时候选择了Spring Web就相当于创建了Spring MVC的项目。
先完成Spring MVC项目的创建,再进行下边的工作:

2.1 @RequestMapping注解

@RequestMapping是Spring Web应用程序中最常用到的注解之一,它是用来注册接口的路由映射的。

路由映射:当用户访问一个url时,将用户的请求对应到应用程序的某个类的某个方法中的过程就叫做路由映射。

@RequestMapping基础使用如下:
在这里插入图片描述
@RequestMapping既可以修饰类,也可以修饰方法,当修饰类和方法时,访问的地址是类+方法对应的url。访问结果如下图:
在这里插入图片描述

默认情况下,@RequestMapping既支持POST请求方式,也支持GET请求方式。但如果想要只支持一种请求,也可以指定哪种请求,如下代码所示:

@RequestMapping(value="/sayhi",method=RequestMethod.GET)
@RequestMapping(value="/sayhi",method=RequestMethod.POST)

2.2 @GetMapping和@PostMapping

如果既想要只支持一种访问方式,还想要更简单的写法,就可以使用下边的方式:

GET请求

@GetMapping("/sayhi")

POST请求

@PostMapping("/sayhi")

🍅3.服务端得到用户的请求参数

3.1 获取单个参数

在这里插入图片描述

使用postman来构造请求:
在这里插入图片描述
注意,整形建议设置类型为包装类(Integer),在设置为包装类时,如果没有传参数,则该参数只是为空,而如果设置的是int类型,不传参数将会报错。
在这里插入图片描述
在这里插入图片描述

3.2 获取多个参数

代码:
在这里插入图片描述
构造请求:
在这里插入图片描述
注意

  • 在获取多个参数的时候,前端传来的参数顺序没影响,参数是按照Key-Value来赋值的,只要保证前后端参数的名称Key一致即可。
  • 在进行交互时一般参数命名都用小写,防止出现解析错误的情况。

3.3 参数重命名

在3.2中获取到多个参数的前提,是要保证前后端参数的命名相同(即Key值相同),但如果前端传来的参数并不合理,可以通过参数重命名的方法,将前端传来的参数映射到自己命名的参数上,进一步完成后续的开发。

方法为使用@RequestParam注解;
比如在3.2中的示例中,前端传来的参数是name,而不是username,就需要进行重命名,代码演示如下:
在这里插入图片描述
构造请求:
在这里插入图片描述
注意事项:
在加了@RequestParam注解以后,那么前端一定要传递此参数,否则就会报错,如果想要解决此问题,可以给@RequestParam里面添加required=false
在这里插入图片描述
在这里插入图片描述

3.4 获取对象

在程序中编写对象类,前端传来参数就给对象完成了初始化。

User类:
在这里插入图片描述
获取对象:

在这里插入图片描述

基于form表单构造请求:

在这里插入图片描述
注意:在对象中的整形,Integer类不传参数默认为null,int类不传参数默认为0,并不会报错。

构造JSON格式请求:

在这里插入图片描述
我们发现如果构造JSON格式的请求,并不能获取到参数,我们用Fiddler来进行抓包
在这里插入图片描述

我们可以发现,请求报文中确实是有参数,但并没有被获取到,需要在参数列表中加上@RequestBody注解才能解决这个问题。
在这里插入图片描述
在这里插入图片描述

3.5 从URL地址中获取参数

注意,此处获取参数是通过URL地址,而不是从URL的参数获取
在这里插入图片描述

实现需要通过注解@PathVariable,代码演示如下:
在这里插入图片描述
构造请求:
在这里插入图片描述

3.6 获取文件

实现获取文件的功能,需要用到注解@RequestPart

因为在不同的环境下图片的保存位置不同,所以需要在配置文件中声明图片的保存路径,配置文件设置如下:
在这里插入图片描述
防止图片由于路径的相同而导致图片被覆盖,还需要给图片名增添随机性,就是使用UUID,整体实现代码如下:
在这里插入图片描述

使用Postman模拟上传文件(基于form-data格式上传文件)
在这里插入图片描述

3.7 获取Cookie

因为Spring MVC是基于Servlet API实现的,所以其天然支持Servlet API,在Spring MVC项目中的每个方法,都可以获取到HttpServletRequestHttpServletResponce对象。

所以获取Cookie有传统的基于Servlet的方法,和使用Spring MVC中注解的方法来获取Cookie

a)基于Servlet的方式获取Cookie
在这里插入图片描述
为了防止空指针异常,我们先在浏览器随便加上一些Cookie。
在这里插入图片描述
然后刷新页面,看idea控制台的日志信息打印:
在这里插入图片描述

b)使用@CookieValue注解实现Cookie的读取

在这里插入图片描述
请求访问:
在这里插入图片描述

3.8 获取Header

a)基于Servlet的方式获取请求头中的信息
在这里插入图片描述

在这里插入图片描述
b)使用@RequestHeader注解来实现

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

3.9 存储和获取Session

存储Session的实现,Servlet和Spring MVC的操作方法相同,代码如下:

在这里插入图片描述

存储成功后,浏览器的cookie中会多出一条记录(如下图),红框记录的Key-Value中的Value就是sessionID,可以根据这个sessionID来找到session会话,对应的session中就是我们刚刚通过setAttribute()方法存进去的session属性Key-Value
在这里插入图片描述

获取session还是有两种方法:

a)基于Servlet

在这里插入图片描述
在这里插入图片描述
b)使用@SessionAttribute注解
在这里插入图片描述
红框中的代码通常要加,如果不加的话,那么当session中不存在此属性的时候程序就会报错。

构造请求:
在这里插入图片描述

🍅4.服务端返回结果给用户

4.1 返回静态页面

在1.1 中我们就提到了Spring MVC的MVC架构模式(如下图),因为Spring MVC是随着Spring的诞生而诞生的,在那个时期并没有将前后端分离开来,所以在View层也就不存在前后端视图的说法,所以,在Spring MVC的方法中,默认返回的都是静态页面的名称
在这里插入图片描述
我们先在resource资源文件路径下新建前端页面
在这里插入图片描述
前端代码如下:
在这里插入图片描述
后端代码:
在这里插入图片描述
浏览器访问路径:
在这里插入图片描述

4.2 返回非静态页面数据

因为在4.1中我们提到了Spring MVC方法默认返回的是一个静态页面,如果我们想要返回非静态页面的数据,就需要通过注解@ResponseBody或者组合注解@RestController来实现。

@ResponseBody

与4.1相同的代码,加上@ResponseBody注解,我们再来看浏览器访问的结果
在这里插入图片描述

再次通过浏览器进行访问,就会发现返回的是非静态页面的数据了。
在这里插入图片描述

注意
@ResponseBody注解既可以修饰类,又可以修饰方法,如果加在类上:表示当前类中所有方法都会返回一个非静态页面的数据;但如果加在方法上:表示当前方法返回的是一个非静态页面数据。

@RestController

@RestController注解相当于@Controller+@ResponseBody,所以它的效果就相当于两个注解的效果和。
在这里插入图片描述

4.3 返回JSON对象

在Spring MVC的方法中,服务器给前端返回一个JSON格式的对象,要比Servlet的方式简单很多,直接返回存储了键值对的HashMap对象给前端,Spring就能让其自动识别转变为JSON格式返回给前端。

代码如下:
在这里插入图片描述

构造请求,结果如下:
在这里插入图片描述

4.4 综合练习

计算器

前端使用form表单的方式提交参数,在后端实现计算器的功能返回结果给前端。

前端代码如下
在这里插入图片描述
后端代码
在这里插入图片描述
浏览器构造请求演示:
请添加图片描述

登录

前端使用ajax请求传递参数,后端返回状态给前端,实现登录的功能。

前端代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="js/jquery.min.js"></script>
    <title>登录</title>
    <script>
        // ajax提交
        function mysub(){
            // 1.判空
            let username=jQuery("#username");
            let password=jQuery("#password");
            if(jQuery.trim(username.val())=="") {
                alert("请先输入用户名!");
                username.focus();// 光标重置到此处
                return;
            }
            if(jQuery.trim(password.val())=="") {
                alert("请先输入密码!");
                password.focus();// 光标重置到此处
                return;
            }
            jQuery.ajax({
                url:"/login",
                type:"POST",
                data:{"username":username.val(),
                "password":password.val()},
                success:function(body) {
                    alert(JSON.stringify(body));
                }
            });
        }
    </script>
</head>
<body>
    <div style="text-align: center;">
        <h1>登录</h1>
        用户:<input id="username"><br>
        密码:<input id="password" type="password"><br>
        <input type="button" value="提交" onclick="mysub()" style="margin-top: 20px;margin-left: 50px;">
    </div>
</body>
</html>

后端代码

在这里插入图片描述
浏览器构造请求演示运行:

请添加图片描述

4.5 请求转发或请求重定向

forward VS redirect
return 不但可以返回视图或者数据,还可以实现跳转,跳转的方式有以下两种:

  • forward实现请求转发
  • redirect实现请求重定向

两者的理解可以用一个借钱的例子来理解,张三向李四借钱,李四没有钱,但他向王五借来钱,又给了张三,这就是请求转发的过程,李四代为完成了张三的请求;但如果李四没有钱,他告诉张三王五有钱,让张三去找王五借钱,这个过程就是请求重定向的过程。

在这里插入图片描述

分别来看两种方法的请求结果:

forward
在这里插入图片描述
redirect
在这里插入图片描述
可以发现两个方法都跳转成功到了同一个界面,但两者又有不同,具体区别如下:
【参考文章链接跳转】

经典面试题:请求转发和请求重定向的区别

1.定义不同

请求转发(forward)发生在服务端程序内部,当服务端收到一个客户端的请求之后,会先将请求转发给目标地址,再将目标地址返回的结果转发给客户端。
而请求重定向(redirect)是指服务端接受到客户端的请求以后,会给客户端返回一个临时响应头,这个临时响应头中记录了客户端需要再次发送请求(重定向)的URL地址,然后客户端按照这个URL再次发送请求。

2.请求方不同
请求转发(forward)是服务端的行为,而请求重定向(redirect)是客户端的行为。
交互流程如下图所示:
在这里插入图片描述
3.数据共享不同
请求转发(forward)是由服务端实现的,所以整个执行流程中,客户端只发送了一次请求,因此整个交互过程中都是同一个Request对象和一个Response对象,所以请求和返回的数据是共享的;而请求重定向(redirect)是向由客户端发送两次完全不同的请求,所以两次请求中的数据是不同的。

4.最终URL地址不同
在上边的浏览器访问结果中我们也可以看出,虽然访问到的是同一个界面,诞生两次访问的最终URL地址是不同的。这是因为请求转发(forward)是在服务器端代为完成的,整个过程URL地址不变而请求重定向(redirect)是服务器端告诉客户端另一个地址,客户端进行了再一次访问,而非刚开始请求的地址,所以URL地址发生了改变。

5.代码实现不同
在这里插入图片描述


⭐️最后的话⭐️
总结不易,希望uu们不要吝啬你们的👍哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正😁

请添加图片描述

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

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

相关文章

c语言笔记1 输入和输出注意事项,常量 变量 static

输出&#xff1a;printf c的编译器不会检测格式串中转换说明的数量和数据类型是否和后面的变量一致。转换说明的数据类型与实际数据类型不一致时&#xff0c;产生无意义的值。 int 类型的变量length&#xff0c;值为9&#xff0c;输出时将类型写为float或double&#xff0c;输…

【自然语言处理】【ChatGPT系列】InstructGPT:遵循人类反馈指令来训练语言模型

InstructGPT&#xff1a;遵循人类反馈指令来训练语言模型《Training language models to follow instructions with human feedback》论文地址&#xff1a;https://arxiv.org/pdf/2203.02155.pdf 相关博客 【自然语言处理】【ChatGPT系列】InstructGPT&#xff1a;遵循人类反馈…

联想小新pro13 卡顿解决办法

问题 本人电脑型号是 联想小新 pro13 2020 i7 才用了两年多&#xff0c;变得巨卡无比 ctlshiftesc打开任务管理器 cpu利用率才30%多 打字就一顿一顿的出结果 浏览网页也卡的掉帧&#xff0c;更不用说打游戏了 真的很无语&#xff0c;重装了系统也没啥用 思路 在网上搜了一圈…

Linux 网络基础

目录 一.网络 1.重新看待计算机结构 2.几种网络 二.协议 1.协议分层 2.OSI七层模式 3.TCI/IP五层(或四层)模型 三.网络传输 1.网络和操作系统之间的关系 2.网络传输流程图 3.数据包封装和应用 前言&#xff1a;这一篇大体介绍一下网络的一些基础知识。 一.网络 1.重…

do while语句

上次讲了while语句&#xff0c;这次讲一下do while语句。 do...while 循环是 while 循环的变体。在检查while()条件是否为真之前&#xff0c;该循环首先会执行一次do{}之内的语句&#xff0c;然后在while()内检查条件是否为真&#xff0c;如果条件为真的话&#xff0c;就会重复…

王卫点赞友商?北京快递保卫战,顺丰彰显大格局大气度

当下&#xff0c;随着全面放开&#xff0c;国内新冠疫情到了另一个严峻的拐点时刻&#xff0c;特别是北京&#xff0c;正日益逼近感染高峰期。 作为社会生活的毛细血管&#xff0c;快递物流企业们在当下的新冠疫情大背景下上演了一幕幕的鲜活的画面&#xff0c;快递行业市场新…

如何磁盘格式化?分享格式化U盘的3个方法

格式化可以有效管理硬盘&#xff0c;在一定程度上能保证磁盘的性能和使用寿命。尤其是我们遇到一些情况&#xff0c;必须要把U盘进行格式化才行。那么磁盘格式化怎么操作&#xff1f;遇到无法格式化的情况怎么办&#xff1f;别急&#xff0c;下面有3个关于格式化U盘的方法&…

通信协议综述-第3讲 | ifconfig:最熟悉又陌生的命令行

上一节结尾给你留的一个思考题是,你知道怎么查看 IP 地址吗? 当面试听到这个问题的时候,面试者常常会觉得走错了房间。我面试的是技术岗位啊,怎么问这么简单的问题? 的确,即便没有专业学过计算机的人,只要倒腾过电脑,重装过系统,大多也会知道这个问题的答案:在 Win…

图片跟随鼠标移动效果的抖动问题

场景 图片跟随鼠标移动效果的实现思路&#xff1a; 触发mousemove事件响应时&#xff0c;通过e.offsetX,e.offsetY获取到当前鼠标的位置。再修改图片的css样式中的top, left属性&#xff08;图片采用绝对定位&#xff09;。 代码如下&#xff1a; <div id"angel&quo…

车载TBOX嵌入式设备软件的功能测试

作者 | 李伟 上海控安安全测评中心安全测评部总监 来源 | 鉴源实验室 01 Tbox简介 Tbox(Telematics Box)是汽车座舱系统中的一个ECU&#xff0c;物理外观上是一个方正的盒子&#xff0c;通常会有线束接口、HSD接口、通讯和导航天线接口等。软件上Tbox一般会基于Linux操作系统…

音视频面试涨知识(二)

1.YUV知识点 1.1 为什么要有YUV YUV的亮度信号Y和色度信号U/V是分离的&#xff0c;如果只有Y信号分量而没有U/V分量&#xff0c;这样的图像就是黑白灰度图像&#xff0c;从黑白到彩色的兼容方案。 相对RGB&#xff0c;YUV的最大优点是只占用较小的频宽&#xff0c;RGB需要至少…

EasyPytest测试平台开发日志之系统设计

EasyPytest测试平台&#xff0c;帮你高效管理Pytest测试用例。 EP平台的定位是Pytest测试用例管理平台&#xff0c;80%的自动化用例开发在PyCharm等专业的IDE中进行&#xff0c;20%的用例调度和结果查看就交给EP平台来管理。 EP平台是对teprunner测试平台的一次全新升级&#x…

【设计模式】 工厂模式 (三)

文章目录4.2 工厂模式4.2.1 概述4.2.2 简单工厂模式4.2.2.1 结构4.2.2.2 实现4.2.2.4 优缺点4.2.2.3 扩展4.2.3 工厂方法模式4.2.3.1 概念4.2.3.2 结构4.2.3.3 实现4.2.3.4 优缺点4.2.4 抽象工厂模式4.2.4.1 概念4.2.4.2 结构4.2.4.2 实现4.2.4.3 优缺点4.2.4.4 使用场景4.2.5 …

【电脑使用】硬盘无法引导进入系统,无法退出BIOS

前言 因为想要给自己的笔记本添置装备&#xff0c;于是想着把老电脑上的固态拆下来&#xff0c;但是考虑到老电脑虽然不常用&#xff0c;但还是偶尔会用&#xff0c;不能是瘫痪状态&#xff0c;于是想把我之前淘到的一个机械硬盘换上去&#xff0c;结果发现无法引导进入系统&am…

【JavaEE】HTTP(Part1 含面试题)

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录前言一、HTTP协议抓包工具协议总格式&#xff08;重要&#xff01;&#xff01;&#xff09;二、HTTP协议中的细节【HTTP请求】【HTTP中的“方法”】【GET】&#xff1a;最常用的HTTP请求【POST】【认识请求“报头”…

SecureBridge Alexandria Release 2和iOS 15的支持

SecureBridge Alexandria Release 2和iOS 15的支持 添加了对Embarcadero RAD Studio 11 Alexandria Release 2的支持。 增加了对Apple iOS模拟器ARM 64位目标平台的支持。 增加了对Lazarus 2.2.2的支持。 添加了对Apple iOS 15的支持。 增加了对Android 12的支持。 SSH、SFTP、…

ubuntu 安装 colmap

目录 一、安装colmap 二、报错解决 三、安装成功 四、colmap使用教程 一、安装colmap 参考安装&#xff1a;​​​​​​​chttps://blog.csdn.net/weixin_46132232/article/details/124211233 官方&#xff1a;COLMAP 官方information 二、报错解决 2.1 在安装colmap的…

HashMap源码解析

HashMap源码解析 基础入门 什么是哈希 核心理论&#xff1a;Hash 也称散列、哈希&#xff0c;对应的英文都是 Hash。基本原理就是把任意长度的输入&#xff0c;通过Hash算法变为固定长度输出。 这个映射的规则就是对应的 Hash 算法&#xff0c;而原始数据映射后的二进制串就…

飞桨VisualDL本地运行问题

最近参加了百度飞桨的基于深度学习的自然语言处理 免费AI课程&#xff0c;有一道作业题是要利用飞桨提供的可视化工具VisualDL查看词向量降维效果。由于安全方面的原因&#xff0c;AI Studio中的可视化服务无法使用了。当按照作业步骤&#xff0c;生成日志文件后&#xff1a; 添…

Vue3+Element-ul学生管理系统(项目实战)

Vue3Element-ul学生管理系统(项目实战) 要发奋做一个可爱的人。不埋怨谁&#xff0c;不嘲笑谁&#xff0c;也不羡慕谁&#xff0c;阳光下灿烂&#xff0c;风雨中奔跑&#xff0c;做自我的梦&#xff0c;走自我的路&#xff01; 看本项目的前提自己学过Vue2Vue3Elementui组件库 …