Spring Web MVC入门(上)
1. Spring Web MVC
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为“spring MVC”;
什么是Servlet呢?
Servlet 是一种实现动态页面的技术.准确来讲Servlet是一套 Java Web 开发的规范,或者说是一套Java Web 开发的技术标准,只有规范并不能做任何事情,必须要有人去实现它。
所谓实现 Servlet 规范,就是真正编写代码去实现 Servlet 规范提到的各种功能,包括类、方法、属性等。Servlet 规范是开放的,除了 Sun 公司,其它公司也可以实现 Servlet 规范,目前常见的实现了Servlet 规范的产品包括Tomcat、Weblogic、Jetty、Jboss、WebSphere 等,它们都被称为"Servlet 容器"。Servlet 容器用来管理程序员编写的 Servlet 类。
综上所述,Spring Web MVC 是⼀个 Web 框架. 下⾯咱们简称之为: Spring MVC;为了我们能够深入的了解spring mvc,我们下面首先来了解一下mvc;
1.1 MVC 定义
MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分 为模型、视图和控制器三个基本部分;其mvc结构如下所示:

View(视图):指在应用程序中专门用来与浏览器进行交互,展示数据的资源。
Controller(控制器):可以理解为一个分发器,用来决定对于视图发来的请求,需要用到哪一个模型来处理,以及处理完后需要跳回到哪一个试图。即用来连接视图和模型。
Model(模型):是应用程序的主体部分,用来处理程序中数据逻辑的部分。
1.2 理解Spring MVC
MVC 是⼀种架构设计模式, 也⼀种思想, ⽽ Spring MVC 是对 MVC 思想的具体实现. 除此之外, Spring MVC还是⼀个Web框架.
总结来说,Spring MVC 是⼀个实现了 MVC 模式的 Web 框架. 所以, Spring MVC主要关注有两个点:
1、mvc思想;
2、web框架;
其实, Spring MVC 我们在前⾯已经⽤过了, 在创建 Spring Boot 项⽬时,我们勾选的 Spring Web 框架其实就是 Spring MVC 框架,如下图所示:

如上图所示,Build web, including RESTful, applications using Spring MVC. Uses Apache Tomcat as the defaultembedded container. 说明创建spring boot项目应用了Spring MVC框架。
我们也可以这样理解,Spring Boot 只是实现Spring MVC的其中⼀种⽅式⽽已. Spring Boot 可以添加很多依赖, 借助这些依赖实现不同的功能. Spring Boot 通过添加Spring Web MVC框架, 来实现web功能.
不过Spring在实现MVC时, 也结合⾃⾝项⽬的特点, 做了⼀些改变, 相对⽽⾔, 下⾯这个图更能提体现spring 实现mvc思想的结构图:

2. 学习spring mvc
既然是 Web 框架, 那么当用户在浏览器中输⼊了 url 之后,我们的 Spring MVC 项⽬就可以感知到用户的请求, 并给予响应. 故此学习Spring MVC, 重点也就是学习如何通过浏览器和⽤⼾程序进⾏交互,主要是下面三个方面:
1、建立连接:将用户(浏览器)和Java程序连接起来,也就是浏览器访问一个地址能够调用到我们的Spring程序。
2、请求:用户请求的时候,会带一些参数,在spring程序中要想办法获取到参数,所以请求主要是 要带有获取参数的功能。
3、响应:执行了业务逻辑之后,要把spring程序执行的结果返回给用户,也就是响应。
对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC.
2.1 项⽬准备
Spring MVC 项⽬创建和 Spring Boot 创建项⽬相同,在创建的时候选择 Spring Web 就相当于创建了 Spring MVC 的项⽬.
Spring MVC 使⽤ Spring Boot 的⽅式创建 ,创建项⽬时, 勾选上 Spring Web 模块即可,如下图所⽰:

2.2 建⽴连接
在Spring MVC中使用注解:@RequestMapping,就是用来实现URL路由映射的,也就是浏览器连接程序的作用。
创建UserController 类,编写如下代码:
package com.example.zxslzw2014_8_11;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@RequestMapping("/hello")public String hello(){return "hello,仲夏是荔枝味!";}
}
注意:⽅法名和路径名称⽆需⼀致
2.2.1 @RequestMapping 使用
@RequestMapping 是Spring Web MVC 应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的。
上面代码中注解里包含 "/hello",表示服务器收到浏览器请求时,路径为 /hello 的请求就会调用 hello这个方法的代码。
路由映射:当用户访问一个URL时,将用户的请求对应到程序中某个类的某个方法,就叫做路由映射。
@RequestController的作用:
既然使用@RequestMapping就可以使浏览器知道要把请求教给哪个方法了,那为什么还要加上@RequestController呢?我们现在把@RequestController去掉,再访问一次看看:
可以看到, 程序报了404, 找不到该⻚⾯. 这就是 @RestController 起到的作⽤.
⼀个项⽬中, 会有很多类, 每个类可能有很多的⽅法, Spring程序怎么知道要执⾏哪个⽅法呢?
Spring会对所有的类进⾏扫描, 如果类加了注解@RestController, Spring才会去看这个类⾥⾯的⽅法 有没有加 @RequestMapping 这个注解,spring就不会对这个类进行扫描,更不用说对着这个类的方法进行访问了;
2.2.2 @RequestMapping 使⽤
@RequestMapping 既可以修饰类,也可以修饰方法,当同时修饰类和方法时,访问的地址就是类路径 + 方法路径。
@RequestMapping标识一个类:设置映射请求的请求路径的初始信息。
@RequestMapping标识一个方法:设置映射请求的请求路径的具体信息。
修改代码如下,给类加上注解:
package com.example.zxslzw2014_8_11;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("/hello")public String hello(){return "hello,仲夏是荔枝味!";}
}

