Servlet 到 Spring MVC 架构演进:Java Web 开发二十年技术变迁史

目录

一、前言

[二、Servlet 时代:Java Web 的起点](#二、Servlet 时代:Java Web 的起点)

[Servlet 工作流程](#Servlet 工作流程)

[Servlet 的问题](#Servlet 的问题)

[三、JSP 的出现](#三、JSP 的出现)

[四、Servlet + JSP 的经典模式](#四、Servlet + JSP 的经典模式)

[五、MVC 思想诞生](#五、MVC 思想诞生)

[MVC 架构图](#MVC 架构图)

MVC职责划分

Model

View

Controller

[六、Struts 时代](#六、Struts 时代)

[七、Spring MVC 的诞生](#七、Spring MVC 的诞生)

[八、Spring MVC 核心架构](#八、Spring MVC 核心架构)

[Spring MVC 架构图](#Spring MVC 架构图)

[九、DispatcherServlet 是什么?](#九、DispatcherServlet 是什么?)

[十、Spring MVC 请求执行流程](#十、Spring MVC 请求执行流程)

十一、注解时代到来

[十二、Spring MVC 自动完成了什么?](#十二、Spring MVC 自动完成了什么?)

参数解析

JSON转换

异常处理

数据校验

[十三、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 真正进入了高效开发时代。
相关推荐
z落落1 小时前
C# 静态成员 vs 非静态成员(调用规则+内存特点)+只读和常量 const常量 / readonly / static readonly 三者终极区别
java·开发语言·c#
java1234_小锋1 小时前
LangChain4j 开发Java Agent智能体- 整合SpringBoot4
java·开发语言·langchain4j
拓研C1 小时前
EM-Core-Agent:AI Agent 具身认知核心系统——架构白皮书 V1.0
人工智能·架构·车载系统·机器人·github
码农阿强1 小时前
PixVerse 全系列视频生成模型技术架构详解 + Python 基于 StartAPI.top 接口实战调用
python·ai·架构·音视频·ai编程
basketball6161 小时前
C++进阶:3. unique_ptr 现代C++内存管理的基石
java·jvm·c++
zzqssliu2 小时前
跨境代购系统的物流和通知模块重构思考:从设计模式到生产落地
java·设计模式·重构
appearappear2 小时前
一句sql 根据明细数据状态,精确更新一个主单主状态
java
许彰午2 小时前
04_Java数组操作全解
java·开发语言·python
AIGS0012 小时前
生产运营三大瓶颈,工业AI怎么破局?
java·人工智能·人工智能ai大模型应用