Web 应用基础:MVC 与控制器
本教程共 48 篇 · 第 18 篇 · 更新于 2026-08-13 · 约 3 分钟阅读
本节目标:搞懂一次 HTTP 请求在 Spring MVC 里走的路,学会用 @Controller 和 @RestController 接住请求并返回结果。
Spring MVC 是什么
Spring MVC 是 Spring 家族里的 Web 框架。它负责接收 HTTP 请求,调用你的业务代码,再把结果返回给浏览器。
MVC 是三个词的缩写:Model(数据)、View(页面)、Controller(控制器)。
分工很简单。控制器接请求,模型装数据,视图管展示。三者解耦,各干各的。
Spring Boot 内置了对 Spring MVC 的自动配置。引入 spring-boot-starter-webmvc,Web 能力就齐了,不用手动配。
一次请求的完整旅程
先记住一个名字:DispatcherServlet。它是 Spring MVC 的前置控制器,所有请求都从它门前过。
请求的流转分五步:
- 请求到达
DispatcherServlet,它是总入口。 - 它问
HandlerMapping:这个 URL 该找谁处理? HandlerMapping根据注解匹配到控制器方法。- 控制器方法执行,返回数据或视图名。
DispatcherServlet把结果交给ViewResolver,渲染后响应客户端。
Note初学者不用自己创建 DispatcherServlet。Spring Boot 自动配置里已经注册好了,映射在
/。
控制器怎么写
控制器就是一个普通类,加上 @Controller 注解。Spring 启动时会扫描它,把方法注册成请求处理器。
看一个最简单的例子:
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello() {
// 返回视图名,对应 templates/hello.html
return "hello";
}
}
@GetMapping("/hello") 表示:GET 请求访问 /hello 时,调用这个方法。
@RequestMapping 是基础注解,可以指定方法和路径。@GetMapping、@PostMapping、@PutMapping、@DeleteMapping 是它的快捷版本,分别对应不同 HTTP 方法。
方法返回字符串 "hello",Spring MVC 会把它当视图名解析。对应文件在 src/main/resources/templates/hello.html。
这就是 MVC 的 View 环节:控制器返回视图名,视图解析器找到模板,模板渲染成 HTML。
@RestController 与接口返回
前后端分离的项目里,控制器不返回页面,返回 JSON 数据。
这时用 @RestController。它是 @Controller 加 @ResponseBody 的组合注解。方法返回的对象会被 JSON 序列化后写进响应体。
package com.example.demo.controller;
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class InfoController {
@GetMapping("/info")
public Map<String, String> info() {
// Map 会自动转成 JSON 输出
return Map.of("name", "码上学", "version", "4.1.0");
}
}
启动后访问 http://localhost:8080/info,返回:
{"name":"码上学","version":"4.1.0"}
JSON 转换由 HttpMessageConverter 完成。Spring Boot 默认带 Jackson,开箱即用,不用额外配置。
Tip返回 JSON 用 @RestController;返回页面用 @Controller。混用场景下,页面控制器里单个方法也可以加 @ResponseBody 临时返回数据。
Spring Boot 的 MVC 自动配置
Spring Boot 的 MVC 自动配置做了很多事,比裸 Spring MVC 省心:
- 自动注册视图解析器(ContentNegotiatingViewResolver)。
- 支持静态资源:
/static、/public、/resources目录。 - 自动注册 JSON 转换器。
- 支持欢迎页:放一个
index.html就能当首页。 - 内置
/error错误处理。
这些配置在 WebMvcAutoConfiguration 里。想加自定义配置(拦截器、格式化器等),写一个 WebMvcConfigurer 实现类即可。
Warning不要自己加 @EnableWebMvc。它会让 Spring Boot 的 MVC 自动配置全部失效,静态资源、JSON 转换都得自己配,初学者很容易踩坑。
运行与验证
项目里加上两个依赖(版本由父 POM 统一管理,无需写版本号):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
启动方式二选一:
mvn spring-boot:run
mvn package
java -jar target/demo-0.0.1-SNAPSHOT.jar
浏览器访问 http://localhost:8080/hello 看到页面,访问 /info 看到 JSON,控制器就通了。
本节小结
- DispatcherServlet 是 Spring MVC 总入口,负责分发请求。
- @Controller 返回视图名,@RestController 返回 JSON。
- 模板放
templates/,静态资源放static/。 - 依赖 Spring Boot 自动配置,不要自己加 @EnableWebMvc。