@RequestMapping的URL路径前面不加 / (斜杠)也是可以的,Spring程序启动时,会进行判断,如果前面没有加 / ,Spring会自己拼接上一个 / 。现在代码如下:
package com.example.zxslzw2014_8_11;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("user")
public class UserController {@RequestMapping("hello")public String hello(){return "hello,仲夏是荔枝味!";}
}

综上所述,结果是没有发生变化的;
但在开发时还是建议把 / 加上,大部分企业的规范也是加上的,@RequestMapping的URL路径也可以是多层路径,但最终访问时,依然是:类路径 + 方法路径。
2.2.3 @RequestMapping是GET还是POST请求
GET请求:
浏览器发送的请求类型,都是get方法的,通过上面代码案例可以看出来@RequestMapping支持get请求。下面用fiddler抓包如下:

POST请求:
我们通过form表单来构造请求,先创建test.html,前端代码如下所示;
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><form action="/user/sayHi" method="post"><input type="submit" value="提交"></form></body>
</html>
将前端代码要放在static目录下:

访问地址url为http://127.0.0.1:8080/user/hello,点击提交;


从运⾏结果可以看出: @RequestMapping 既⽀持Get请求, ⼜⽀持Post请求. 同理, 也⽀持其他的请 求⽅式.
2.2.4 指定GET/POST⽅法类型
可以显⽰的指定@RequestMapping 来接收POST的情况,如下所⽰:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController2 {@RequestMapping(value = "/getRequest",method= RequestMethod.POST)public String sayHi(){return "get request...";}
}
3.postman的学习
3.1 下载安装Postman
(略)
3.2 创建请求
下图为添加请求页面的介绍:

下图为请求的响应结果:

3.3 传参介绍
3.3.1 普通传参
学习HTTP环节时,我们通过URL来访问互联网上的某一个资源,URL的格式如下:

其中, 查询字符串就是请求的参数,如下所示:

3.3.2. form-data
(完整表⽰为: multipart/form-data)
表单提交的数据,在 form 标签中加上:enctyped="multipart/form-data",通常用于提交图片 / 文件。对应 Content-Type:multipart/form-data。

3.3.3 x-www-form-urlencoded
form表单,对应:Content-Type: appliction/x-www-from-urlencode

3.3.4 raw
可以上传任意的文本格式,例如text、json、xml、html等等,如图:

ps:本次的内容就到这里了,如果对你有所帮助的话,就请一键三连哦!!!
本文的封面来自:bilibili苏杉杉的pv,侵权删 url:https://www.bilibili.com/video/BV1vo4y167eh/?spm_id_from=333.999.0.0&vd_source=866da5be2ef0ddd213b053523da53138
————————————————
电子签名:上嘉路
相关文章:
Spring Web MVC入门(上)
1. Spring Web MVC Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为“spring MVC”; 什么是Servlet呢? Servlet…...
【c++】公差判断函数 isInTolerance
定义: isInTolerance 函数用来判断一个特定数值(变量)是否在以某个中心值为基准 ,给定半径的范围内。这个函数包含了一个可选的参数 includeEndpoints(默认为 true), 用于决定范围是否包含其端点…...
电脑新加的硬盘如何分区?新加硬盘分区选MBR还是GPT
最近有网友问我,电脑新加的硬盘如何分区?电脑新加的硬盘分区选MBR还是GPT要看引导模式采用uefi还是传统的legacy模式,如果采用的是uefi引导模式,分区类型对应的就是gpt分区(guid),如果引导模式采用的是legacy,对应的分区类型为mb…...
白骑士的Matlab教学基础篇 1.3 控制流
系列目录 上一篇:白骑士的Matlab教学基础篇 1.2 MATLAB基础语法 控制流是编程中的核心概念,通过控制程序执行的顺序,从而实现复杂的逻辑操作。MATLAB 提供了多种控制流语句,包括条件语句、循环语句以及循环控制语句。掌握这些控制…...
设计模式 - 适配器模式
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、适配器…...
docker部署minIO
docker部署minIO 旧版本新版本 旧版本 #-u 以root用户运行容器;--privilegedtrue 给予容器命令访问权限 docker pull minio/minio:RELEASE.2021-06-17T00-10-46Z docker run -p 9001:9000 --name minio -d \-u root --privilegedtrue \-e "MINIO_ROOT_USERmin…...
「Pytorch」BF16 Mixed Precision Training
在深度学习领域,神经网络的训练性能瓶颈常常出现在 GPU显存的使用上。主要表现为两方面: 单卡上可容纳的模型和数据量有限;显存与计算单元之间的带宽和延迟限制了运算速度; 为了解决显卡瓶颈的问题,涌现了不同的解决…...
论文阅读:Efficient Core Maintenance in Large Bipartite Graphs | SIGMOD 2024
还记得我们昨天讨论的《Querying Historical Cohesive Subgraphs over Temporal Bipartite Graphs》这篇论文吗? https://blog.csdn.net/m0_62361730/article/details/141003301 这篇(还没看的快去看) 这篇论文主要研究如何在时间双向图上查询历史凝聚子图,而《E…...
LLMOps — 使用 BentoML 为 Llama-3 模型提供服务
使用 BentoML 和 Runpod 快速设置 LLM API 经常看到数据科学家对 LLM 的开发感兴趣,包括模型架构、训练技术或数据收集。然而,我注意到,很多时候,除了理论方面,许多人在以用户实际使用的方式提供这些模型时遇到了问题…...
微软蓝屏事件揭秘:有问题的数据引发内存读取越界
讲动人的故事,写懂人的代码 CrowdStrike前一阵在官网上发布了上周爆发的全球企业微软蓝屏事件的官方初步复盘结果。其中谈到了这次事件的根本原因: 2024年7月19日,我们部署了两个额外的IPC模板实例。由于内容验证器中的一个bug,使…...
NASA:北极ARCTAS差分吸收激光雷达(DIAL)遥感数据
ARCTAS Differential Absorption Lidar (DIAL) Remotely Sensed Data ARCTAS差分吸收激光雷达(DIAL)遥感数据 简介 ARCTAS差分吸收激光雷达(DIAL)遥感数据是一种远程感测技术,用于测量大气中不同波长的激光辐射被大…...
Android 文件上传与下载
在实际开发涉及文件上传不会自己写上传代码,一般 会集成第三网络库来做图片上传,比如android-async-http,okhttp等,另外还有七牛也提供 了下载和上传的API。 1.项目用到的图片上传的关键方法: 这里用到一个第三方的库…...
Java语言的充电桩系统Charging station system
介绍 SpringBoot 框架,充电桩平台充电桩系统充电平台充电桩互联互通协议云快充协议1.5-1.6协议新能源汽车二轮车公交车二轮车充电-四轮车充电充电源代码充电平台源码Java源码-共享充电桩-充电桩软件 软件介绍 小程序端:城市切换、附近电站、电桩详情页…...
RCE之无参数读取文件
什么是无参数? 顾名思义,就是只使用函数,且函数不能带有参数,这里有种种限制:比如我们选择的函数必须能接受其括号内函数的返回值;使用的函数规定必须参数为空或者为一个参数等 例题: <?…...
Python GUI开发必看:Tkinter Button控件使用详解
Button(按钮)组件用于实现各种各样的按钮。 Button组件可以包含文本或图像,你可以将一个Python的函数或方法与之相关联,当按钮被按下时,对应的函数或方法将被自动执行。 Button组件仅能显示单一字体的文本,…...
上海市计算机学会竞赛平台2024年7月月赛丙组得分排名
题目描述 给定 nn 名学生的考试得分,这些学生的学号为 11 到 nn,其第 ii 号学生的得分为 aiai,请将这些学生按照分数从大到小的顺序排列并输出学号序列。 若两个学生得分相同,则先输出较小的学号。 输入格式 第一行…...
Can GPT-3 Perform Statutory Reasoning?
文章目录 题目摘要相关工作SARAGPT-3 对美国法典的了解GPT-3 在对合成法规进行简单推理时遇到困难结论 题目 GPT-3 可以进行法定推理吗? 论文地址:https://arxiv.org/abs/2302.06100 摘要 法定推理是用事实和法规进行推理的任务,法规是立法机…...
redis面试(十一)锁超时
boolean res lock.tryLock(100, 10, TimeUnit.SECONDS); RedissonLock里面有这样一个方法tryLock(),意思是尝试获取锁的结果。 最大等待时间100s,并且获取到锁之后,10s之内没有释放的话,锁会自动失效。 尝试获取锁超时 time …...
C代码做底层及Matlab_SimuLink做应用层设计单片机程序
前言:SimuLink工具极其强大,但是能直接支持单片机自主开发的很少,造成这个问题的原因主要是我们使用的芯片底层多是C代码工程,芯片厂家也只提供C代码库,很少能提供SimuLink的支持库,即使提供也不是很不完善,如NXP的一些芯片提供的SimuLink库不含盖高级应用,再比如意法半…...
Cloud Kernel SIG 月度动态:ANCK OOT 驱动基线更新,发布 2 个 ANCK 版本
Cloud Kernel SIG(Special Interest Group):支撑龙蜥内核版本的研发、发布和服务,提供生产可用的高性价比内核产品。 01 SIG 整体进展 1. 发布 ANCK 5.10-016.4 小版本。 2. 发布 ANCK 5.10-017.1 小版本。 3. ANCK 新增海光平…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...

