目录
[Spring MVC 的组件和工作流程](#Spring MVC 的组件和工作流程)
[步骤 1:新建 Spring Boot 项目](#步骤 1:新建 Spring Boot 项目)
[(1)Controller 层(核心)](#(1)Controller 层(核心))
[Spring MVC 请求映射注解总结](#Spring MVC 请求映射注解总结)
[1. @RequestMapping基础用法:](#1. @RequestMapping基础用法:)
[2. 专用请求映射注解](#2. 专用请求映射注解)
[3. 请求参数接收方式](#3. 请求参数接收方式)
[方式2:参数重命名 @RequestParam](#方式2:参数重命名 @RequestParam)
方式3:绑定对象参数(推荐)当参数较多时,封装为对象:java
什么是MVC模型
MVC是一种设计创建Web应用程序的模式。
这三个单词分别代表Web应用程序的三个部分:
Model(模型):指数据模型。用于存储数据以及处理用户请求的业务逻辑。
在Web应用中,JavaBean对象,业务模型等都属于Model。
View(视图):用于展示模型中的数据的,一般为jsp或html文件。
Controller(控制器):是应用程序中处理用户交互的部分。接受视图提出的请求,将数据交给模型处理,并将处理后的结果交给视图显示。
三者关系,如图所示

什么是SpringMVC
SpringMVC 是 Spring 框架的核心模块之一,是基于 MVC(Model-View-Controller)设计模式的轻量级 Web 框架 ,用于简化 Java Web 开发。
Spring MVC 的组件和工作流程
想象一个餐厅的点餐过程:
各组件对应角色:
DispatcherServlet:餐厅 前台接待员
HandlerMapping:点餐目录/菜单
HandlerAdapter:厨师长(负责分配任务给具体厨师)
Controller:具体厨师
ViewResolver:服务员(负责摆盘上菜)
完整工作流程:
- 客户点餐(发送请求)
text
顾客 → 前台接待员:我要一份牛排
对应:浏览器发送请求到 DispatcherServlet
- 查找菜单(HandlerMapping)
text
接待员查看菜单,发现:
-
牛排 → 西餐厨师处理
-
寿司 → 日料厨师处理
-
披萨 → 意餐厨师处理
对应:DispatcherServlet 问 HandlerMapping:"这个URL请求该由哪个Controller处理?"
- 分配任务(HandlerAdapter)
text
接待员告诉厨师长:有位客人点了牛排
厨师长知道:牛排需要找西餐厨师张三来做
对应:DispatcherServlet 通过 HandlerAdapter 找到合适的 Controller 方法
- 烹饪制作(Controller)
text
西餐厨师张三开始制作牛排
做好后放在盘子里
对应:Controller 执行业务逻辑,返回 ModelAndView(数据+视图名)
- 摆盘上菜(ViewResolver)
text
服务员拿到做好的牛排:
-
如果是普通客人 → 用白色盘子
-
如果是VIP客人 → 用金色盘子
-
如果是外卖 → 用打包盒
对应:ViewResolver 根据视图名找到具体的 JSP/Thymeleaf 等视图文件
- 上菜完成(渲染视图)
text
服务员把摆好盘的牛排端给顾客
对应:将数据填充到视图模板中,生成HTML返回给浏览器

步骤 1:新建 Spring Boot 项目


步骤2:编写核心代码
(1)Controller 层(核心)
在com.example.springmvcdemo下新建包controller → 新建HelloController.java:
Haskell
package org.xiuxiu.springdemo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller // 标识为SpringMVC控制器
public class HelloController {
// 方式1:返回视图(结合Thymeleaf)
@GetMapping("/hello")
public String hello(Model model) {
// Model传递数据到视图
model.addAttribute("msg", "Hello SpringMVC!");
// 返回视图名(对应templates/hello.html)
return "hello";
}
// 方式2:返回m1(RESTful接口,无视图)
@GetMapping("/m1")
@ResponseBody // 直接返回数据,不解析视图
public String getm1() {
return "{\"name\":\"张三\",\"age\":20}";
}
}
}
SpringMVC支持参数注入的方式用于获取请求数据,即将请求参数直接封装到方法的参数当中。用法如下:
- 编写控制器方法
java
// 封装为简单数据类型类型参数
@RequestMapping("/r1")
public String r1(String username,String password){
return "用户名"+username+"密码"+password;
}
访问该方法时,请求参数名和方法参数名相同,即可完成自动封装。
http://localhosthttp://:8080/user/r1?username=admin&password=12345

**Integer和int**这两个代码之间的差异是什么?
java
public class testCotroller {
@RequestMapping("/r5")
public String r5(Integer number){
return "接收参数"+number;
}
@RequestMapping("/r6")
public String r6(int number){
return "接收参数"+number;
}
}
1. Integer number(r5 方法)
使用包装类 Integer,是引用类型
可以接收 null 值
如果请求中没有 number 参数,参数值会是 null
如果参数值为 null,方法会正常执行,返回 "接收参数null"
2. int number(r6 方法)
使用基本类型 int,是值类型
不能接收 null 值
如果请求中没有 number 参数,会发生以下情况:
Spring 会尝试使用默认值(对于 int 是 0)
但更常见的是会抛出异常(因为 Spring 不知道要用什么值填充)
实际行为取决于 Spring MVC 版本和配置
具体差异示例:


Spring MVC 请求映射注解总结
1. @RequestMapping
基础用法:
java
@Controller
@RequestMapping("/user") // 类路径
public class UserController {
@RequestMapping("/info") // 方法路径
public String getUserInfo() {
return "user-info";
}
}
访问路径:`/user/info`(类路径 + 方法路径)
指定请求方法:
java
@RequestMapping(value = "/save", method = RequestMethod.POST)
public String saveUser() {
// 只能通过POST请求访问
return "success";
}
2. 专用请求映射注解
@GetMapping - 只处理GET请求
@PostMapping - 只处理POST请求
@PutMapping` - PUT请求
@DeleteMapping` - DELETE请求
@PatchMapping` - PATCH请求
3. 请求参数接收方式
方式1:参数名匹配(默认方式)
java
@GetMapping("/detail")
public String getUserDetail(@RequestParam String name,
@RequestParam Integer age) {
// 前端参数名必须为 name 和 age
return "user-detail";
}
方式2:参数重命名 @RequestParam
java
@RequestMapping("/r10")
public String r9(@RequestParam(value = "q",required=false)String keyword)
{
return"接收参数:keyword="+keyword;
}
@RequestParam 参数说明:**
value/name`:指定前端参数名
required`:是否必须(默认true)
defaultValue`:默认值
方式3:绑定对象参数(推荐)
当参数较多时,封装为对象:java
java
public class UserInfo {
private String name;
private Integer gender;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "UserInfo{" +
"name='" + name + '\'' +
", gender=" + gender +
", age=" + age +
'}';
}
}
@RequestMapping("/r9")
public String r9(UserInfo userinfo)
{
return"接收参数:userinfo="+userinfo.toString();
}
方式4:接收集合/数组参数
java
@RequestMapping("/r2")//传递数组
public String r2(String[]arr)
{
return"接收参数:arr"+ Arrays.toString(arr);
}
@RequestMapping("/r3")//传递集合
public String r3(@RequestParam List<Integer>list)
{
return("接收参数:list"+ list);
}
- 完整示例```java
java
@RestController
@RequestMapping("/api/users")
public class UserController {
// GET请求,参数名匹配
@GetMapping("/simple")
public User simpleGet(String name, Integer age) {
return new User(name, age);
}
// GET请求,参数重命名
@GetMapping("/search")
public List<User> search(@RequestParam("keyword") String searchKey,
@RequestParam(required = false, defaultValue = "1") Integer page) {
return userService.search(searchKey, page);
}
// POST请求,接收对象
@PostMapping("/create")
public ResponseEntity<String> createUser(@RequestBody User user) {
userService.save(user);
return ResponseEntity.ok("创建成功");
}
// 接收集合参数
@DeleteMapping("/batch")
public String batchDelete(@RequestParam List<Long> ids) {
userService.batchDelete(ids);
return "删除成功";
}
}
// 实体类
class User {
private String username;
private Integer age;
// 构造器、getter、setter省略
}
注意事项总结
-
路径组合:类级别`@RequestMapping` + 方法级别映射注解 = 完整访问路径
-
参数绑定
简单参数:参数名需一致,或使用`@RequestParam`重命名
对象参数:自动绑定匹配的字段
集合参数:必须使用`@RequestParam`
-
可选参数:使用`required = false`标记
-
请求方式:使用专用注解(`@GetMapping`等)更清晰
-
RESTful风格:推荐使用`@RestController`配合`@GetMapping`、`@PostMapping`等