SpringMVC之DispatcherServlet组件

目录

  • 一、SpringMVC的核心处理流程
  • 二、DispatcherServlet
    • 1、init()方法
    • 2、doDispatch()方法
    • 3、AbstractAnnotationConfigDispatcherServletInitializer类



一、SpringMVC的核心处理流程

  1. 请求到达 DispatcherServlet

  2. DispatcherServlet 的请求处理
  • DispatcherServlet 接收到请求后,会通过 HandlerMapping 找到处理该请求的 Controller。

  1. 处理器映射(Handler Mapping)
  • HandlerMapping 将请求映射到对应的处理器(Controller)上。

  1. 处理器执行
  • DispatcherServlet 调用处理器(Controller)的适当方法来处理请求。这个方法执行业务逻辑,并返回 Model 对象和逻辑视图名。

  1. 视图解析器解析逻辑视图名
  • DispatcherServlet 使用视图解析器(ViewResolver)将逻辑视图名解析为具体的视图对象。

  1. 视图渲染
  • DispatcherServlet 将 Model 对象传递给视图,视图使用 Model 中的数据生成响应内容(例如 HTML 页面)。

  1. 响应返回客户端
  • DispatcherServlet 将生成的响应内容返回给客户端。


二、DispatcherServlet

SpringMVC提供了 DispatcherServlet ,可以负责请求的分发、处理器的调用、视图的解析和呈现,以及拦截器的调用等任务,是整个 Spring MVC 框架的核心组件之一


1、init()方法

处理了 WebApplicationContext 的创建和初始化,还有设置和配置 Servlet 环境,注册和初始化 Servlet 的内部组件以及其他自定义的初始化操作等


WebApplicationContext 是 Spring 框架中用于管理 Web 应用程序配置信息的上下文接口。它扩展了普通的 Spring 应用上下文 ApplicationContext,并添加了一些特定于 Web 应用的功能和特性。(WebApplicationContext 是 ApplicationContext 接口的一个子接口)


2、doDispatch()方法

DispatcherServlet 中的 doDispatch() 方法是核心的请求分发方法,用于将请求分发给适当的处理器(Handler)进行处理。在请求处理过程中,还会涉及参数绑定、数据验证、视图解析等其他操作。

// 简化版
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {// 获取请求处理器(通过 HandlerMapping 建立请求URL和Handler方法之间的映射关系)// 遍历所有的处理器映射器,尝试从中找到适合当前请求的处理器,并返回执行链(HandlerExecutionChain)HandlerExecutionChain handler = getHandler(request);if (handler == null) {// 如果没有合适的处理器,返回 404 错误response.sendError(HttpServletResponse.SC_NOT_FOUND);return;}// 应用请求预处理器if (!applyPreHandle(request, response, executionChain.getInterceptors())) {return;}// 找多Handler对应的请求处理器HandlerAdapter handlerAdapter = getHandlerAdapter(handler.getHandler());// 执行Handler方法handlerAdapter.handle(request, response, handler.getHandler());// 应用请求后处理器applyPostHandle(request, response, executionChain.getInterceptors(), executionChain.getHandler());// 触发请求完成后的处理triggerAfterCompletion(request, response, null);protected boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response, HandlerInterceptor[] interceptors) throws Exception {if (interceptors != null) {// 遍历所有的请求预处理器(拦截器)for (int i = 0; i < interceptors.length; i++) {HandlerInterceptor interceptor = interceptors[i];// 调用请求预处理器的preHandle()方法if (!interceptor.preHandle(request, response, handler)) {// 如果某个预处理器返回false,表示拦截请求,直接返回falsetriggerAfterCompletion(request, response, null, new Exception("Interceptor[" + interceptor + "] preHandle return false"));return false;}}}// 所有的预处理器都通过,返回truereturn true;}protected void applyPostHandle(HttpServletRequest request, HttpServletResponse response, HandlerInterceptor[] interceptors, Object handler) throws Exception {if (interceptors != null) {// 逆序遍历所有的请求后处理器(拦截器)for (int i = interceptors.length - 1; i >= 0; i--) {HandlerInterceptor interceptor = interceptors[i];// 调用请求后处理器的postHandle()方法interceptor.postHandle(request, response, handler, null);}}}
}

3、AbstractAnnotationConfigDispatcherServletInitializer类

是 WebApplicationInitializer 接口的一个抽象实现,
可以通过继承 AbstractAnnotationConfigDispatcherServletInitializer 类,并重写其中的方法,来实现自定义的初始化配置,不需要传统的 web.xml 文件
Spring Boot 提供了自动配置机制,会自动配置 Spring MVC 环境,包括注册 DispatcherServlet、处理器映射器、处理器适配器、视图解析器等,无需手动配置。

