【Spring】Spring MVC

目 录

  • 一.什么是 Spring MVC?
    • 1.MVC 定义
    • 2.MVC 和 Spring MVC 的关系
  • 二.为什么要学 Spring MVC?
  • 三.怎么学 Spring MVC?
    • 1.Spring MVC 创建和连接
      • 综上连接方式:
    • 2.获取参数
      • 1.传递单个参数
      • 2.获取多个参数
      • 3.获取对象
      • 4.获取表单参数
      • 5.接收JSON对象
      • 6.上传文件
      • 7.获取Cookie/Session/header
      • 8.后端参数重命名
      • 9.特殊的URL地址和获取参数的方式:
    • 3.返回数据
      • 请求转发和请求重定向

一.什么是 Spring MVC?

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称 “Spring Web MVC” 来自其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC”。

从上述定义我们可以得出两个关键信息:

  1. Spring MVC 是⼀个 Web 框架。
  2. Spring MVC 是基于 Servlet API 构建的。

1.MVC 定义

MVC 是 Model View Controller 的缩写,它是软件工程中的⼀种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。

  • Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据

  • View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。

  • Controller(控制器)是应用程序中处理⽤户交互的部分。通常控制器负责从视图读取数据,控制用户输⼊,并向模型发送数据。

2.MVC 和 Spring MVC 的关系

MVC 是⼀种思想,而 Spring MVC 是对 MVC 思想的具体实现。

总结来说,Spring MVC 是⼀个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。既然是 Web框架,那么当⽤户在浏览器中输入了 url 之后,我们的 Spring MVC 项目就可以感知到用户的请求。


二.为什么要学 Spring MVC?

现在绝大部分的 Java 项目都是基于 Spring(或 Spring Boot)的,而 Spring 的核心就是 SpringMVC。也就是说 Spring MVC 是 Spring 框架的核心模块,而 Spring Boot 是 Spring 的脚手架,因此我们可以推断出,现在市面上绝大部分的 Java 项目约等于 Spring MVC 项目,这是我们要学 SpringMVC 的原因

在创建 Spring Boot 项目时,我们勾选的 Spring Web 框架其实就是 Spring MVC 框架,如下图所示:

在这里插入图片描述

Spring MVC 它是⼀切项目的基础,以后创建的所有Spring、Spring Boot 项目基本都是基于 Spring MVC 的。


三.怎么学 Spring MVC?

  1. 连接的功能:将用户(浏览器)和 Java 程序连接起来,也就是访问一个地址能够调用到我们的Spring 程序。
  2. 获取参数的功能:用户访问的时候会带一些参数,在程序中要想办法获取到参数。
  3. 输出数据的功能:执行了业务逻辑之后,要把程序执行的结果返回给用户。

对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC。

1.Spring MVC 创建和连接

在创建的时候选择 Spring Web 就相当于创建了 Spring MVC 的项目,在 Spring MVC 中使用 @RequestMapping 来实现 URL 路由映射,也就是浏览器连接程序的作用

在这里插入图片描述

  1. 由于 Spring MVC 在前端页面显示的是 view 信息,我们此处就需要用 @ResponseBody 声明当前类返回的是非静态页面@RequestMapping 在浏览器中可以实现路由映射,如上面代码,端口号是 8181 ,我们使用端口号加上类路由加上方法路由就可以访问到程序
    在这里插入图片描述
  2. 也可以把类的路由省略,只要端口号加上方法路由也可以访问,但是方法路由不能省略,必须得有
    在这里插入图片描述
  3. @Controller 控制器,在 Spring 启动时加载并注册,根据前面的五大类注解,这里可不可以换成别的注解呢?答案是不行的,此处只能使用 @Controller 注解,由于我们的 @Controller 是配合着 @ResponseBody 使用的,他们也可以缩写成一个注解 @RestController,并且功能还是齐全的
    在这里插入图片描述
    在这里插入图片描述
    @RestController = @Controller + @ResponseBody:是一个http控制器,返回的是非静态页面的数据

@RequestMapping 是 post 还是 get 请求?

