Spring Web MVC介绍及详细教程

目录

1.什么是Spring Web MVC?

1.1 MVC定义

1.2 Spring MVC与MVC关系

2.为什么要学习Spring MVC

3.项目创建

4.Spring MVC连接

4.1 @RequestMapping

4.2 @PostMapping和@GetMapping

5.Spring MVC参数获取

5.1 获取单个参数

5.2 获取多个参数

5.3 获取普通对象

5.4 接收JSON对象

 5.5 获取URL中参数

5.6 获取文件

 5.7 获取Cookie/Session

5.8 获取Header

6.返回数据(响应)

6.1 返回静态页面

6.2 返回数据

6.3 返回HTML代码片段

6.4 返回JSON


1.什么是Spring Web MVC?

Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, "Spring Web MVC",comes from the name of its source module (spring-webmvc)

 引至:Spring Web MVC :: Spring Framework

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

那么什么是Servet呢?为什么不直接使用Servet?

Servlet 是 Java 语言编写的服务器端程序,用于处理客户端发送的请求并生成响应。Servlet 运行在支持 Java Servlet 规范的 Web 服务器中,如 Apache Tomcat、Jetty 等。Servlet 提供了一种在 Web 服务器上动态生成 Web 内容的方式,可以处理各种类型的请求,如 HTTP 请求。

尽管 Servlet 可以实现 Web 应用程序的各种功能,但它们通常是在较低级别上操作 HTTP 请求和响应的。使用 Servlet 编写应用程序需要处理很多底层细节,例如解析请求参数、处理会话管理、管理状态等。这些工作可以在开发 Web 应用程序时变得繁琐和重复

也就是说Servet开发Web还是太麻烦了,现在这个追求效率的时代,再去使用Servet已经是out了。

用一句话总结Spring Web MCV:Spring Web MVC 是⼀个 Web 框架.,下面简称为Spring MVC。然⽽要真正的理解什么是 Spring MVC?我们⾸先要搞清楚什么是 MVC


1.1 MVC定义

MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分 。
View(视图) 指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源.
Model(模型) 是应⽤程序的主体部分,⽤来处理程序中数据逻辑的部分.
Controller(控制器)可以理解为⼀个分发器,⽤来决定对于视图发来的请求,需要⽤哪⼀个模型来处理,以及处理完后需要跳回到哪⼀个视图。即, ⽤来连接视图和模型

1.2 Spring MVC与MVC关系

MVC 是⼀种架构设计模式, 也⼀种思想(这种思想很早就有了,在Spring MVC之前可以通过其他的方式来实现), 而 Spring MVC 是对 MVC 思想的具体实现. 除此之外,SpringMVC还是⼀个Web框架. 总结来说,Spring MVC 是⼀个实现了 MVC 模式的 Web 框架.

所以, Spring MVC主要关注有两个点: 

1.MVC

2.Web架构。


2.为什么要学习Spring MVC

现在绝⼤部分的 Java 项⽬都是基于 Spring(或 Spring Boot)的,而 Spring 的核心就是 Spring
MVC。也就是说 Spring MVC 是 Spring 框架的核⼼模块, Spring Boot 是 Spring 的脚⼿架,因此我们可以推断出,现在市⾯上绝⼤部分的 Java 项⽬约等于 Spring MVC 项目,这是我们要学 Spring MVC 的原因。
在创建 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.

3.项目创建

Spring MVC 项⽬创建和 Spring Boot 创建项⽬相同,在创建的时候选择 Spring Web 就相当于创建了Spring MVC 的项⽬. 勾选的 Spring Web 框架其实就是 Spring MVC 框架,如上一节提到的图片所示。
创建方式1:Spring MVC 使⽤ Spring Boot 的⽅式创建
创建方式2:Spring MVC更早期的创建⽅式:通过maven添加所需要的各种依赖,这种方式中的过程较复杂,故在2018年以后基本都是使用Spring Boot来进行创建Spring MVC项目。

 通过Spring Boot创建Spring MVC项目:


4.Spring MVC连接

前面提到了学习Spring MVC的第一个点:

