Spring 基础核心 - SpringMVC 入门与请求流程
本文是介绍 Spring 技术的第四篇入门级文章,前面已经介绍了 Spring 入门案例、IOC 容器、AOP 切面编程。
阅读本文了解:
- 无 MVC 时如何开发 web 项目
- 前后端分离来源
- MVC 架构模式
- Spring MVC 请求流程
引言
早期的 web 应用开发开发存在一个极其普遍且致命的问题:代码的混乱与耦合。在 MVC 普及之前,开发者使用 JSP 、PHP 等技术开发 web 应用,那会的技术会把代码都混在一起,比如一个登录功能的代码是这样:
<%@ page import="java.sql.*" %><html><body><h1>Login</h1><%// w问题1:业务逻辑、数据访问、UI展示代码全部纠缠在一起String username = request.getParameter("username");String password = request.getParameter("password");// 问题2:直接在页面里写数据库连接和查询(数据访问逻辑)Connection conn = null;try {conn = DriverManager.getConnection("jdbc:mysql://localhost/mydb", "user", "pass");Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'");// 问题3:在页面里判断业务逻辑if (rs.next()) {// 痛点4:直接在页面里输出HTML(视图逻辑)out.println("<h2>Welcome, " + username + "!</h2>");} else {out.println("<h2>Login Failed! Please try again.</h2>");}} catch (SQLException e) {out.println("<h2>System Error!</h2>");} finally {// ... 关闭连接}%></body></html>
这种职责混乱、高度耦合的代码非常难以维护,所谓“牵一发而动全身”。
MVC 架构的出现拯救了这种混乱的局面,像一把利剑一样强制分离关注点,拆分为 Model(数据/业务)、View(视图)、Controller(控制器)三部分,各司其职,前端和后端的岗位源自于 MVC 的架构模式。可以说,没有MVC奠定的“分离”思想,就不会有现代的前后端分离。前端专注于 View(视图)职责,后端专注于 Model 和 Controller 职责,并行开发,互不干扰。
看一张 Spring 的架构图:
作为 Spring 使用者,Core Container 模块应该都不陌生,@Bean 注解,Context 上下文类等都见过,而 AOP 或多或少也熟悉,问题来了,这两个模块是 Spring 的底层模块,如何利用它们构建上层应用?如 web 引用?
针对上层的 Web 应用,SpringMVC 诞生了,它也是 Spring 技术栈中最为重要的一个框架。
所以为了更好的帮助你串联整个知识体系,我列出了几个问题,通过如下几个问题帮你深入浅出的构建对SpringMVC的认知。
- Java技术栈的 Web 应用是如何发展的?
- 什么是 MVC,什么是 SpringMVC ?
- SpringMVC 主要的请求流程是什么样的?
- SpringMVC 中还有哪些组件?
- 如何编写一个简单的 SpringMVC 程序呢?
什么是 MVC?
MVC英文是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计规范。本质上也是一种解耦。
软件设计规范:为了解决某一类反复出现的问题,总结出一套被广泛认可的、行之有效的结构和模式。具有结构性的特点:通常定义了组件的角色、职责以及它们之间的交互方式,很像在某类问题、某个场景下的方法论。相似的概念是设计思想,这两个概念经常互用,不过设计思想更抽象一点。
设计思想:软件设计的核心原则和理念,回答的是“为什么要这么设计?”的问题。具有普适性,不局限于某个具体的问题或场景,可以应用在各种场景。比如高内聚、低耦合就是一种设计思想,任何编程语言都可以用。
回归到 MVC 学习,MVC 三个重点概念:模型、视图、控制器。看的出来这是一种数据、界面显示、业务逻辑分离的方法。
- Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
- View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
- Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
什么是 Spring MVC ?
上述介绍了 MVC 是一种设计思想,本质上是个抽象的东西,类似于“蓝图”,开发者无法直接使用。Spring MVC 便是基于 MVC 思想设计出来的开发框架,一个具体、可运行的产品,或者理解成一套“web应用开发工具包”,Spring MVC 目的是简化 Java 栈的 Web 开发。
Spring MVC 概念并不难理解,那 Spring MVC 是如何工作的呢?
Spring MVC 请求流程
看Spring MVC 的流程要将前后端串起来看,不能仅思考后端流程。
它的核心工作流程可以概括为:
- 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行 处理,作为统一访问点,进行全局的流程控制;
- DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求(如 user/list)映射为 HandlerExecutionChain 对象(包含一 个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
- DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器(适配器设计模型,便于调用),从而支持多种类型的处理器, 即适配器设计模式的应用,从而很容易支持很多类型的处理器;
- HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处理方法(Controller 方法),完成功能处理;并返回一个ModelAndView 对象, 前后端分离项目返回的是一个 业务对象(如:List
); - ModelAndView 的逻辑视图名——> ViewResolver,ViewResolver 将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术,如果是前后端分离项目,此步骤跳过,没有 ModelAndView 对象,那就没东西解析;
- View——>渲染,View 会根据传进来的Model 模型数据进行渲染,此处的Model 实际是一个Map 数据结构,因此很容易支持其他视图技术;
- 返回控制权给DispatcherServlet,由DispatcherServlet 返回响应给用户,到此一个流程结束。
一个基本的请求流程就是如此实现,如果涉及到Filter、文件上传还会多一两步流程,不做深入学习。
参考文章
https://pdai.tech/md/spring/spring-x-framework-springmvc.html#spring-mvc案例
本文由mdnice多平台发布