目录一、前言二、Servlet 时代Java Web 的起点Servlet 工作流程Servlet 的问题三、JSP 的出现四、Servlet JSP 的经典模式五、MVC 思想诞生MVC 架构图MVC职责划分ModelViewController六、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 ListUser 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 h1Hello JSP/h1 % out.println(当前时间); % /body /html此时页面交给JSP 逻辑交给Servlet架构变成四、Servlet JSP 的经典模式2000年前后。大量企业项目采用Servlet JSP模式。例如UserService service new UserService(); ListUser users service.list(); request.setAttribute( users, users ); request.getRequestDispatcher( /user.jsp ).forward( request, response );然后c:forEach items${users} varuser ${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 typeLoginAction/对应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 ListUser list() { return userService.list(); }简单直观。十二、Spring MVC 自动完成了什么当请求到来/user/list?id1Spring MVC 自动完成参数解析public User get(Long id)自动接收id1JSON转换返回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框架管理流程 开发者专注业务对比功能ServletSpring MVCURL映射手工处理注解参数解析手写自动JSON转换手写自动异常处理手写自动IoC管理无支持AOP支持无支持十五、为什么 Spring MVC 能成为主流原因其实很简单。它解决了企业开发最核心的问题降低重复代码开发者只需要关注GetMapping(/list) public ListUser 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 真正进入了高效开发时代。
Servlet 到 Spring MVC 架构演进:Java Web 开发二十年技术变迁史
目录一、前言二、Servlet 时代Java Web 的起点Servlet 工作流程Servlet 的问题三、JSP 的出现四、Servlet JSP 的经典模式五、MVC 思想诞生MVC 架构图MVC职责划分ModelViewController六、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 ListUser 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 h1Hello JSP/h1 % out.println(当前时间); % /body /html此时页面交给JSP 逻辑交给Servlet架构变成四、Servlet JSP 的经典模式2000年前后。大量企业项目采用Servlet JSP模式。例如UserService service new UserService(); ListUser users service.list(); request.setAttribute( users, users ); request.getRequestDispatcher( /user.jsp ).forward( request, response );然后c:forEach items${users} varuser ${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 typeLoginAction/对应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 ListUser list() { return userService.list(); }简单直观。十二、Spring MVC 自动完成了什么当请求到来/user/list?id1Spring MVC 自动完成参数解析public User get(Long id)自动接收id1JSON转换返回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框架管理流程 开发者专注业务对比功能ServletSpring MVCURL映射手工处理注解参数解析手写自动JSON转换手写自动异常处理手写自动IoC管理无支持AOP支持无支持十五、为什么 Spring MVC 能成为主流原因其实很简单。它解决了企业开发最核心的问题降低重复代码开发者只需要关注GetMapping(/list) public ListUser 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 真正进入了高效开发时代。