1. 建⽴连接:将⽤⼾(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调⽤到我们的Spring 程序。
这个过程大概也就是路由映射的过程。什么是路由映射:
路由映射是将用户发起的请求(通常是 URL 请求)与服务器端程序中的特定处理逻辑进行关联的过程。在 Web 开发中,当用户在浏览器地址栏输入一个 URL 或点击页面中的链接时,浏览器会向服务器发送一个请求。路由映射的作用是将这个请求映射到后端服务器中的某个处理器(例如控制器方法)上,以执行相应的业务逻辑。

Spring MVC项目实现连接的操作就与路由映射密切相关,实现路由映射可以使用注解。

用来实现注册接口的路由映射的常见注解有@RequestMapping@PostMapping@GetMapping

4.1 @RequestMapping

@RequestMapping 是 Spring Web 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的路由映射的。
使用方法:
创建⼀个 UserController 类,实现⽤⼾通过浏览器和程序的交互,具体实现代码如下:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@RestController
public class UserController {
     // 路由器规则注册
     @RequestMapping("/sayHi")
     public String sayHi(){
         return "hello,Spring MVC";
     }
}

@RequestMapping注解的基本用法说明:

  1. @RequestMapping注解可以修饰类,也可以修饰方法,当修饰类和方法时,访问的地址是类+方法。
  2.  @RequestMapping注解可以处理任何HTTP方法的请求,包括GET、POST、PUT、DELETE等。
  3. @RequestMapping注解可以使用method属性来进行限定处理请求的HTTP方法。
  4. @RequestMapping 的URL 路径最前⾯加不加 / (斜杠)都可以, Spring程序启动时, 会进⾏判断, 如果前⾯没有加 / , Spring会拼接上⼀个 /
接下来访问: http://127.0.0.1:8080/sayHi , 就可以看到程序返回的数据了:

4.2 @PostMapping和@GetMapping

(1)@PostMapping基本使用

@RestController
public class UserController {
     // 路由器规则注册
     @PostMapping("/sayHi")
     public String sayHi(){
         return "hello,Spring MVC";
     }
}

@PostMapping注解的基本用法说明:

  • @PostMapping注解通常用于修饰控制器类中的方法,而不是类本身。
  • @PostMapping注解只可以处理HTTP POST请求映射到处理方法上。

(2)@GetMapping基本使用

@RestController
public class UserController {
     // 路由器规则注册
     @GetMapping("/sayHi")
     public String sayHi(){
         return "hello,Spring MVC";
     }
}

@GetMapping注解的基本用法说明:

  • @GetMapping注解通常用于修饰控制器类中的方法,而不是类本身。
  • @GetMapping注解只可以处理HTTP GET请求映射到处理方法上

(3)get请求在Spring MVC中的3种写法

// 写法1
@RequestMapping("/index")
// 写法2
@RequestMapping(value = "/index",method = RequestMethod.GET)
// 写法3
@GetMapping("/index")

(4)post的2种写法

// 写法1
@RequestMapping(value = "/index",method = RequestMethod.POST)
// 写法2
@PostMapping("/index")

5.Spring MVC参数获取

5.1 获取单个参数

(1)代码

(2)Postman发送请求验证

注意:

  • 代码中声明的参数名与请求地址栏中的参数名要完全一致

  •  否则,必须要在后端对变量进行重命名

注意: 此时我们的前端就必须传递被重命名后的变量了,也就是前端的变量名必须是userName,否则就会报错。

我们查看@RequestParam 注解的实现细节就可以发现端倪,注解实现如下:

5.2 获取多个参数

(1)代码:

(2)Postman验证

获取多个参数注意说明:

1)进行参数匹配时,后端代码的参数名称要与地址栏中的参数名称要保证完全一致。

2)前后端进行参数匹配时,是以参数的名称进行匹配的,因此地址栏中的参数位置是不影响后端获取参数的结果。

5.3 获取普通对象

实体类:

(1)代码:

(2)postman验证

获取普通对象注意说明:

1)Spring MVC 会根据地址栏中输入的参数列表自动实现参数对象的赋值操作。

5.4 接收JSON对象

