【Spring】详解SpringMVC,一篇文章带你快速入门

目录

一、初始MVC

二、SpringMVC

三、Spring MVC的运用

⭕@RequestMapping

⭕传递参数

1、传递单个参数 

2、传递多个参数

3、参数重命名

4、传递数组与集合

5、获取路径参数

6、传递JSON数据

7、上传文件


一、初始MVC

MVC(Model-View-Controller)是一种软件架构模式,主要用于简化复杂的应用程序开发过程,尤其是在Web应用中。将软件系统分成了模型、视图和控制器三个基本部分

  • 模型(Model)

模型是应用程序中用于处理应用程序数据逻辑的部分。它直接管理数据、逻辑和规则,并且与数据库交互。通常包含业务逻辑和业务数据。

  • 视图(View)

视图是应用程序中处理数据显示的部分。任何可以输出最终用户结果的界面都是视图的一部分。视图负责呈现数据给用户,并且不包含任何业务逻辑。

  • 控制器(Controller)

控制器是应用程序中处理用户交互的部分。它接收用户的输入并调用模型和视图去完成用户的需求。简单来说,控制器就是模型和视图之间的协调者。

一个简单的MVC模式示例:

假设有一个学生管理系统,其中包含学生的姓名、年龄等信息。

  • 模型:定义了学生的属性和方法,如获取学生信息、更新学生信息等。
  • 视图:负责展示学生的详细信息,可能是一个网页表格或者一个对话框。
  • 控制器:处理用户事件(如点击按钮),更新学生信息,并告诉视图重新显示更新后的信息。

二、SpringMVC

Spring MVC 是 Spring 框架的一个模块,专注于Web应用的表示层。它就是基于 MVC 架构模式的实现,用于构建灵活且松耦合的Web应用程序。总的来说,Spring MVC就是一个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架

Spring MVC 全称是 Spring Web MVC

不过Spring在实现MVC时, 也结合⾃⾝项⽬的特点, 做了⼀些改变, 相对⽽⾔, 下⾯这个图或许更加合适⼀些

🌰其实就相当于去饭店吃饭时,直接在 前台 (控制器) 点单 (提出需求),前台 将需求传递给 后厨 (模型),由 后厨负责把菜做好 (处理需求),做好了返回给 前台,再叫 服务员 (视图) 把菜端给客户 (显示结果)

三、Spring MVC的运用

⭕@RequestMapping

@RequestMapping 是 Spring 框架中的一个核心注解,它是⽤来注册接⼝的路由映射的

路由映射(Routing):是指当⽤⼾访问⼀个 URL 时,映射 Web 请求到应用程序中特定的处理类或处理方法上的过程

@RequestMapping 既可修饰类,也可以修饰⽅法 ,当修饰类和⽅法时,访问的地址是类路径 + ⽅法路径
@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/hello")public String say(){return "hello, Spring MVC";}
}

  • @RequestMappingGET 还是 POST 请求?
让我们用ApiFox测试一下:
发送 GET 请求:
发送 POST 请求:
从测试结果可以看出: 
@RequestMapping 既⽀持 GET 请求,⼜⽀持 POST 请求。同理,也⽀持其他的请求⽅式。可以说这个注解就是一个万金油了,不知道对方会发啥请求,用这个就对了。
  • 不过,在一些需求中,需要指定好用户发送的请求类型。我们也可以通过参数 method 来限定请求类型:
@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping(value="/hello",method = RequestMethod.POST)public String say(){return "hello, Spring MVC";}
}

这时在发送 GET 请求就会 出现错误:

这里报了个 405 的错误,错误原因是 “Method Not Allowed”,也就是 方法不支持,其实就是服务端没有能处理这个 GET 请求的方法。

遇到错误不要慌,我们今后还会遇到各种各样的错误的,多遇到几次,熟悉熟悉就好了😁

Spring 还提供了 @PostMapping()、@GETMapping()、@PUTMapping()、@DELETEMapping()方法注解,用来针对某一应用场景。实际开发中使用 @RequestMapping 还是其它注解功能上其实没啥区别,还是看具体的公司规范个人习惯来选择使用


⭕传递参数

1、传递单个参数 
接收单个参数, 在 Spring MVC 中直接⽤⽅法中的参数就可以,⽐如以下代码:
@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/hello")public String say(String name){return "hello, "+name;}
}

可以看到,后端程序正确拿到了name参数的值。
Spring MVC 会根据⽅法的参数名, 找到对应的参数, 赋值给⽅法

