当前位置: 首页 > news >正文

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[] { "/" };}
}

相关文章:

SpringMVC之DispatcherServlet组件

目录 一、SpringMVC的核心处理流程二、DispatcherServlet1、init()方法2、doDispatch()方法3、AbstractAnnotationConfigDispatcherServletInitializer类 一、SpringMVC的核心处理流程 请求到达 DispatcherServlet DispatcherServlet 的请求处理&#xff1a; DispatcherServlet…...

抢商家、夺用户、比低价,抖音、快手、小红书“奇招尽出”

随着流量红利逐渐消退&#xff0c;国内电商平台之间互相内卷已成为了行业常态&#xff0c;而无论是在该领域深耕已久的淘宝、京东、拼多多等电商巨头&#xff0c;还是新跨界而来的抖音、快手、小红书等电商新秀都在不断地进行创新&#xff0c;以便为商家提供更好的服务&#xf…...

ChatGPT引领的AI面试攻略系列:AI全栈工程师篇

系列文章目录 AI全栈工程师&#xff08;本文&#xff09; 文章目录 系列文章目录一、前言二、面试题1. 基础理论与数据处理2. 机器学习3. 深度学习4. 大模型与迁移学习5. 计算机视觉6. 自然语言处理&#xff08;NLP&#xff09;7. 多模态学习8. AI生成内容&#xff08;AIGC&am…...

上位机图像处理和嵌入式模块部署(qmacvisual配置)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们谈到了qmacvisual的编译、验证码、用户登录以及流程的编辑&#xff0c;这部分都是基础工作。事实上&#xff0c;除了这些内容之外&#xf…...

EXPLAIN PLAN FOR:在Oracle中生成执行计划

目录 案例 解析 Operation类型 在Oracle中&#xff0c;可以使用 EXPLAIN PLAN FOR 命令来生成执行计划&#xff0c;然后通过 SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY(PLAN_TABLE))来查看执行计划。需要注意的是&#xff0c;这两个命令需要在同一个窗口下运…...

蓝桥杯 9241.飞机降落

这道题本来作者以为是可以用一些小技巧进行暴力解法的&#xff0c;但是后来试了一下&#xff0c;不能过去全部数据。 下面是对半个的题解&#xff1a; #include<iostream> #include<stdio.h> #include<cstring> #include<cstdlib> #include<cmath…...

数据可视化原理-腾讯-散点图

在做数据分析类的产品功能设计时&#xff0c;经常用到可视化方式&#xff0c;挖掘数据价值&#xff0c;表达数据的内在规律与特征展示给客户。 可是作为一个产品经理&#xff0c;&#xff08;1&#xff09;如果不能够掌握各类可视化图形的含义&#xff0c;就不知道哪类数据该用…...

深度学习-Pytorch实现经典AlexNet网络:山高我为峰

深度学习-Pytorch实现经典AlexNet网络之山高我为峰 深度学习中&#xff0c;经典网络引领一波又一波的技术革命&#xff0c;从LetNet到当前最火的GPT所用的Transformer&#xff0c;它们把AI技术不断推向高潮。2012年AlexNet大放异彩&#xff0c;它把深度学习技术引领第一个高峰…...

25考研习题记录

3月 汤家凤《1800》 基础篇 日期高等数学线性代数概率论3.1 P92-93 P212-214 3.4 P10-15 P10-19 极限题62题 P73-74 P170-172 行列式17题 考研竞赛凯哥每日一题 张宇高数30讲页数3.4P74...

上海计算机学会 2023年12月月赛 丙组T4 迷宫(宽度优先搜索)

第四题&#xff1a;T4迷宫 标签&#xff1a;宽度优先搜索题意&#xff1a;给定 n n nx m m m由 # \# #&#xff08;墙&#xff09;、 . . .&#xff08;空地&#xff09;组成的地图&#xff0c;求从左上角到右下角的最少步数&#xff0c;每次只允许上下左右移动一格&#xff0…...