@RequestBody 接收JSON对象
(1)代码:
(2)postman:

 5.5 获取URL中参数

使用@PathVariable注解

(1)代码:
(2)Poatman:

 注意:

如果⽅法参数名称和需要绑定的URL中的变量名称不⼀致时, 需要@PathVariable的属性value赋值,比如:

5.6 获取文件

使用@RequestPart

(1)代码:

(2)postman发送请求:

 (3)观察硬盘F:/Download下是否成功写入后端接收的前端传来的文件:

 5.7 获取Cookie/Session

(1)什么是Cookie

HTTP 协议⾃⾝是属于 "⽆状态" 协议. 也就是说:默认情况下 HTTP 协议的客⼾端和服务器之间的这次通信, 和下次通信之间没有直接的联系.

但是实际开发中, 我们很多时候是需要知道请求之间的关联关系的: 例如登陆⽹站成功后, 第⼆次访问的时候服务器就能知道该请求是否是已经登陆过了.

上述图中的 "令牌" 通常就存储在 Cookie 字段中。

此时在服务器这边就需要记录"令牌"信息, 以及令牌对应的⽤⼾信息, 这个就是 Session 机制所做的⼯作
(2)理解Session
先来理解一下什么是会话:
在计算机领域, 会话是⼀个客⼾与服务器之间的不中断的请求响应. 对客⼾的每个请求,服务器能够识别出请求来⾃于同⼀个客⼾. 当⼀个未知的客⼾向Web应⽤程序发送第⼀个请求时就开始了⼀个会话. 当客⼾明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了。
服务器同⼀时刻收到的请求是很多的. 服务器需要清楚的区分每个请求是从属于哪个⽤⼾, 也就是属于哪个会话, 就需要在服务器这边记录每个会话以及与⽤⼾的信息的对应关系. Session是服务器为了保存⽤⼾信息⽽创建的⼀个特殊的对象.
Session的本质就是⼀个 "哈希表", 存储了⼀些键值对结构. Key 就是SessionID, Value 就是⽤⼾信息(⽤⼾信息可以根据需求灵活设计).
更加详细的区别和联系不再赘述了,这里主要还是讲解SpringMVC,感兴趣的可以通过我的另一篇博文来了解Cookie和Session。
(3)获取Cookie
使用@CookieValue

(4)Session的存储与获取

Session是服务器端的机制, 我们需要先存储, 才能再获取
Session 也是基于HttpServletRequest 来存储和获取的
传统获取Session有两种方式:
  • HttpSession getSession(boolean create);
  • HttpSession getSession();
HttpSession getSession(boolean create) : 参数如果为 true, 则当不存在会话时新建会话; 参数如果为 false, 则当不存在会话时返回 null 。
HttpSession getSession(): 和getSession(true) 含义⼀样, 默认值为true.
获取刚才存入的Session:
当然,课也可以通过@SessionAttribute注解的方式来实现获取Session

5.8 获取Header

传统方式获取Header

获取Header也是从 HttpServletRequest 中获取

 也可以通过@RequestHeader注解来实现:


6.返回数据(响应)

获取到前端传来的参数后,我们可以在后端进行业务编排和处理。当处理完业务后,需要再将数据响应给前端,响应结果可以是数据, 也可以是静态⻚⾯,也可 以针对响应设置状态码, Header信息等。

6.1 返回静态页面

创建前端⻚⾯ index.html(注意路径)

后端代码:

执行结果:

结果却发现, ⻚⾯未正确返回, http响应把 "/index.html" 当做了http响应正⽂的数据
那Spring MVC如何才能识别出来 index.html 是⼀个静态⻚⾯, 并进⾏返回呢?
这是因为使用了@ResponseBody注解,@ResponseBody 表⽰返回数据.把该注解去掉:

@RestController = @Controller + @ResponseBody 

6.2 返回数据