如果参数不一致就会出现,就会导致无法获取参数:

注意:

  • 如果采用包装类型接收参数时,如果不传参数的话,由于包装类型会有初始值,所以并不会出现报错,而是会返回默认的 null值
  • 如果采用基本类型来接收参数时,如果不穿参数的话(boolean 类型除外),就会报500错误。因为基本类型没有被初始化。

让我们看看下面这个代码:

@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/age")public String age(int age){return "age: "+age;}
}

正常传参:

程序正常响应,HTTP响应状态码为200

不传参:

程序发送错误,HTTP状态码为500

传递错误参数:

程序发生错误,这里要的是int型参数,但传来的确是字符串,类型不匹配。HTTP状态码为400

  • 因此在实际开发中,对于参数可能为空的数据,还是建议用包装类型,相对没那么容易出错。
2、传递多个参数
  • 直接使用多个形参接收:
@RequestMapping("/user")
@RestController
public class UserController {public String login(String username,String password){return "username: "+username+"  password: "+password;}
}

注意:

这里路径上参数的顺序并不用和服务端一一对应,主要是采用键值对的形式,一参数的名称进行匹配的,参数的顺序并不会影响后端获取参数。

不过,与单个参数时类似,路径上参数的名字必须与后端方法中的形参名称保持一致,程序才能正确读写。不写或错写都会导致后端无法正常匹配参数。

同样的,如果参数里有基本类型但没有成功接收参数,就会出现 400 错误,如果是包装类型参数未接收就会为默认的 null值,这里就不做演示了。

  • 采用对象传参

如果参数比较多,就需要在方法声明中协议很多形参,这对代码的书写与维护都是不太友好的。因此,我们可以将这些参数封装成一个对象:

Spring MVC 可以⾃动实现对象参数的赋值,⽐如 User对象:
public class User {private String name;private String password;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", password='" + password + '\'' +'}';}
}

就可以将形参换为自定义对象了:

@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/login")public String login(User user){return user.toString();}
}

路径中的参数要与对应类的成员变量名保持一致:

Spring 会根据参数名称⾃动绑定到对象的各个属性上,如果某个属性未传递,则赋值为null(基本类型则赋值为默认初识值,⽐如int类型的属性,会被赋值为0)

3、参数重命名

在一些应用场景中,我们并不希望直接使用前端传来的参数名进行接收,就可以用 @RequestParam(" ") 注解来进行参数的重命名:

@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/time")public String getTime(@RequestParam("time") String createtime){return "createtime: "+createtime;}
}

正常传参:

同样的,这时传递错误的参数名也会报 400 :

说明使⽤ @RequestParam 进⾏参数重命名时,请求参数只能和 @RequestParam 声明的名称⼀致,才能进⾏参数绑定和赋值

不同的是,此时不传参也会报 400 :

因为这时当形参前加上 @RequestParam() 注解时,该参数会默认变成必传参数,如果不传就会发生错误。

而有的时候业务上该参数可能是一个非必传参数,我们就可以通过设置 @RequestParam 中的required 来进行调整。

  • required默认为 true,表示为必传参数。当把required设置为 false 时,就是非必传参数了:
@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/time")public String getTime(@RequestParam(value="time",required=false) String createtime){return "createtime: "+createtime;}
}

不传参:

传错参:

这样设置后,即使不传参也不会报 400了。

4、传递数组与集合
Spring MVC 可以⾃动绑定数组参数的赋值:
@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/array")public String getArray(String[] array){return Arrays.toString(array);}
}

在url上有两种传参方式:

方式一

方式二

类似的,Spring MVC 可以⾃动绑定集合参数的赋值,不过需要通过使⽤ @RequestParam 绑定参数关系:

@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/list")public String getList(@RequestParam List<String> list){return "size:"+list.size()+" list:"+list;}
}

这样就能像获取数组一样将多个参数名一致的请求自动自动封装成集合类了:

默认情况下,请求中参数名相同的多个值,是封装到数组。如果要封装到集合,要使⽤
@RequestParam 绑定参数关系
5、获取路径参数

所谓路径参数就是指不以键值对的形式直接出现在url中的参数,举个栗子:

上面这个url中的 “1” 就是一个路径参数。让我们先来试试直接接收会发生什么:

@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/text/{id}")public String getId(Integer id){return "id:"+id;}
}

注意:路径参数的url我们需要用 { } 来包裹起来

