2022尚硅谷SSM框架跟学(九)Spring MVC基础四

news2024/12/28 4:49:20

2022尚硅谷SSM框架跟学 九 Spring MVC基础四

    • 14.SpringMVC执行流程
      • 14.1SpringMVC常用组件
      • 14.2DispatcherServlet初始化过程(Init)
        • (1).初始化WebApplicationContext
        • (2).创建WebApplicationContext
        • (3).DispatcherServlet初始化策略
      • 14.3DispatcherServlet调用组件处理请求(Service)
        • (1).processRequest()
        • (2).doService()
        • (3).doDispatch()
        • (4).processDispatchResult()
      • 14.4SpringMVC的执行流程

14.SpringMVC执行流程

14.1SpringMVC常用组件

  • DispatcherServlet:前端控制器,不需要工程师开发,由框架提供。
    作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求。
  • HandlerMapping:处理器映射器,不需要工程师开发,由框架提供。作用:根据请求的url、method等信息查找Handler,即控制器方法。
  • Handler:处理器,需要工程师开发。
    作用:在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
  • HandlerAdapter:处理器适配器,不需要工程师开发,由框架提供
    作用:通过HandlerAdapter对处理器(控制器方法)进行执行。
  • ViewResolver:视图解析器,不需要工程师开发,由框架提供。
    作用:进行视图解析,得到相应的视图,例如:ThymeleafView、InternalResourceView、RedirectView。
  • View:视图
    作用:将模型数据通过页面展示给用户

14.2DispatcherServlet初始化过程(Init)

DispatcherServlet 本质上是一个 Servlet,所以天然的遵循 Servlet 的生命周期。所以宏观上是 Servlet生命周期来进行调度。

先看一下类图的继承关系
在这里插入图片描述

public interface Servlet

在这里插入图片描述


public abstract class GenericServlet implements Servlet, ServletConfig, Serializable

在这里插入图片描述


public abstract class HttpServlet extends GenericServlet

没有重写


public abstract class HttpServletBean extends HttpServlet implements EnvironmentCapable, EnvironmentAware 

在这里插入图片描述
之后开始初始化

(1).初始化WebApplicationContext

所在类:org.springframework.web.servlet.FrameworkServlet

public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware 

在这里插入图片描述
点进去initWebApplicationContext方法继续看源码
在这里插入图片描述
之后创建WebApplicationContext

(2).创建WebApplicationContext

所在类:org.springframework.web.servlet.FrameworkServlet

点进去createWebApplicationContext方法继续看
在这里插入图片描述
点进去看createWebApplicationContext有参方法
在这里插入图片描述


继续看FrameworkServlet.class的WebApplicationContext方法
在这里插入图片描述
我们点进去看onRefresh
在这里插入图片描述


public class DispatcherServlet extends FrameworkServlet

在这里插入图片描述

(3).DispatcherServlet初始化策略

FrameworkServlet创建WebApplicationContext后,刷新容器,调用onRefresh(wac),此方法在DispatcherServlet中进行了重写,调用了initStrategies(context)方法,初始化策略,即初始化DispatcherServlet的各个组件。
所在类:org.springframework.web.servlet.DispatcherServlet

点进去initStrategies方法
在这里插入图片描述

14.3DispatcherServlet调用组件处理请求(Service)

从顶层接口开始看

public interface Servlet

在这里插入图片描述


实现类

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable

在这里插入图片描述


public abstract class HttpServlet extends GenericServlet

发现有2个service方法
在这里插入图片描述
先看重写父类的
在这里插入图片描述
再看HttpServlet.class自己重载的
在这里插入图片描述


