Spring Web MVC介绍及详细教程

news2024/11/24 15:45:39

目录

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应用。如果你有任何疑问或需要进一步的探讨,欢迎在评论区留言,我们一起交流学习。感谢你的阅读!

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

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

相关文章

Web3 游戏平台 Creo Engine 销毁代币总量的20%,以促进长远发展

Creo Engine 5月16日进行了第三次代币销毁,这次的销毁占代币总量的 20%。一共销毁了2亿 $CERO 代币,市场价值接近 2000 万美元。 Creo Engine 致力于连接世界、为玩家提供一站式游戏中心,并提升 Web3 游戏体验。 Creo Engine 发布于2022年&am…

springboot集成达梦数据库8,用springboot+mtbatisplus查询值为空

springboot集成达梦数据库8,用springbootmtbatisplus查询值为空 背景:springboot集成达梦数据库8,用springbootmtbatisplus查询值为空,但是在DB管理工具中是可以查询到数据的。 原因及解决方法:执行添加语句后&#xf…

iclone acculips Visemes (Adding Visemes to Dictionary)

(New for v7.9) 将视位添加到词典(v7.9 的新增功能) AccuLips has a dictionary behind the scenes to map and convert voice to text. Needless to say, some existing English lexicon can still be missing from the dictionary, and cause the cor…

java BioJava库安装和使用

BioJava是一个用Java编写的开源生物信息学库,旨在为生物学家和生物信息学家提供工具和算法来处理生物数据。它提供了一系列功能强大的工具,包括读取、写入和解析常见的生物信息学文件格式(如FASTA、GenBank等),进行序列…

视频码流分析工具

一、VQ Analyzer 在线使用说明: https://vicuesoft.com/vq-analyzer/userguide/ ref: Video Analyzer and Streaming Tester Software – VQ Analyzer HEVC 分析工具 - 懒人李冰 推荐一个开源且跨平台的免费码流分析软件YUView - 知乎

PMapper:助你在AWS中实现IAM权限快速安全评估

关于PMapper PMapper是一款功能强大的脚本工具,该工具本质上是一个基于Python开发的脚本/代码库,可以帮助广大研究人员识别一个AWS账号或AWS组织中存在安全风险的IAM配置,并对IAM权限执行快速评估。 PMapper可以将目标AWS帐户中的不同IAM用户…

【Android】Gradle插件全局配置/Gradle插件下载源配置

gradle插件概念 gradle发行包和gradle插件是两个东西,可以理解为maven版本与maven依赖项的关系。gradle插件由项目路径中的build.gradle文件进行管理,相当于pom.xmlsettings.xml,同时记录依赖项和依赖仓库。是一个依赖项,从指定仓…

云原生|为什么服务网格能够轻松重塑微服务?一文讲清楚!

目录 一、概述 二、 设计 三、服务网格 四、总结 一、概述 容器化技术与容器编排推动了微服务架构应用的演进,于是应用的扩展与微服务的数量日益增加,新的问题随之而来,监控服务的性能变得越来越困难,微服务与微服务之间相互通…

Big Demo Day第十三期活动即将启幕,Web3创新项目精彩纷呈,PEPE大奖等你抽取

5月28号在香港数码港 Big Demo Day第十三期 活动即将拉开帷幕,活动将汇集众多Web3领域的创新项目,为参会者带来一场科技与智慧交融的盛宴。在这里,你不仅能深入了解区块链、AI等前沿技术的最新应用,还能有机会赢取丰厚的PEPE大奖。…

智慧校园为高校带来哪些价值

在21世纪的教育图景中,"智慧"不再仅仅是一个科技名词,它已成为衡量教育现代化水平的重要标志。智慧校园,这一融合了物联网、大数据、云计算等先进技术的教育新形态,正逐步成为高校转型升级的关键驱动力。本文将从多个维…

osgearth 3.5 vs 2019编译

下载源码 git clone --recurse-submodules https://github.com/gwaldron/osgearth.git 修改配置文件 主要是修改bootstrap_vcpkg.bat,一处是vs的版本,第二处是-DCMAKE_BUILD_TYPERELEASE 构建 执行bootstrap_vcpkg.bat vs中生成安装 vs2019打开bu…

知了传课Flask学习(持续更新)

一、基础内容 1.Flask快速应用 pip install flask from flask import Flaskapp Flask(__name__)app.route(/) def index():return Hello worldif __name__ __main__:app.run() 2.debug、host、port配置 from flask import Flask,requestapp Flask(__name__)app.route(/) d…

免费,Python蓝桥杯等级考试真题--第11级(含答案解析和代码)

Python蓝桥杯等级考试真题–第11级 一、 选择题 答案: 解析:range取首不取尾,即产生了数1234,list()函数可以把产生的数1234转化为列表,故答案为A。 答案:B 解析:sort&a…

如何一键生成多个文本二维码?excel表格批量生码的方法

现在很多人会将文本信息做成二维码来展示,当有同类型内容生成大量二维码时,可以使用将文本导入excel表格的方式,将表格中的每条数据批量生成二维码,可以有效提升二维码制作的速度和效率。下面就让小编来将具体的操作步骤分享给大家…

计算机组成结构—中断和异常

一、基本概念和分类 计算机在执行程序的过程中,有时会遇到一些异常情况或者特殊请求;这时就需要计算机暂停正在运行的程序,转而先去处理这些异常或特殊请求,处理结束之后再返回程序的断点处继续执行。这种处理方式就被称为 “中断…

USB数据恢复软件:轻松找回U盘重要数据!

USB数据丢失的原因 USB数据丢失有一些常见原因,了解这些原因有利于恢复数据。 文件意外删除病毒攻击软件错误未安全弹出USB设备格式化USB设备 顺便一提,如果你通过快捷键“Ctrl D”删除了数据,那你可以从回收站中还原它们。如果你永久删除…

改进rust代码的35种具体方法-类型(十八)-不要惊慌

上一篇文章 它看起来非常复杂,这就是为什么它贴合的塑料盖上用大号友好字母印上“不要恐慌”的原因之一。——道格拉斯亚当斯 此项目的标题将更准确地描述为更喜欢返回Result而不是使用panic!(但不要惊慌更吸引人)。 Rust的panic机制主要是为…

轧神仙,沾福气!李良济中医药惠民生,为苏城市民送健康!

5月19-22日,苏州人迎来了自己的狂欢节——第六届江南文化艺术国际旅游节“轧神仙”系列活动,石路商圈人头涌动,喧闹非凡。 相传农历的四月十四日是“八仙”之一吕洞宾的诞辰,吕洞宾此日化为乞丐、小贩,混迹苏州阊门福济…

Gradle常见问题及总结

使用android studio开发项目,难免遇到gradle相关的错误,在此总结。 gradle插件与gradle home版本关系错误 参考更新 Gradle Gradle下载太慢 Index of /gradle/ (tencent.com) 是国内下载地址,手动下载对应版本即可 缓存不刷新 问题描述 maven发布…

电影推荐|基于SSM+vue的电影推荐系统的设计与实现(源码+数据库+文档)

电影推荐系统 目录 基于SSM+vue的电影推荐系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍&#…