【Boost搜索引擎项目】Day1 项目介绍+去标签和数据清洗框架搭建

&#x1f308;欢迎来到C项目专栏 &#x1f64b;&#x1f3fe;‍♀️作者介绍&#xff1a;前PLA队员 目前是一名普通本科大三的软件工程专业学生 &#x1f30f;IP坐标&#xff1a;湖北武汉 &#x1f349; 目前技术栈&#xff1a;C/C、Linux系统编程、计算机网络、数据结构、Mysq…...

站群服务器需要多大内存

站群服务器的内存需求取决于网站的数量和流量&#xff0c;以及服务器需要运行的应用和服务。RAKsmart小编为您整理发布站群服务器需要多大内存以及站群服务器内存需求的考虑因素。 站群服务器是一种用于托管多个网站的服务器&#xff0c;通常用于搜索引擎优化(SEO)和网络内容管…...

HTB Perfection

Perfection User Namp ┌──(kali㉿kali)-[~/HTB/machine/Perfection] └─$ nmap -A 10.129.226.58 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-03-03 21:10 EST Nmap scan report for 10....

如何远程连接MySQL数据库?

在现代互联网时代&#xff0c;远程连接MySQL数据库成为了许多开发者和管理员必备的技能。这不仅方便了数据的共享和管理&#xff0c;还可以使多个团队在全球范围内协同工作。本文将介绍如何通过天联组网实现远程连接MySQL数据库&#xff0c;并实现高效的信息远程通信。 天联组网…...

【 HTML 及浏览器 】前端跨页面通信

前端跨页面通信&#xff1a;连接分散界面的纽带 在构建复杂的前端应用时&#xff0c;我们常常需要在不同的页面之间进行数据通信。无论是同源页面还是非同源页面&#xff0c;通信机制都是实现多页面数据同步和交互的关键。本文将探讨各种前端跨页面通信的方法&#xff0c;并提…...

内存安全的编程语言

美国政府新颁布《回归基础构件&#xff1a;通往安全软件之路》 《回归基础构件&#xff1a;通往安全软件之路》中&#xff0c;白宫国家网络主任办公室&#xff08;ONCD&#xff09;呼吁开发者使用「内存安全的编程语言」 内存安全的编程语言 根据NSA的建议&#xff0c;内存…...

Excel常用公式总结非常实用

16个最实用的Excel万能公式 1、多条件判断 IF(And(条件1,条件2..条件N),条件成立返回值) IF(or(条件1,条件2..条件N),条件成立返回值) 2、多条件查找 Lookup(1,0/((条件1*条件2*...条件N)),返回值区域&#xff09; 3、多条件求和 Sumifs(值区域,判断区域1,条件1,判断区域2,条…...

window路径特殊字符解决

官方定义命名规范 https://learn.microsoft.com/zh-cn/windows/win32/fileio/naming-a-file 重点 1.目录规范 特殊字符以空格 与点.开头结尾 2.文件规范 特殊字符以空格 与点.开头结尾NUL、COM等文件 解决方案 字符标点符号实际上在字符集定义中有一个很有趣的现象&…...

『大模型笔记』RAG 系统开发中的12大痛点及解决方案

RAG 系统开发中的12大痛点及解决方案 文章目录 问题引入一. 痛点 1:缺失内容1.1. 数据清洗的重要性1.2. 精心设计的提示(Prompt)有助于提高准确性二. 痛点 2:关键文档被遗漏2.1. 通过调整 chunk_size 和 similarity_top_k 参数优化检索效果2.2. 检索结果的优化排序三. 痛点…...

VScode---php环境搭建

文章目录 1.下载php Dehug;php server2.下载php环境3.配置环境变量5.配置php.ini文件6.设置vscode6.测试遇到的问题 1.下载php Dehug;php server 2.下载php环境 下载地址&#xff1a;https://www.php.net/downloads.php 3.配置环境变量 C:\Users\hacker>php -v PHP 8.3.3 (…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...