Spring Web MVC介绍及详细教程

小小小小关同学 2024-07-10 12:03:02 阅读 67

目录

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项目实现连接的操作就与路由映射密切相关,实现路由映射可以使用注解。

用来实现注册接口的路由映射的常见注解有<code>@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注解的基本用法说明:

@RequestMapping注解可以修饰类,也可以修饰方法,当修饰类和方法时,访问的地址是类+方法。 @RequestMapping注解可以处理任何HTTP方法的请求,包括GET、POST、PUT、DELETE等。@RequestMapping注解可以使用method属性来进行限定处理请求的HTTP方法。

@RequestMapping 的URL 路径最前⾯加不加

/

(斜杠)都可以, Spring程序启动时, 会进⾏判断, 如果前⾯没有加

/

, Spring会拼接上⼀个

/

接下来访问:

http://127.0.0.1:8080/sayHi

, 就可以看到程序返回的数据了:

4.2 @PostMapping和@GetMapping

(1)@PostMapping基本使用

<code>@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

注解添加到对应的⽅法上即可

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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。