使用 PostMan 测试⼀下,默认情况下使用注解 @RequestMapping 是否可以接收 GET 或 POST 请求

在这里插入图片描述

在这里插入图片描述

由此可发现 @RequestMapping 既是 post 也是 get 请求,我们还可以在 @RequestMapping 中修改是使用 post 还是 get 请求,在 @RequestMapping 中加入一个 method 即可

在这里插入图片描述

还有一种简化版写法:@GetMapping

在这里插入图片描述

综上连接方式:

  • @RequestMapping : 支持使用类型的接口访问(包含Get/Post… . )

  • @PostMapping : 只支持Post请求

  • @GetMapping : 只支持Get请求

注意:以上注解需要配合 @Controller 或 @RestController 一起使用。


2.获取参数

参数请求的类型:

  • URL传参
  • Ajax传参
  • Form表单传参

1.传递单个参数

在后端代码中这样编写单个参数的获取

在这里插入图片描述

在前端URL中传参:

在这里插入图片描述

注意:参数名必须相同,才能获取到参数的值。

这种方式也是 Spring MVC (Spring Web)主要获取参数的方式。

2.获取多个参数

在这里插入图片描述

在这里插入图片描述

Spring MVC 中当传递多个参数的时候,传递参数的顺序是不影响程序执行的,获取参数的结果之和参数的名称有关,和顺序无关。

3.获取对象

创建一个学生类:

在这里插入图片描述

调用:

在这里插入图片描述

在这里插入图片描述

注意事项:参数的传递是对大小写敏感的,此处不要写错

4.获取表单参数

  • 获取少数 form 表单参数

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

此处就可以获取到表单参数了

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

  • 获取多参数 form 表单参数(封装成对象)

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

5.接收JSON对象

在这里插入图片描述

后端接收代码:

在这里插入图片描述

此处既不能用单个数据类型接收也不能用对象,只能用 @RequestBody 加对象的方式来获取

6.上传文件

在这里插入图片描述

在本地创建的一个目录 D:\Testpng 用来测试桌面的图片是否能存储到文件夹中

在 postman 中传:

在这里插入图片描述

在 D 盘中的目录:

在这里插入图片描述

表示当前文件传输成功了

此处写绝对路径

7.获取Cookie/Session/header

获取 Cookie:
在这里插入图片描述

访问浏览器,由于浏览器里我们没有存储 Cookie,此处使用开发者工具添加 cookie,然后进行打印:

在这里插入图片描述

如果有多个 cookie 需要打印,只需要在 @CookieValue(“java”)String java 后面加个逗号隔开继续添加即可

浏览器会默认将当前网站的所有 cookie 发送给后端,是因为 http 协议无状态。

Session 获取:

设置 Session:

在这里插入图片描述

读取:

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

获取 header:

在这里插入图片描述

通过 fiddler 抓包看到百度的 User-Agent

在这里插入图片描述

在这里插入图片描述


8.后端参数重命名

例如我们后端写了一个 time 的程序,前端输入数据的时候,只想用 t 来表示,前后端都不妥协的情况下就只能后端来加一个注解来过渡了

在这里插入图片描述

在这里插入图片描述

此时我们需要在代码里加入注解:

在这里插入图片描述

只能识别 t 参数,并将t参数的值,设置给 time 变量,此时即使使用 time 参数,那么当前的写法也是读取不到前端的参数的,它只认参数名为 t 的参数。所以加了个 required ,传递的不是按规则来的就直接为 null,而不是报错,设置参数是否必传,如果是 true 就需要必传。

在这里插入图片描述


9.特殊的URL地址和获取参数的方式:

在这里插入图片描述

如果想重命名就按照上面 name 的格式来,不用重命名就按照上面 password 来。

在这里插入图片描述


3.返回数据

默认请求下无论是 Spring MVC 或者是 Spring Boot 返回的是视图(xxx.html),而现在都是前后端分离的,后端只需要返给给前端数据即可,这个时候我们就需要使用 @ResponseBody 注解了。