public abstract class HttpServletBean extends HttpServlet implements EnvironmentCapable, EnvironmentAware {

没有重写service方法

(1).processRequest()

FrameworkServlet重写HttpServlet中的service()和doXxx(),这些方法中调用了processRequest(request, response)
所在类:org.springframework.web.servlet.FrameworkServlet

public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware

在这里插入图片描述
这里的父类指的是HttpServlet.class中的service
在这里插入图片描述
而我们看子类FrameworkServlet.class,重写了4种请求
在这里插入图片描述
发现4种请求方式调用的方法都是processRequest
在这里插入图片描述
那我们来看一下processRequest方法
在这里插入图片描述
发现核心方法是doService,而doService是一个抽象方法,需要子类继承

(2).doService()

所在类:org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {

在这里插入图片描述
方法比较长我们直接看核心方法doDispatch来处理请求
在这里插入图片描述

(3).doDispatch()

所在类:org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {

在这里插入图片描述
方法比较长,我们往下看,看到了之前熟悉的代码
在这里插入图片描述
我们继续看processDispatchResult

(4).processDispatchResult()

所在类:org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {

在这里插入图片描述
往下拉,下面也有拦截器
在这里插入图片描述

看render方法渲染视图
在这里插入图片描述

14.4SpringMVC的执行流程

(1).用户向服务器发送请求,请求被SpringMVC 前端控制器 DispatcherServlet捕获。
(2).DispatcherServlet对请求URL(统一资源定位符,带协议、IP地址、端口号;理解为资源在网络中的路径)进行解析,得到请求资源标识符(URI,不带协议、不带IP地址、不带端口号;理解为资源在服务器中的路径),判断请求URI对应的映射:
(a).不存在
i.再判断是否配置了mvc:default-servlet-handler(默认的servlet,可以加载静态页面)。
ii.如果没配置,则控制台报映射查找不到,客户端展示404错误。
在这里插入图片描述

iii.如果有配置,则访问目标资源(一般为静态资源,如:JS,CSS,HTML),找不到客户端也会展示404错误。
在这里插入图片描述
(b).存在,则执行下面的流程
(3).根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain执行链对象的形式返回。
在这里插入图片描述
(4).DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。
在这里插入图片描述

(5).如果成功获得HandlerAdapter,此时将开始执行拦截器的preHandler(…)方法【正向】。
在这里插入图片描述
(6).提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)方法,处理请求。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
(a).HttpMessageConveter(报文信息转换器): 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息。
(b).数据转换:对请求消息进行数据转换。如String转换成Integer、Double等。
(c ).数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等。
(d).数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。
(7).Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象。
在这里插入图片描述
(8).此时将开始执行拦截器的postHandle(…)方法【逆向】。
在这里插入图片描述
(9).根据返回的ModelAndView(此时会判断是否存在异常:如果存在异常,则执行HandlerExceptionResolver进行异常处理)选择一个适合的ViewResolver进行视图解析,根据Model和View,来渲染视图。
在这里插入图片描述

(10).渲染视图完毕执行拦截器的afterCompletion(…)方法【逆向】。
在这里插入图片描述

(11).将渲染结果返回给客户端。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS环境安装ffmpeg

这是我在网上搜罗的方法,亲测好用 ,借此写篇文章,分享给大家。温馨提示:安装ffmpeg过程会很慢,因为它集成的功能太多了,所以在安装过程中不必长时间等待,执行命令后可暂时先去忙别的事&#xff…

Unity URP无法设置Transparency Sort Mode

Unity URP无法设置Transparency Sort Mode问题解决方案参考问题 一般使用Unity制作2D游戏时会将Transparency Sort Mode设置为Custom Axis并将Transparency Sort Axis设置为0,1,0来方便Spirte排序 但是当渲染管线切换为Universal Render Pipeline(通用渲染管线)时 Transpare…

JAVA将百万级数据高效的导出到EXCEL表单

遇到的问题 1.list集合太大&#xff0c;触发oom 2.导出excel数据量太大内存占满&#xff0c;没输出到硬盘前已经出发oom 接下来尝试用poi解决 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version&…

如何在Exchange Online中使用使用反垃圾邮件策略将域列入白名单

将域列入白名单 打开安全门户单击威胁策略单击反垃圾邮件策略单击反垃圾邮件入站策略(默认)单击“允许域”Exchange Online已启用默认的反垃圾邮件策略。策略的名称为Default。不建议使用这些电子邮件,因为它们会使你的组织容易受到来自该域或发件人的欺骗电子邮件的攻击。我…

【环境配置】在Ubuntu中使用Docker20.10.23配置FATE1.10.0(单机部署)

前言 本文讲解了在Ubuntu22中使用Docker20配置FATE1.10.0的方法 分为官方文档与我自己的实际操作两个部分 需要先安装docker&#xff0c;可以看我的上一篇文章 安装流程前言一、FATE单机部署指南&#xff08;官方&#xff09;1. 说明2. 使用Docker镜像安装FATE&#xff08;推荐…

Maven(mvn)基础

Maven&#xff08;mvn&#xff09;基础 文章目录Maven&#xff08;mvn&#xff09;基础传统项目管理状态分析Maven是什么Maven的作用下载与安装1.下载安装2.环境变量配置Maven基础概念仓库坐标本地仓库配置全局setting与用户setting第一个Maven项目(手动)Maven工程目录结构Mave…

蓝桥杯-长草

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目描述&#xff1a; 已知一个长度为n&#xff0c;宽度为m的长方形草地&#xff0c;但不是每一个方格里面都长满了草&#xff0c;只有部分的方格张了些草。并且每个月草会向上下左右都繁殖一个…

Linux中MMU内存管理【进阶学习】

前言 现代操作系统普遍采用虚拟内存管理&#xff08;Virtual Memory Management&#xff09;机制&#xff0c;这需要处理器中的MMU&#xff08;Memory Management Unit&#xff0c;内存管理单元&#xff09;提供支持。 MMU&#xff08;Memory Management Unit) &#xff1a;内…

微信小程序023安全科普之家在线考试错题集

开发语言&#xff1a;Java 小程序前端框架&#xff1a;uniapp 小程序运行软件&#xff1a;微信开发者 后端技术:Ssm(SpringSpringMVCMyBatis)vue.js 后端开发环境:idea/eclipse 数据库:mysql 本系统设计的是一个“科普之家”知识在线考试小程序的网站&#xff0c;此网站使用户实…

计算机网络基础知识点

计算机网络基础知识点计算机网络1、概述1.1 计算机网络基本概念1.2 互联网核心部分:数据交换1.3 计算机网络的性能指标1.4 计算机网络体系结构2、物理层2.1 物理层基本概念2.2 数据通信系统模型2.3 数据编码技术2.4 信道复用技术3、数据链路层3.1 概述3.2 PPP协议3.3 CSMA/CD3.…

Python垃圾回收机制——完美讲解

Garbage collection(GC) 现在的高级语言如java&#xff0c;c#等&#xff0c;都采用了垃圾收集机制&#xff0c;而不再是c&#xff0c;c里用户自己管理维护内存的方式。自己管理内存极其自由&#xff0c;可以任意申请内存&#xff0c;但如同一把双刃剑&#xff0c;为大量内存泄…

小程序用ts时点击事件e的类型

今天检查代码的时候发现&#xff0c;小伙伴用ts写的文件里面&#xff0c;点击事件的e都是用any&#xff0c;这明显不对。所以趁着有空&#xff0c;去百度去翻阅资料解决这个问题。 小程序的官方社区下面直接给了答案&#xff0c;如下图&#xff1a; 嗯&#xff0c;是的&#x…

看ChatGPT这形势,留给我们开发人员的时间不多了

程序员一直所做的工作是什么&#xff1f;恐怕想到最后&#xff0c;每个努力的程序员都是在让自己努力的走向失业。最近ChatGPT爆火&#xff0c;他能做什么&#xff1f;能写文章&#xff0c;写的很好&#xff0c;可以代替你发邮件&#xff0c;一直到发现OpenAI的深度加持&#x…

微信小程序 Springboot+vue+nodejs学科竞赛比赛报名管理系统

目 录 摘 要 III Abstract 4 1 系统概述 5 1.1 概述 5 1.2课题意义 5 1.3 主要内容 5 2 系统开发环境 6 2.1微信开发者工具 6 2.2小程序框架以及目录结构介绍 6 2.3 JAVA简介 7 2.4 MySQL数据库 7 3 需求分析 1 3.1 系统设计目标 1 …

实战案例 Python批量识别银行卡号码并且写入Excel,初学者也可以轻松使用~

大家好&#xff0c;这里是恶霸 今天我们继续学习Python自动化办公&#xff1a;每次有新员工入职&#xff0c;都要收集大量的工资卡信息&#xff0c;并且生成Excel文档&#xff0c;能不能用Python准确、快速地解决呢&#xff1f; 今天我们就来学习一下&#xff0c;如何用1行代…

【07】FreeRTOS的列表和列表项

目录 1.列表和列表项的简介 1.1列表结构体成员-介绍 1.2列表项结构层成员-介绍 1.3迷你列表项 1.4列表和列表项的关系 2.列表相关API函数介绍 2.1列表初始化函数vListInitialise() 2.2列表项初始化函数vListInitialiseItem() 2.3列表项插入函数vListInsert() 2.4末尾…

微服务配置中心, 这个方案 Go 里用起来不输SpringCloud

微服务架构设计模式里有一条讲到&#xff0c;要设计可配置的服务。把服务从单体架构细分成微服务后&#xff0c;所有配置属性都集中存储在一个位置&#xff0c;更易于管理。这个集中存储管理配置的地方叫&#xff0c;就是配置中心。 使用配置中心还有一个好处就是&#xff0c;…

java基础面试题 一

一、面向对象五大基本原则是什么 1.单一职责原则SRP(Single Responsibility Principle) 类的功能要单一&#xff0c;不能包罗万象&#xff0c;跟杂货铺似的。 2.开放封闭原则OCP(Open&#xff0d;Close Principle) 一个模块对于扩展是开放的&#xff0c;对于修改是封闭的 …

Jenkins基于docker cloud动态增减节点

jenkins可以按照jenkins容器启动去部署 Jenkins管理动态节点 动态节点可以在有job运行时&#xff0c;临时加入一个agent到jenkins master&#xff0c;然后等job执行完毕之后&#xff0c;所加入的agent再自动删除掉&#xff0c;达到一个动态的增删节点效果&#xff0c;使所有的…

引用第三方插件到分包中即如何把uni_modules文件夹中的插件放入分包中

网上搜索了很多&#xff0c;但都没有直接说明如何把node_modules中的第三方插件如何引入到分包中&#xff0c;首先为什么要在分包引入&#xff0c;原因就是小程序有包大小的限制&#xff0c;不能超过2M&#xff0c;超过2M的话&#xff0c;则不能发布或预览&#xff0c;于是不能…