
1. 什么是Spring Web MVC?


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



1.2 什么是Spring MVC?



不过Spring在实现MVC时,也结合自身项目的特点,做了⼀些改变,相对而言,下面这个图或许更加合适⼀些。


2. 学习Spring MVC

2.1 项目准备
2.2 建立连接
在 Spring MVC中使用**@RequestMapping** 来实现URL路由映射,也就是浏览器连接程序的作用,我们先来看看代码怎么写,创建⼀个 UserController类,实现用户通过浏览器和程序的交互,具体实现代码如下:

方法名和路径名称无需⼀致
接下来访问 http://127.0.0.1:8080/hello 就可以看到程序返回的数据了

2.2.1 @RequestMapping、@RestController注解介绍


2.2.2 @RequestMapping 使用
@RequestMapping既可修饰类 ,也可以修饰方法 ,当修饰类和方法 时,访问的地址是类路径+方法路径。



在类和方法 分开时的注解内容可以重复 ,但在标识方法内部 的注解内容(路径)不可重复, 请求无法 成功**(是指 v2/v3 重复,不是指里面的方法,里面的方法名不同 也仍无法成功)**

【注: 若请求方式不同 即GetMaping 和 PostMapping 的话 它们后面的注解内容**(路径)可以相同 在postman中分别请求可以成功】**

或者:如下

@RequestMapping 的URL路径也可以是多层路径 ,最终访问 时**,** 依然是类路径+方法路径。



2.2.3 @RequestMapping是GET还是POST请求?




如果有多层目录,访问链接从static目录开始写


从运行结果可以看出: @RequestMapping 既支持Get 请求,又支持Post请求,同理,也支持其他的请求方式。



若用下面的Postman 情况如下





2.3 Postman介绍

2.3.1 下载安装postman

https://www.postman.com/downloads/
https://www.postman.com/downloads/
2.3.2 创建请求

界面介绍

2.3.3 传参介绍





参数在下面


2.4 请求(前端→后端)


2.4.1 传递单个参数
接收单个参数,在Spring MVC 中直接用方法中的参数 就可以(前后端参数名相同 name、age),比如以下代码:




2.4.2 传递多个参数
如何接收多个参数呢? 和接收单个 参数**⼀样** ,直接使用方法的参数接收即可,使用多个形参。

当有多个参数时,前后端进行参数匹配时,是以参数的名称 进行匹配 的,因此参数的位置是不影响后端获取参数的结果。
2.4.3 传递对象
如果参数比较多时,方法声明就需要有很多 形参。并且后续每次新增⼀个参数,也需要修改 方法声明。 我们不妨把这些参数封装为⼀个对象。Spring MVC 也可以自动实现对象参数的赋值,比如 Person 对象:


2.4.4 后端参数重命名(后端参数映射)@RequestParam






2.4.5 传递数组
Spring MVC可以自动绑定数组参数的赋值

2.4.6 传递集合 @RequestParam


2.4.7 传递JSON数据(重点 常用)@RequestBody


java
{
"squadName": "Super hero squad",
"homeTown": "Metro City",
"formed": 2016,
"secretBase": "Super tower",
"active": true,
"members": [{
"name": "Molecule Man",
"age": 29,
"secretIdentity": "Dan Jukes",
"powers": ["Radiation resistance", "Turning tiny", "Radiation
blast"]
}, {
"name": "Madame Uppercut",
"age": 39,
"secretIdentity": "Jane Wilson",
"powers": ["Million tonne punch", "Damage resistance", "Superhuman
reflexes"]
}, {
"name": "Eternal Flame",
"age": 1000000,
"secretIdentity": "Unknown",
"powers": ["Immortality", "Heat Immunity", "Inferno",
"Teleportation", "Interdimensional travel"]
}]
}
也可以压缩表示和上面描述的数据⼀样,只不过上面的进行了格式化,更易读。
java
{"squadName":"Super hero squad","homeTown":"Metro
City","formed":2016,"secretBase":"Super tower","active":true,"members":
[{"name":"Molecule Man","age":29,"secretIdentity":"Dan Jukes","powers":
["Radiation resistance","Turning tiny","Radiation blast"]},{"name":"Madame
Uppercut","age":39,"secretIdentity":"Jane Wilson","powers":["Million tonne
punch","Damage resistance","Superhuman reflexes"]},{"name":"Eternal
Flame","age":1000000,"secretIdentity":"Unknown","powers":["Immortality","Heat
Immunity","Inferno","Teleportation","Interdimensional travel"]}]}




java
package com.Dyichen.spring;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JSONTests {
private static ObjectMapper objectMapper = new ObjectMapper();
public static void main(String[] args) throws JsonProcessingException {
//创建对象
Person person = new Person();
person.setName("zhang san");
person.setAge(18);
person.setPassword("1212121");
//对象转为JSON字符串 writeValueAsString方法
String s = objectMapper.writeValueAsString(person);
System.out.println(s);
//JSON字符串转对象 readValue方法
String json = "{\"name\":\"zhang san\",\"password\":\"1212121\",\"age\":18}";
Person person1 = objectMapper.readValue(json,Person.class);
System.out.println(person1);
}
}




使用Postman 来发送json请求参数:

可以看到,后端正确接收了,通过Fiddler观察⼀下请求参数:


2.4.8 获取URL中参数@PathVariable


使用Postman发送请求


2.4.9 上传文件 @RequestPart



也可以重命名
2.4.10 获取Cookie/Session




















java
package com.Dyichen.spring;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/request2")
@RestController
public class RequestController2 {
//读取Cookie
@RequestMapping("/getCookie")
public String getCookie(HttpServletRequest request){
// 获取所有 cookie 信息
Cookie[] cookies = request.getCookies();
//打印Cookie信息
if(cookies != null){
for(Cookie cookie: cookies){
System.out.println(cookie.getName() + ":" + cookie.getValue());
}
}
return "获取cookie成功";
}
@RequestMapping("/getCookie2")
public String getCookie2(@CookieValue("class") String className){
return "获取cookie成功,className:" + className;
}
}





2.4.11 获取Header


2.5 响应
在我们前面的代码例子中,都已经设置了响应数据 ,Http响应结果可以是数据 ,也可以是静态页面 ,也可以针对响应设置状态码 ,Header信息等。
2.5.1 返回静态页面 @Controller
创建前端页面index.html(注意路径)









2.5.2 返回数据@ResponseBody



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



2.5.4 返回JSON @ResponseBody
Spring MVC 也可以返回JSON,后端方法返回结果为对象。


2.5.5 设置状态码
状态码不影响页面的展示



2.5.6 设置Header(了解)

java
Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}





3. 综合性练习
结合上述内容,我们可以做⼀些小案例,来更好的掌握主要知识点 (1)理解前后端交互过程 (2)接口传参,数据返回,以及页面展示
3.1 加法计算器
**需求:**输入两个整数,点击"点击相加"按钮,显示计算结果

3.1.1 准备工作
创建SpringBoot项目:引入SpringWeb依赖,把前端页面放在项目中。
3.1.2 约定前后端交互接口




3.1.3 服务器代码
3.1.4 调整前端页面代码
添加访问url和请求方式

3.1.5 运行测试
启动服务,运行并测试