我们发现后端并不能够拿到路径参数。我们需要使用 @PathVariable 注解与请求URL路径上的数据绑定:

@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/text/{id}")public String getId(@PathVariable Integer id){return "id:"+id;}
}

这样就能成功获取路径参数了:

  • 获取多个路径参数:
@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/text/{id}/{name}")public String getId(@PathVariable Integer id,@PathVariable String name){return "id:"+id+" name:"+name;}  
}

注意:如果后端要获取多个路径参数时,每个参数都会变成必传参数,因为后端无法判别是哪个路径参数没有传递,就会发生错误

6、传递JSON数据
接收JSON对象, 需要使⽤ @RequestBody 注解
RequestBody: 请求正⽂,意思是这个注解作⽤在请求正⽂的数据绑定,请求参数必须在写在请求正⽂中
我们先试试不加 @RequestBody 注解直接接收 JSON 对象会发生什么:
我们会发现后端并不能成功成功读取 JSON 对象。再用Fiddler抓包看看:

我们可以看到,JSON 对象的确成功传过去了。但后端却把  JSON 字符串当成了一个不可拆分的整体,所以这样拿不到传递的参数。

让我们再加上 @RequestBody 注解试试看:

@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/login")public String login(@RequestBody User user){return user.toString();}
}

由此我们可以得出,当后端需要接收 JSON 对象时,需要在形参前加上 @RequestBody 注解,才能正确接收。
7、上传文件

主要通过 @RequestPart("file") 注解来实现:

@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/file")public String getFile(@RequestPart("file")MultipartFile file) throws IOException {//获取文件名称String fileName=file.getOriginalFilename();//将文件上传至指定路径下file.transferTo(new File("D:/picture/"+fileName));return "文件名称:"+fileName;}
}

可以看到后端成功获取了文件的名称。在去指定路径下看看文件是否上传成功:

注意:如果文件过大就会导致上传失败了


那么本篇文章就到此为止了,如果觉得这篇文章对你有帮助的话,可以点一下关注和点赞来支持作者哦。如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊

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

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

相关文章

在不能联网的电脑上安装库(PyEMD为例)

1、查看PyEMD需要什么依赖 需要numpy、pathos、scipy、tqdm依赖&#xff0c;我电脑上有了numpy, scipy&#xff0c;以另外两个为例 2、查看依赖的依赖 查看依赖是否还要依赖 可以看到pathos还要这四个依赖&#xff0c;以此类推&#xff0c;看还要哪些依赖&#xff0c;直至req…

Mac 使用脚本批量导入 Apple 歌曲

最近呢&#xff0c;买了一个 iPad&#xff0c;虽然家里笔记本台式都有&#xff0c;显示器都是 2个&#xff0c;比较方便看代码&#xff08;边打游戏边追剧&#xff09;。 但是在床上拿笔记本始终还是不方便&#xff0c;手机在家看还是小了点&#xff0c;自从有 iPad 之后&…

【Java】java 集合框架(详解)

&#x1f4c3;个人主页&#xff1a;island1314 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 1. 概述 &#x1f680; &#x1f525; Java集合框架 提供了一系列用于存储和操作…

实现uniapp天地图边界范围覆盖

在uniapp中&#xff0c;难免会遇到使用地图展示的功能&#xff0c;但是百度谷歌这些收费的显然对于大部分开源节流的开发者是不愿意接受的&#xff0c;所以天地图则是最佳选择。 此篇文章&#xff0c;详细的实现地图展示功能&#xff0c;并且可以自定义容器宽高&#xff0c;还可…