@ResponseBody 表⽰返回数据
@ResponseBody 既是类注解, ⼜是⽅法注解
如果作⽤在类上, 表⽰该类的所有⽅法, 返回的都是数据, 如果作⽤在⽅法上, 表⽰该⽅法返回的是数据. 也就是说: 在类上添加 @ResponseBody 就相当于在所有的⽅法上添加了 @ResponseBody 注解.
同样, 如果类上有 @RestController 注解时:表⽰所有的⽅法上添加了 @ResponseBody 解, 也就是当前类下所有的⽅法返回值做为响应数据。
如果⼀个类的⽅法⾥, 既有返回数据的, ⼜有返回⻚⾯的, 就把 @ResponseBody 注解添加到对应的⽅法上即可
@Controller
public class IndexController {
    @RequestMapping("/index")
    public Object index(){
    return "/index.html";
}
    @RequestMapping("/returnData")
    @ResponseBody
    public String returnData(){
        return "该⽅法返回数据";
    }
}

6.3 返回HTML代码片段

后端返回数据时, 如果数据中有HTML代码, 也会被浏览器解析

6.4 返回JSON


结 语

这就是本期总结的全部关于Spring MVC的知识点,希望这篇博客能够帮助大家更好地掌握SpringMVC,并在实际项目中应用这些知识,构建出高效、稳定的Web应用。如果你有任何疑问或需要进一步的探讨,欢迎在评论区留言,我们一起交流学习。感谢你的阅读!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

echart 折线图tooltip