// 简化版
public abstract class AbstractAnnotationConfigDispatcherServletInitializerimplements WebApplicationInitializer {@Overridepublic void onStartup(ServletContext servletContext) throws ServletException {// 创建根上下文AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();Class<?>[] rootConfigClasses = getRootConfigClasses();if (rootConfigClasses != null && rootConfigClasses.length > 0) {rootContext.register(rootConfigClasses);}// 创建 DispatcherServlet 上下文AnnotationConfigWebApplicationContext servletContext = new AnnotationConfigWebApplicationContext();Class<?>[] servletConfigClasses = getServletConfigClasses();if (servletConfigClasses != null && servletConfigClasses.length > 0) {servletContext.register(servletConfigClasses);}// 注册 DispatcherServletDispatcherServlet dispatcherServlet = new DispatcherServlet(servletContext);ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", dispatcherServlet);dispatcher.addMapping(getServletMappings());// 添加额外的配置customizeRegistration(dispatcher);}// 用于配置 Spring 根上下文(即应用程序上下文)的配置类protected abstract Class<?>[] getRootConfigClasses();// 用于配置 DispatcherServlet 的上下文(即 Web 上下文)的配置类protected abstract Class<?>[] getServletConfigClasses();// 用于配置 DispatcherServlet 的映射protected abstract String[] getServletMappings();protected void customizeRegistration(ServletRegistration.Dynamic registration) {}
}
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[] { RootConfig.class };}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[] { ServletConfig.class };}@Overrideprotected String[] getServletMappings() {return new String[] { "/" };}
}

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

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

相关文章

Linux 安装k8s

官网 常见的三种安装k8s方式 1.kubeadm 2.kops&#xff1a;自动化集群制备工具 3.kubespray&#xff1a; 提供了 Ansible Playbook 下面以kubeadm安装k8s kubeadm的安装是通过使用动态链接的二进制文件完成的&#xff0c;目标系统需要提供 glibc ##使用 ss 或者 netstat 检测端…

搞流量,就这点事!

资产还是负债&#xff1f;赚钱之前想明白&#xff01; 如果说你有一个产品&#xff0c;大概率的情况是&#xff0c;如果产品被更多人看到&#xff0c;那么最终购买的人也会多一些。结果就是&#xff0c;你的利润更多。所以&#xff0c;在产品没问题的情况下&#xff0c;流量越多…

【学习心得】响应数据加密的原理与逆向思路

一、什么是响应数据加密&#xff1f; 响应数据加密是常见的反爬手段的一种&#xff0c;它是指服务器返回的不是明文数据&#xff0c;而是加密后的数据。这种密文数据可以被JS解密进而渲染在浏览器中让人们看到。 它的原理和过程图如下&#xff1a; 二、响应数据加密的逆向思路 …

MATLAB 绘制带填充配色的雷达图--附案例代码

MATLAB 绘制带填充配色的雷达图 目录 MATLAB 绘制带填充配色的雷达图摘要1. 准备数据2. 绘制雷达图3. 设置填充颜色4. 案例代码及结果4. 结语 摘要 在MATLAB 中&#xff0c;可以使用多种方式绘制美观的雷达图。本文将介绍如何通过详细案例和代码说明&#xff0c;在MATLAB中绘制…

【LeetCode-中等】33.搜索旋转排序数组 - 二分法

力扣题目链接 思路&#xff1a; 数组按升序排序&#xff0c;时间复杂度要求O(log n) -> 二分法数组经过未知旋转 -> 数组部分有序 -> mid一定会将数组分为有序和无序的两部分 -> 通过比较 nums[left] 和 nums[mid] 的大小判断哪部分数组是有序的 -> 判断 targ…

MCU设计--M3内核整体功能说明

整体架构 内核特性 CM3内核支持3级流水哈佛结构 &#xff1a;数据和指令隔离Blanked SP &#xff1a;两个堆栈&#xff0c;一个堆栈只允许系统操作&#xff0c;另一个堆栈开放给用户。Handler and Thread modes低延迟中断进入和退出支持非对齐操作 嵌套中断向量 最大支持1-240…

前端+php:实现提示框(自动消失)

效果 php部分&#xff1a;只展示插入过程 <?php//插入注册表中$sql_insert "INSERT INTO regist_user(userid,password,phone,email)VALUES (" . $_POST[UserID] . "," . CryptPass($_POST[Password]) . "," . $_POST[Phone] . ",&qu…

【AI视野·今日NLP 自然语言处理论文速览 第八十期】Fri, 1 Mar 2024

AI视野今日CS.NLP 自然语言处理论文速览 Fri, 1 Mar 2024 Totally 67 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Loose LIPS Sink Ships: Asking Questions in Battleship with Language-Informed Program Sampling Authors G…

docker ubuntu20.04 安装教程