java项目之电影评论网站(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的电影评论网站。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 电影评论网站的主要使用者管…

UE5 源码学习 初始化

跟着 https://www.cnblogs.com/timlly/p/13877623.html 学习 入口函数 UnrealEngine\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp WinMain 入口 int32 WINAPI WinMain(_In_ HINSTANCE hInInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ char* p…

8.three.js相机详解

8.three.js相机详解 1、 认识相机 在Threejs中相机的表示是THREE.Camera&#xff0c;它是相机的抽象基类&#xff0c;其子类有两种相机&#xff0c;分别是正投影相机THREE.OrthographicCamera和透视投影相机THREE.PerspectiveCamera&#xff1a; 正投影和透视投影的区别是&am…

Excel:vba实现生成随机数

Sub 生成随机数字()Dim randomNumber As IntegerDim minValue As IntegerDim maxValue As Integer 设置随机数的范围(假入班级里面有43个学生&#xff0c;学号是从1→43)minValue 1maxValue 43 生成随机数(在1到43之间生成随机数)randomNumber Application.WorksheetFunctio…

element 按钮变形 el-button样式异常

什么都没动&#xff0c;element UI的按钮变形了&#xff0c;莫名其妙&#xff0c;连官网的也变形了&#xff0c;换了其它浏览器又正常&#xff0c; 难道这是element UI的问题&#xff1f;NO&#xff0c;是浏览器的插件影响到了&#xff01;去扩展插件里面一个个关闭扩展&#x…

时间序列预测(十)——长短期记忆网络(LSTM)

目录 一、LSTM结构 二、LSTM 核心思想 三、LSTM分步演练 &#xff08;一&#xff09;初始化 1、权重和偏置初始化 2、初始细胞状态和隐藏状态初始化 &#xff08;二&#xff09;前向传播 1、遗忘门计算&#xff08;决定从上一时刻隐状态中丢弃多少信息&#xff09; 2、…

CSS 样式 box-sizing: border-box; 用于控制元素的盒模型如何计算宽度和高度

文章目录 box-sizing: border-box; 的含义默认盒模型 (content-box)border-box 盒模型 在微信小程序中的应用示例 在微信小程序中&#xff0c;CSS 样式 box-sizing: border-box; 用于控制元素的盒模型如何计算宽度和高度。具体来说&#xff0c; box-sizing: border-box; 会改…

使用TimeShift备份和恢复Ubuntu Linux

您是否曾经想过如何备份和恢复您的Ubuntu或Debian系统&#xff1f;TimeShift是一个强大的备份和还原工具。TimeShift允许您创建系统快照&#xff0c;提供了一种在出现意外问题或系统故障时恢复到先前状态的简便方式。您可以使用RSYNC或BTRFS创建快照。 有了这个介绍&#xff0…

SSM 图书馆借还系统-计算机设计毕业源码24465

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文章节安排 2相关技术介绍 2.1 B/S结构 2.2 SSM框架 2.3 MySQL数据库 3系统分析 3.1 可行性分析 3.2 系统功能性分析 3.3.非功能性分析 3.4 系统用例分析 3.5系统流程分析 3.5.1 用户登录流程 3.5.2 数据删…

中小企业设备资源优化:Spring Boot系统实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

ruoyi域名跳转缓存冲突问题(解决办法修改:session名修改session的JSESSIONID名称)

【版权所有&#xff0c;文章允许转载&#xff0c;但须以链接方式注明源地址&#xff0c;否则追究法律责任】【创作不易&#xff0c;点个赞就是对我最大的支持】 前言 仅作为学习笔记&#xff0c;供大家参考 总结的不错的话&#xff0c;记得点赞收藏关注哦&#xff01; 目录 前…

Prism 四事件聚合器

#1024程序员节&#xff5c;征文# 不废话&#xff0c;直接上代码一个简单的示例。 1、事件聚合 创建一个文件夹EventBLL&#xff0c;添加EventDemo.cs&#xff0c;代码如下。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using …

linux中级wed服务器(https搭建加密服务器)

一。非对称加密算法&#xff1a; 公钥&#xff1a;公共密钥&#xff0c;开放 私钥&#xff1a;私有密钥&#xff0c;保密 1.发送方用自己的公钥加密&#xff0c;接受方用发送方的私钥解密&#xff1a;不可行 2.发送方用接受方的公钥加密&#xff0c;接受方用自己的私钥解密…

SpringMVC实战:构建高效表述层框架

文章目录 1. SpringMVC简介和体验1.1 介绍1.2 主要作用1.3 核心组件和调用流程1.4 快速体验 2. SpringMVC接收数据2.1 访问路径设置2.2 接收参数2.2.1 param和json参数比较2.2.2 param参数接收2.2.3 路径参数接收2.2.4 json参数接收 2.3 接收cookie数据2.4 接收请求头数据2.5 原…

【开源免费】基于SpringBoot+Vue.JS在线文档管理系统(JAVA毕业设计)

本文项目编号 T 038 &#xff0c;文末自助获取源码 \color{red}{T038&#xff0c;文末自助获取源码} T038&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

CryoEM - 冷冻电镜 基于深度学习的 从头重构(Ab-initio Reconstruction) 开源项目 教程

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/143162494 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 来源于 CryoDragon 算法 冷冻电镜(CryoEM) 是一种成像方式,为蛋白质和…