前面详解了 @ResponseBody 注解

  • @ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成 application/json 返回给前端。
  • @ResponseBody 可以用来修饰方法或者是修饰类,修饰类表示类中的所有方法都会返回 html 或者 json,而不是视图。

请求转发和请求重定向

forward VS redirect

return 不但可以返回⼀个视图,还可以实现跳转,跳转的方式有两种:

  • forward 是请求转发;
  • redirect:请求重定向。

forward(请求转发)和 redirect(请求重定向)的区别,举例来说,例如,你告诉你妈妈,你想吃辣条,如果你妈妈,说好,我帮你去买,这就是 forward 请求转发;如果你妈妈让你自己去买,那么就是请求 redirect 重定向。

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

在这里插入图片描述

注意:我这里是返回的前端页面,就需要把 @RestController 换成 @Controller,相当于去掉了 @ResponseBody,让他返回一个前端静态页面

forward 和 redirect 具体区别如下:

  1. 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。
  2. 请求重定向地址发生变化,请求转发地址不发生变化。
  3. 请求重定向与直接访问新地址效果⼀直,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问。

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

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

相关文章

基于springboot+vue的桂林旅游景点导游平台(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

Pyglet综合应用|推箱子游戏之关卡图片载入内存

目录 读取图片 分割图片 综合应用 本篇为之前写的博客《怎样使用Pyglet库给推箱子游戏画关卡地图》的续篇,内容上有相关性,需要阅读的请见链接: https://hannyang.blog.csdn.net/article/details/136209138 「推箱子」是一款风靡全球的益…

RabbitMQ学习整理————基于RabbitMQ实现RPC

基于RabbitMQ实现RPC 前言什么是RPCRabbitMQ如何实现RPCRPC简单示例通过Spring AMQP实现RPC 前言 这边参考了RabbitMQ的官网,想整理一篇关于RabbitMQ实现RPC调用的博客,打算把两种实现RPC调用的都整理一下,一个是使用官方提供的一个Java cli…

开源博客项目Blog .NET Core源码学习(9:Autofac使用浅析)

开源博客项目Blog使用Autofac注册并管理组件和服务,Autofac是面向.net 的开源IOC容器,支持通过接口、实例、程序集等方式注册组件和服务,同时支持属性注入、方法注入等注入方式。本文学习并记录Blog项目中Autofac的使用方式。   整个Blog解…

NXP实战笔记(六):S32K3xx基于RTD-SDK在S32DS上配置PWM发波

目录 1、概述 2、SDK配置 2.1、Port配置 2.2、Emios_Mcl_Ip 2.3、Emios_Pwm 2.4、代码示例 1、概述 针对S32K3xx芯片,产生PWM的硬件支持单元仅有两个,分别是eMiosx与Flexio. 生成PWM的顺序,按照单片机所用资源进行初始化执行如下 初始化…

UTONMOS开启数智龙年,打造元宇宙游戏圈新名片

新年已过,全国各个城市早已客流涌动、热闹非凡。这种繁华景象不仅存在于现实世界,也被复刻到元宇宙的虚拟空间中。 据介绍,UTONMOS“源起山海-神念无界”元宇宙游戏是以原创IP玄幻神话故事“元宇宙史纪”为蓝本打造的元宇宙游戏空间&#xf…

【DataTable.js】02.DataTable参考

一、Option 1.1 Features 属性类型默认值描述autoWidthbooleantrue是否自动调节单元格宽度,若传入了columns.width,可禁用该选项orderingbooleantrue是否支持排序pagingbooleantrue是否支持分页scrollXbooleanfalse是否支持横向滚动条scrollYstring启用…

2024年必备原型设计工具盘点,助你成为设计大神

原型设计是 UI/UX 设计中至关重要的一步,就像用户体验中的其他环节一样,有无数的原型工具可以帮助你完成原型设计。 如果市场上有太多的原型设计工具让你不知所措,不知道选择哪一个,恭喜你,这个原型设计工具的集合是为…

云打印app下载,云打印app在哪下载?

随着互联网技术的发展,云打印技术已经逐渐成熟。而对于用户来说,很多有打印需求的用户都需要用到云打印,那么云打印App怎么下载,云打印app在哪下载呢?今天带大家来了解一下。 云打印app在哪下载? 很多有打…

银河麒麟桌面系统的文件保护箱的使用

在开始菜单搜索文件保护箱 输入密码进行认证,授权后方可使用 首次使用,选择新建 填写保护目录的名字以及设置目录保护密码 密钥文件保存到桌面 我这里保存到桌面,你可千万别,这个很重要,丢失的话,若忘记密…

动态规划-

关键词: 重叠子问题;每一个状态一定是由上一个状态推导出来(类似数列a^n f(a^n-1,a^n-2)) 步骤: 确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 题目&#…

【数据结构】顺序表实现的层层分析!!

关注小庄 顿顿解馋◍˃ ᗜ ˂◍ 引言:本篇博客我们来认识数据结构其中之一的顺序表,我们将认识到什么是顺序表以及顺序表的实现,请放心食用~ 文章目录 一.什么是顺序表🏠 线性表🏠 顺序表 二.顺序表的实现&#x1f3e0…

【教3妹学编程-算法题】匹配模式数组的子数组数目 I

3妹:2哥2哥,你有没有看到上海女老师出轨男学生的瓜啊。 2哥 : 看到 了,真的是太毁三观了! 3妹:是啊, 老师本是教书育人的职业,明确规定不能和学生谈恋爱啊,更何况是出轨。 2哥 : 是啊…

导出本地环境venv包whl文件。

把python环境 venv 对应包的文件导出成whl文件 将 Python 虚拟环境中包导出到文件,可以方便地在其他电脑上安装相同的环境,无需重复下载。 使用 pip freeze 和 pip download 使用 pip freeze 命令列出所有已安装的包和版本号保存到 requirements.txt …

Sora----打破虚实之间的最后一根枷锁----这扇门的背后是人类文明的晟阳还是最后的余晖

目录 一.Sora出道即巅峰 二.为何说Sora是该领域的巨头 三.Sora无敌的背后究竟有怎样先进的处理技术 1.Spacetime Latent Patches 潜变量时空碎片,建构视觉语言系统 2.扩散模型与Diffusion Transformer,组合成强大的信息提取器 3.DiT应用于潜变量时…

小区视频汇聚与智能监管方案:老破小升级改造与小区智慧化建设

一、需求背景 在当今数字化时代,智慧小区已成为城市建设的必然趋势。加快小区智能化改造,不断完善小区管理和服务,彻底改变粗放型管理方式已经成为当前小区智慧化趋势的重要任务。其中,智能视频监控系统在提高小区安全性和管理效…

T-Dongle-S3开发笔记——分区表

参考: ESP32之 ESP-IDF 教学(十三)—— 分区表_esp32分区表-CSDN博客 分区表 - ESP32 - — ESP-IDF 编程指南 latest 文档 (espressif.com) 分区表是 ESP32 划分内部 flash 闪存的清单,它将 flash 划分为多个不同功能的区域用于…

交通强国,数字引领|易知微数字孪生智慧港口,探索未来港口的无限可能

点击下载了解易知微数字孪生智慧港口解决方案👉https://easyv.cloud/solution/port/?tcsdn 2023年12月,为推动智慧港口和智慧航道建设发展,加快建设交通强国水运,交通运输部发布《关于加快智慧港口和智慧航道建设的意见》。到20…

哪种游泳耳机品牌更好?2024四款甄选高评分榜单好物!

在繁忙的都市生活中,游泳已经成为了许多人释放压力、保持健康的重要方式。而随着科技的进步,游泳耳机也逐渐走进了人们的视野,让音乐与游泳完美结合,为游泳爱好者带来了全新的运动体验。然而,在琳琅满目的游泳耳机市场…

vite为什么编译比webpack快

启动速度:Vite在启动时不需要打包,因为它支持ES模块加载,不需要编译和打包所有模块的依赖。这意味着Vite在启动时不需要像Webpack那样构建整个项目的文件,因此启动速度更快。 1 vite 采用 es 新规范 vite 中的 main.ts 中可以直…