什么是Spring Web MVC
Spring Web MVC是基于Servlet API构建的原始Web框架,从⼀开始就包含在Spring框架中.它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC".
MVC定义
MVC是Model View Controller的缩写,它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型,视图和控制器三个基本部分.MVC模型草图:

View(视图):指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源.
Model(模型):是应⽤程序的主体部分,⽤来处理程序中数据逻辑的部分.
Controller(控制器):可以理解为⼀个分发器,⽤来决定对于视图发来的请求,需要⽤哪⼀个模型来处理,以及处理完后需要跳回到哪⼀个视图.即⽤来连接视图和模型.
什么是Spring MVC
MVC是一种设计框架,Spring MVC就是对MVC思想的一种具体实现,同时Spring MVC还是一个Web框架.总的来说,Spring MVC是一个实现了MVC的web框架.
在创建Spring Boot项⽬时,我们勾选的Spring Web框架其实就是Spring MVC框架:
Spring Boot与Spring MVC的关系:Spring Boot是快速开发应用框架,它集成了很多功能,其中包含Spring MVC.在使用Spring Boot开发web时,底层就是在使用Spring MVC.
学习Spring MVC
学习Spring MVC重点是学习如何通过浏览器与用户程序进行交互.主要分为以下三个方面:
建立链接:将用户(浏览器)与Java程序链接起来,也就是访问一个地址能够调用到我们的Spring程序.
请求:用户请求的时候会带⼀些参数,在程序中要想办法获取到参数,所以请求这块主要是获取参数的功能.
响应:执行了业务逻辑之后,要把程序执⾏的结果返回给用户,就是响应.
项目准备
SpringBoot集成了Spring MVC的功能,在创建项目时,创建SpringBoot项目并勾选SpringMVC即可.

建立链接
在Spring MVC中使⽤ @RequestMapping来实现URL路由映射,也就是浏览器连接程序的作⽤.
@RestController
public class Hello {
// 此处/hello用于访问
@RequestMapping("/hello")
public String hello(){
return "Hello Spring";
}
}
接下来访问http://127.0.0.1:8080/hello,就可以看到程序返回的数据了.

@RequestMapping注解
@RequestMapping是SpringMVC中最常被用到的注解之一,他是用来注册接口的路由映射的.表示服务收到请求时,路径为/hello的请求就会调用hello()方法的代码
路由映射:当⽤⼾访问⼀个URL时,将用户的请求对应到程序中某个类的某个⽅法的过程就叫路由映射.
@RequestMapping的使用
@RequestMapping既可以修饰方法,也可以修饰类,在修饰类时,用户想要访问就需要访问类路径+方法路径.
@RequestMapping("/request")
@RestController
public class Request {
@RequestMapping("/r1")
public String r1(){
return "hello";
}
}

@RequestMapping的URL路径最前⾯加不加 /(斜杠)都可以,Spring程序启动时,会进⾏判断,如果前⾯没有加 / ,Spring会拼接上⼀个 /.
@RequestMapping("request")
@RestController
public class Request {
@RequestMapping("r1")
public String r1(){
return "hello";
}
}

@RequestMapping 的URL路径也可以是多层路径,最终访问时,依然是类路径+⽅法路径.
@RequestMapping("/request/aa")
@RestController
public class Request {
@RequestMapping("/hello/r1")
public String r1(){
return "hello";
}
}

@RequestMapping是GET请求还是POST请求?
对之前的代码进行抓包,发现支持GET请求.

构造POST请求:我们通过form表单来构造请求,创建test.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/request/r1" method="post">
<input type="submit" value="提交">
</form>
</body>
</html>
前端代码放在static⽬录下,访问⽅式为:http://127.0.0.1:8080/test.html.执行结果正常,通过抓包发现请求为POST请求.

请求
访问不同的路径,就是发送不同的请求.在发送请求时,可能会带⼀些参数,所以学习Spring的请求,主要是学习如何传递参数到后端以及后端如何接收.
在传递参数时,Spring会自动将请求中的参数列表与方法的参数列表进行匹配,当参数名相同时就会将值赋值给方法,并且参数初始类型为String,当没有传递该参数时参数值为null.
传递单个参数
@RequestMapping("/request")
@RestController
public class Request {
@RequestMapping("/r1")
public String r1(String name){
return "接收到参数 name:"+name;
}
}

传递非法参数,如给Integer传递String类型参数,会报错(类型转换错误):
@RequestMapping("/r2")
public String r2(Integer age){
return "接收到参数 age:"+age;
}

2025-10-12T17:57:14.077+08:00 WARN 65084 --- [nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; For input string: "zhangsan"]
报错日志:将String类型转换为Integer类型失败.
使用基本数据类型时,必须要传递参数:
@RequestMapping("/r2")
public String r2(Integer age){
return "接收到参数 age:"+age;
}
@RequestMapping("/r3")
public String r3(int age){
return "接收到参数 age:"+age;
}


服务器报错节选,int接收了为null的参数.
java.lang.IllegalStateException: Optional int parameter 'age' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type
传递多个参数
传递多个参数与传递单个参数的区别仅在参数的个数上.当有多个参数时,前后端进⾏参数匹配时,是以参数的名称进⾏匹配的,因此参数的位置是不影响后端获取参数的结果.
@RequestMapping("/r4")
public String r4(String name,Integer age){
return "接收到参数 name:"+name+",age:"+age;
}

传递对象
如果参数⽐较多时,⽅法声明就需要有很多形参.并且后续每次新增⼀个参数,也需要修改⽅法声明.可以把这些参数封装为⼀个对象.SpringMVC也能实现对对象参数的自动赋值.
public class Student {
private int id;
private String name;
private Integer age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
@RequestMapping("/r5")
public String r5(Student student){
return student.toString();
}

可以看到,后端程序正确拿到了Student对象⾥各个属性的值.
后端参数重命名
有时,前端代码中的变量名与后端代码中的变量名无法一一对应,此时就需要对参数进行重命名.使用@RequestParam来对参数进行重命名:
@RequestMapping("/r6")
//将前端代码中的name重命名为userName
public String r6(@RequestParam("name") String userName){
return "接收到参数 userName:"+userName;
}

@RequestParam还有一个能力:让参数必须被传递.

Required request parameter 'name' for method parameter type String is not present
想要让参数变为非必传参数,可以在使用@RequestParam时,在括号内部添加required=false(该参数默认为true),来来避免不传递时报错:
@RequestMapping("/r6")
public String r6(@RequestParam(value = "name",required = false) String userName){
return "接收到参数 userName:"+userName;
}

2094

被折叠的 条评论
为什么被折叠?



