目录
[二、Servlet 时代:Java Web 的起点](#二、Servlet 时代:Java Web 的起点)
[Servlet 工作流程](#Servlet 工作流程)
[Servlet 的问题](#Servlet 的问题)
[三、JSP 的出现](#三、JSP 的出现)
[四、Servlet + JSP 的经典模式](#四、Servlet + JSP 的经典模式)
[五、MVC 思想诞生](#五、MVC 思想诞生)
[MVC 架构图](#MVC 架构图)
[六、Struts 时代](#六、Struts 时代)
[七、Spring MVC 的诞生](#七、Spring MVC 的诞生)
[八、Spring MVC 核心架构](#八、Spring MVC 核心架构)
[Spring MVC 架构图](#Spring MVC 架构图)
[九、DispatcherServlet 是什么?](#九、DispatcherServlet 是什么?)
[十、Spring MVC 请求执行流程](#十、Spring MVC 请求执行流程)
[十二、Spring MVC 自动完成了什么?](#十二、Spring MVC 自动完成了什么?)
[十三、Spring Boot 进一步简化](#十三、Spring Boot 进一步简化)
[十四、从 Servlet 到 Spring MVC 的本质变化](#十四、从 Servlet 到 Spring MVC 的本质变化)
[十五、为什么 Spring MVC 能成为主流](#十五、为什么 Spring MVC 能成为主流)
一、前言
对于刚接触 Spring Boot 的开发者来说,经常会有一个疑问:
为什么访问一个接口:
GET /user/list
只需要写:
java
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/list")
public List<User> list() {
return userService.list();
}
}
Spring 就能够自动接收请求、解析参数、返回 JSON?
这些能力究竟是谁实现的?
事实上:
Spring MVC
并不是凭空出现的。
它是 Java Web 技术二十多年演进的结果。
整个发展历程大致如下:
Servlet
↓
JSP
↓
Servlet + JSP
↓
MVC
↓
Struts
↓
Spring MVC
↓
Spring Boot
今天我们就来看看:
Java Web 是如何从几十行 Servlet 演变成一个 @GetMapping 的。
二、Servlet 时代:Java Web 的起点
1997年。
Sun 公司推出:
Servlet
用于处理 HTTP 请求。
当时一个最简单的 Web 程序:
java
@WebServlet("/hello")
public class HelloServlet
extends HttpServlet {
@Override
protected void doGet(
HttpServletRequest request,
HttpServletResponse response)
throws IOException {
response.getWriter()
.write("Hello Servlet");
}
}
浏览器访问:
http://localhost:8080/hello
返回:
Hello Servlet
Servlet 工作流程

流程非常简单:
浏览器发送请求
↓
Tomcat接收请求
↓
调用Servlet
↓
返回响应
Servlet 的问题
随着业务变复杂:
java
@WebServlet("/user")
public class UserServlet
extends HttpServlet {
protected void doGet(...) {
//查询数据库
//组装HTML
//输出页面
}
}
一个类里面:
SQL
业务逻辑
HTML页面
请求处理
全部混在一起。
最终导致:
代码难维护
耦合严重
开发效率低
三、JSP 的出现
为了解决页面开发问题。
Sun 推出了:
JSP
即:
Java Server Pages
示例:
html
<html>
<body>
<h1>Hello JSP</h1>
<%
out.println("当前时间");
%>
</body>
</html>
此时:
页面交给JSP
逻辑交给Servlet
架构变成:

四、Servlet + JSP 的经典模式
2000年前后。
大量企业项目采用:
Servlet + JSP
模式。
例如:
java
UserService service =
new UserService();
List<User> users =
service.list();
request.setAttribute(
"users",
users
);
request.getRequestDispatcher(
"/user.jsp"
).forward(
request,
response
);
然后:
html
<c:forEach items="${users}"
var="user">
${user.name}
</c:forEach>
这种方式比纯 Servlet 已经好很多。
但是问题依旧存在。
五、MVC 思想诞生
开发者发现:
一个系统其实包含三部分:
数据
界面
业务
于是提出:
MVC
即:
Model
View
Controller
MVC 架构图

MVC职责划分
Model
负责:
业务逻辑
数据库访问
数据处理
例如:
UserService
UserMapper
View
负责:
页面展示
例如:
JSP
HTML
Controller
负责:
接收请求
调用业务
返回结果
例如:
UserController
六、Struts 时代
MVC 思想成熟后。
Apache 推出了:
Struts
这是 Java Web 第一个真正意义上的 MVC 框架。
配置:
html
<action
path="/login"
type="LoginAction"/>
对应:
java
public class LoginAction
extends Action {
public ActionForward execute(...) {
return mapping.findForward(
"success"
);
}
}
优点:
统一请求入口
MVC规范
缺点:
配置繁琐
XML过多
扩展困难
七、Spring MVC 的诞生
2004年。
Spring Framework 诞生。
随后:
Spring MVC
出现。
其目标:
简化MVC开发
核心思想:
约定优于配置
八、Spring MVC 核心架构
Spring MVC 最大特点:
前端控制器模式
所有请求统一进入:
DispatcherServlet
Spring MVC 架构图

九、DispatcherServlet 是什么?
它是:
Spring MVC核心
所有请求:
/user/list
/order/create
/product/query
都会先进入:
DispatcherServlet
然后再分发。
因此:
DispatcherServlet
=
总调度中心
十、Spring MVC 请求执行流程
用户访问:
GET /user/list
执行过程:
sequenceDiagram
Browser->>DispatcherServlet: 请求
DispatcherServlet->>HandlerMapping:
查找Controller
HandlerMapping-->>DispatcherServlet:
返回方法
DispatcherServlet->>Controller:
执行方法
Controller-->>DispatcherServlet:
返回数据
DispatcherServlet-->>Browser:
响应结果
十一、注解时代到来
Spring MVC 最大创新之一:
注解开发
以前:
html
<action path="/user"/>
现在:
java
@Controller
@RequestMapping("/user")
public class UserController {
}
接口:
java
@GetMapping("/list")
public List<User> list() {
return userService.list();
}
简单直观。
十二、Spring MVC 自动完成了什么?
当请求到来:
/user/list?id=1
Spring MVC 自动完成:
参数解析
java
public User get(Long id)
自动接收:
id=1
JSON转换
返回:
User
自动变:
{
"id":1,
"name":"Tom"
}
异常处理
@ControllerAdvice
统一异常。
数据校验
@Valid
自动校验参数。
十三、Spring Boot 进一步简化
Spring MVC 虽然强大。
但配置仍然不少:
DispatcherServlet
ViewResolver
ComponentScan
都需要配置。
Spring Boot 出现后:
java
@SpringBootApplication
public class Application {
public static void main(
String[] args) {
SpringApplication.run(
Application.class,
args
);
}
}
即可启动。
内置:
Tomcat
Spring MVC
Jackson
日志
全部自动配置。
十四、从 Servlet 到 Spring MVC 的本质变化
如果总结二十年的演进:
Servlet:
开发者管理所有细节
Spring MVC:
框架管理流程
开发者专注业务
对比:
| 功能 | Servlet | Spring MVC |
|---|---|---|
| URL映射 | 手工处理 | 注解 |
| 参数解析 | 手写 | 自动 |
| JSON转换 | 手写 | 自动 |
| 异常处理 | 手写 | 自动 |
| IoC管理 | 无 | 支持 |
| AOP支持 | 无 | 支持 |
十五、为什么 Spring MVC 能成为主流
原因其实很简单。
它解决了企业开发最核心的问题:
降低重复代码
开发者只需要关注:
java
@GetMapping("/list")
public List<User> list() {
return userService.list();
}
剩余工作:
请求解析
参数绑定
Bean管理
JSON转换
异常处理
事务管理
全部由 Spring 完成。
十六、总结
Java Web 二十多年的发展,本质上是一部:
不断解放生产力
的历史。
演进路线:
Servlet
↓
JSP
↓
Servlet + JSP
↓
MVC
↓
Struts
↓
Spring MVC
↓
Spring Boot
从最初:
java
response.getWriter().write(...)
到今天:
java
@GetMapping("/user")
public User query() {
return user;
}
开发者编写的代码越来越少。
框架承担的职责越来越多。
而 Spring MVC 正是这条演进路线中最重要的里程碑之一。
它不仅统一了 Java Web 开发模式,也为后来的 Spring Boot、Spring Cloud 以及微服务体系奠定了坚实基础。
可以这样理解:
Servlet 是 Java Web 的起点,
Spring MVC 是 Java Web 走向现代化的转折点,
而 Spring Boot 则让 Java Web 真正进入了高效开发时代。