ubuntu20.04 安装 docker 教程 本博客测试安装时间2023.8月 一、docker安装内容&#xff1a;docker Engine社区版 和 docker Compose 二、安装环境&#xff1a;ubuntu20.04 三、安装步骤&#xff1a; # 如果已经安装过docker&#xff0c;请先卸载&#xff0c;没安装则跳过…

从零开始学习Netty - 学习笔记 -Netty入门【协议设计和解析】

2.协议设计和解析 协议 在计算机中&#xff0c;协议是指一组规则和约定&#xff0c;用于在不同的计算机系统之间进行通信和数据交换。计算机协议定义了数据传输的格式、顺序、错误检测和纠正方法&#xff0c;以及参与通信的各个实体的角色和责任。计算机协议可以在各种不同的层…

探索云原生世界:Spring Cloud全方位解读——构建微服务架构的利器

目录 一、微服务简介 二、微服务发展史 三、Spring Cloud 3.1 Spring Cloud 版本策略 3.2 Spring Cloud 发展历程 微服务是一种软件架构风格&#xff0c;将单一应用程序拆分成一组小型、独立的服务。每个服务运行在自己的进程中&#xff0c;服务之间采用轻量级通信机制进行交…

Open3D 进阶(21)无序点云平面检测的鲁棒统计方法

目录 一、算法原理1、算法过程2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、算法过程 除了寻找具有最大支持的单个平面外,Open3D还包含一个算法,该算法使…

【Java EE初阶二十九】Linux 系统的学习

当前写的博客系统程序,只是部署在咱们自己的电脑上,其他用户是无法直接访问的.由于 NAT 机制的存在,导致了IP 地址就被分成了 内网 IP 和 外网 IP. 云服务器,包括公司中使用专用服务器,一般都是 Linux 系统&#xff0c;这个系统的使用和 Windows 差异很大.(通过命令行来操作的系…

Jupyter Notebook的安装和使用(windows环境)

一、jupyter notebook 安装 前提条件&#xff1a;安装python环境 安装python环境步骤&#xff1a; 1.下载官方python解释器 2.安装python 3.命令行窗口敲击命令pip install jupyter 4.安装jupyter之后&#xff0c;直接启动命令jupyter notebook,在默认浏览器中打开jupyte…

SQL教学:掌握MySQL数据操作核心技能--DML语句基本操作之“增删改查“

大家好&#xff0c;今天我要给大家分享的是SQL-DML语句教学。DML&#xff0c;即Data Manipulation Language&#xff0c;也就是我们常说的"增 删 改 查"&#xff0c;是SQL语言中用于操作数据库中数据的一部分。作为MySQL新手小白&#xff0c;掌握DML语句对于数据库数…

测试环境搭建整套大数据系统-问题篇(一:实时遇到的问题)

1. java.io.IOException: Failed to deserialize JSON ‘{“age”:867,“sex”:“fba8c074f9”,“t_insert_time”:“2024-03-04 14:12:24.821”}’ 解决方式 修改数据类型。将TIMESTAMP_LTZ改为TIMESTAMP。 2. java. lang,classNotFoundException: org,apache.flink,streami…

典中典之西电A测-气压测控仿真系统

兄弟,如果你看到这篇,只能说明你A测也挂了,没办法,哥们太菜了,抄的太假过不了你电有些老师的慧眼 这坨&#x1f415;⑩我先吃为敬 环境搭建可以参考这个兄弟的博客 一、题目要求 实现功能&#xff1a;使用 Arduino UNO 微控制器&#xff0c;搭建一个 PC 上位机远程气压检测控…

账号管理支持批量测试资产可连接性,资产管理支持通过标签方式选择资产,JumpServer堡垒机v3.10.4 LTS版本发布

2024年3月4日&#xff0c;JumpServer开源堡垒机正式发布v3.10.4 LTS版本。JumpServer开源项目组将对v3.10 LTS版本提供长期的支持和优化&#xff0c;并定期迭代发布小版本。欢迎广大社区用户升级至v3.10 LTS最新版本&#xff0c;以获得更佳的使用体验。 在v3.10.4 LTS版本中&a…

spring-smart-di 动态切换接口源

0、背景 一般我们系统同一个功能可能会对接多个服务商&#xff0c;防止某个服务商的服务不可用快速切换或者收费不同需要切换&#xff0c;那我们一般做快速切换逻辑传统无非就是先将每个服务商实现&#xff0c;然后在配置点&#xff08;数据库或者nacos&#xff09;配置当前正…

ChromeDriver全版本下载教程

确定自己的Chrome版本 step1. 打开Chrome浏览器右上角的三个点&#xff0c;再点击设置 step2. 在设置中点击“关于Chrome”&#xff0c;圈起来的红框即为当前Chrome版本&#xff0c;我的版本就是121.0.6167.185 在json中查找自己对应ChromeDriver版本下载链接 一般教程会让你…