运行结果 代码 import { truncate, merge } from lodash; import { getBasePieOptions, getTooltipFormatter } from "*/money/utils";const colorArray [#1F8BFF, #EDBE75, #26E3F0, #AF8FFF, #61DDAA, #FD996A, #8367E0, #1AAF87]export function getLineOptions…

Prompt Engineering Guide

本文转载自:Prompt Engineering Guide https://www.promptingguide.ai/zh/introduction/basics 文章目录 提示工程简介1、基本概念1)基础提示词2)提示词格式 2、提示词要素3、设计提示的通用技巧从简单开始指令具体性避免不精确做还是不做&am…

【Spring security】【pig】Note03-pig token令牌解析器过程

🌸🌸 pig token令牌解析器过程 🌸🌸 pig后端源码 一、解析请求中的令牌值。 二、验证令牌 内省并验证给定的令牌,返回其属性。返回映射表示令牌有效。 /*** author lengleng* date 2019/2/1 扩展用户信息*/ publi…

互联网医院开发:引领智慧医疗新时代

随着科技的迅猛发展和互联网的普及,传统医疗模式正在迎来一场深刻的变革。互联网医院的崛起,打破了时间和空间的限制,为患者和医疗机构带来了更加便捷、高效、安全的医疗服务体验。本文将从技术角度深入探讨互联网医院的开发,包括…

货源困扰?没有货源也能做视频号电商,让你告别没有货源的困扰

大家好,我是电商花花。 目前视频号小店作为2024最有潜力的,最值得我们做的一个电话项目。 视频号小店作为一个新的直播电商平台,目前该项目还处于红利期间,流量大,商家少,现在入行的商家都可以享受到项目…

二级建造师考试工作年限怎么计算?中霖教育怎么样?

二级建造师考试对于工作年限有明确的要求,在计算二级建造师考试所需的工作年限时,考生需依据其所取得的教育类型来分别处理。 对于非全日制学历背景的考生,相关专业工作年限包括从获取规定学历之前直至报考当年年末所从事的该项工作的整个时…

网络安全技术与应用:远程控制与数据库安全

实验准备 软件:VMware Workstation Pro 虚拟机:Red Hat Enterprise Linux 7 服务器,Red Hat Enterprise Linux 7 客户端 网络模式:NAT模式 1、配置服务器及客户端网络 服务器IP 客户端IP 测试相互通信 在客户机上设置镜像&#…

Paddle 傅里叶变换基础及领域应用

Paddle 傅里叶变换基础及领域应用 1. 傅里叶变换基础 1.1 傅里叶变换简介 傅里叶变换是一种重要的信号处理技术,它可以将一个信号从时域转换到频域。在频域中,信号的频率特性更加明显,有利于分析和处理。傅里叶变换的基本思想是将一个信号…

网络原理3

运营商路由器,也可以把它当做一个NAT设备它就会对中间经过的数据包,进行网络地址转换当内网设备经过运营商路由器访问外网的时候就会把IP数据包中的源ip,替换成它自己的ip. 我的电脑要发送一个数据给cctalk服务器此时,我的电脑上就…

虎牙连续10个季度营收下滑,林松涛“三年计划“的游戏服务,没能扛起增收大旗

直播内卷的风,从大平台吹到了游戏直播的垂直赛道。 “游戏直播第一股”虎牙(NYSE:HUYA),已经连续10个季度营收下滑。 据虎牙最近发布的2024年一季报,当期营收15.04亿,同比减少23.1%。这已经是虎牙连续第1…

uniappx 安卓保活(多种技术;UTS版) Ba-KeepAlive-U

简介(下载地址) Ba-KeepAlive-U 是一款android原生保活插件,UTS版本(同时支持uniapp和uniappx),支持市面上大部分机型,Android4.4到Android14(**注意:**不保证支持所有机…

Android HAL到Framework

一、为什么需要Framwork? Framework实际上是⼀个应⽤程序的框架,提供了很多服务: 1、丰富⽽⼜可扩展的视图(Views), 可以⽤来构建应⽤程序,它包括列表(lists),⽹格&am…

【前端】深入浅出响应式布局

深入浅出前端响应式布局 在当今的网页设计与前端开发中,创建能够适应多种设备和屏幕尺寸的网页已成为必备技能。响应式布局(Responsive Layout)旨在通过灵活的设计和技术手段,让网页内容能够根据用户的设备环境自动调整&#xff…

Web 3D 框架简介

前言 3D游戏引擎的历史可以追溯到20世纪80年代末和90年代初。当时,计算机技术迅速发展,人们开始对图形和游戏感兴趣。以下是3D游戏引擎的历史故事: 早期引擎的诞生(1980-1990年代) 在这个时期,一些早期的3D游戏引擎开始出现。其中一个著名的例子是id Software开发的Do…

基于微信小程序的校园捐赠系统的设计与实现

校园捐赠系统是一种便捷的平台,为校园内的各种慈善活动提供支持和便利。通过该系统,学生、教职员工和校友可以方便地进行捐赠,并了解到相关的项目信息和捐助情况。本文将介绍一个基于Java后端和MySQL数据库的校园捐赠系统的设计与实现。 技术…

阿里云ubuntu 24 deb安装mysql5.7问题解决

阿里云最近有了ubuntu24,手欠直接选了24系统来试水,安装mysql这里遇到麻烦了 其它问题参考ubuntu22的即可,以下是3个新问题: 阿里云ubuntu 24 deb安装mysql5.7遇到的3个问题: 1)libssl1.1 (> …

TG5032CKN是一种高稳定性晶体振荡器

TG5032CKN的输出频率范围为10 MHz至24 MHz,能够在-40C至105C的温度范围内工作,其频率/温度特性为0.110^-6 Max。这表明该设备具有很好的温度稳定性,适合在极端温度条件下使用。TG5032CKN的尺寸为5.03.21.65 mm,可以选择10针或4针封…

内网安全之搭建ADCS证书服务

在域控上安装ADCS服务时,默认会自动配置完LDAPS,如果不是在域控上安装ADCS服务,需要手动配置LDAPS 安装证书服务ADCS 打开服务器管理器——>添加角色和功能 选择“基于角色或基于功能的安装”选项,然后点击下一步 选择“从…

rabbitMQ本地启动快捷方式

%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c ""%~s0"" ::","","runas",1)(window.close)&&exit COLOR A TITLE 运行RabbitMQ%comspec% /k "C:\Prog…

【C++】位图/布隆过滤器+海量数据处理

目录 一、位图 1.1 位图的概念 1.2 位图的实现 1.3 位图的应用(面试题) 二、布隆过滤器 2.1 布隆过滤器的引入 2.2 布隆过滤器概念 2.3 布隆过滤器的插入和查找 2.4 布隆过滤器的实现 2.5 布隆过滤器的优点和缺陷 2.6 布隆过滤器的应用&#…