目录
一、前言
二、Servlet 时代:Java Web 的起点
Servlet 工作流程
Servlet 的问题
三、JSP 的出现
四、Servlet + JSP 的经典模式
五、MVC 思想诞生
MVC 架构图
MVC职责划分
Model
View
Controller
六、Struts 时代
七、Spring MVC 的诞生
八、Spring MVC 核心架构
Spring MVC 架构图
九、DispatcherServlet 是什么?
十、Spring MVC 请求执行流程
十一、注解时代到来
十二、Spring MVC 自动完成了什么?
参数解析
JSON转换
异常处理
数据校验
十三、Spring Boot 进一步简化
十四、从 Servlet 到 Spring MVC 的本质变化
十五、为什么 Spring MVC 能成为主流
十六、总结
一、前言
对于刚接触 Spring Boot 的开发者来说,经常会有一个疑问:
为什么访问一个接口: GET /user/list只需要写:
@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 程序:
@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 ServletServlet 工作流程
流程非常简单:
浏览器发送请求 ↓ Tomcat接收请求 ↓ 调用Servlet ↓ 返回响应Servlet 的问题
随着业务变复杂:
@WebServlet("/user") public class UserServlet extends HttpServlet { protected void doGet(...) { //查询数据库 //组装HTML //输出页面 } }一个类里面:
SQL 业务逻辑 HTML页面 请求处理全部混在一起。
最终导致:
代码难维护 耦合严重 开发效率低三、JSP 的出现
为了解决页面开发问题。
Sun 推出了:
JSP即:
Java Server Pages示例:
<html> <body> <h1>Hello JSP</h1> <% out.println("当前时间"); %> </body> </html>此时:
页面交给JSP 逻辑交给Servlet架构变成:
四、Servlet + JSP 的经典模式
2000年前后。
大量企业项目采用:
Servlet + JSP模式。
例如:
UserService service = new UserService(); List<User> users = service.list(); request.setAttribute( "users", users ); request.getRequestDispatcher( "/user.jsp" ).forward( request, response );然后:
<c:forEach items="${users}" var="user"> ${user.name} </c:forEach>这种方式比纯 Servlet 已经好很多。
但是问题依旧存在。
五、MVC 思想诞生
开发者发现:
一个系统其实包含三部分:
数据 界面 业务于是提出:
MVC即:
Model View ControllerMVC 架构图
MVC职责划分
Model
负责:
业务逻辑 数据库访问 数据处理例如:
UserService UserMapperView
负责:
页面展示例如:
JSP HTMLController
负责:
接收请求 调用业务 返回结果例如:
UserController六、Struts 时代
MVC 思想成熟后。
Apache 推出了:
Struts这是 Java Web 第一个真正意义上的 MVC 框架。
配置:
<action path="/login" type="LoginAction"/>对应:
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 最大特点:
前端控制器模式所有请求统一进入:
DispatcherServletSpring 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 最大创新之一:
注解开发以前:
<action path="/user"/>现在:
@Controller @RequestMapping("/user") public class UserController { }接口:
@GetMapping("/list") public List<User> list() { return userService.list(); }简单直观。
十二、Spring MVC 自动完成了什么?
当请求到来:
/user/list?id=1Spring MVC 自动完成:
参数解析
public User get(Long id)自动接收:
id=1JSON转换
返回:
User自动变:
{ "id":1, "name":"Tom" }异常处理
@ControllerAdvice统一异常。
数据校验
@Valid自动校验参数。
十三、Spring Boot 进一步简化
Spring MVC 虽然强大。
但配置仍然不少:
DispatcherServlet ViewResolver ComponentScan都需要配置。
Spring Boot 出现后:
@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 能成为主流
原因其实很简单。
它解决了企业开发最核心的问题:
降低重复代码开发者只需要关注:
@GetMapping("/list") public List<User> list() { return userService.list(); }剩余工作:
请求解析 参数绑定 Bean管理 JSON转换 异常处理 事务管理全部由 Spring 完成。
十六、总结
Java Web 二十多年的发展,本质上是一部:
不断解放生产力的历史。
演进路线:
Servlet ↓ JSP ↓ Servlet + JSP ↓ MVC ↓ Struts ↓ Spring MVC ↓ Spring Boot从最初:
response.getWriter().write(...)到今天:
@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 真正进入了高效开发时代。