spring mvc DispatcherServlet原理解析

Spring-MVC的原理和代码实现 一:Spring-MVC原理分析: spring-mvc原理图: 名词解析: Browser :浏览器(电脑客户端)。 Phone :手机客户端。 Servlet :用JAVA程序编写的后端服务器。 JavaBean :Bean工厂,创建管理对象。 (entity:实体类;service:服务层类;dao:接口层类) DB... 阅读详情

spring mvc DispatcherServlet原理及源码解析

首先先讲一下servlet

Servlet 是什么?

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上
的数据库或应用程序之间的中间层。
使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
Java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。但是相比于 CGI,Servlet 有以下几点优势:

  • 性能明显更好。
  • Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。
  • Servlet 是独立于平台的,因为它们是用 Java 编写的。
    服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。
  • Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。

Servlet 架构

在这里插入图片描述

Servlet 任务

  • 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
  • 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
  • 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
  • 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
  • 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。

Servlet 生命周期

  • Servlet 通过调用 init () 方法进行初始化。
  • Servlet 调用 service() 方法来处理客户端的请求。
  • Servlet 通过调用 destroy() 方法终止(结束)。
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

其他servlet内容可以查看servlet教程

spring mvc

spring mvc原理

springmvc 是围绕 DispatcherServlet 而设计的,而DispatcherServlet是一个servlet的子类,所以springmvc依赖servlet来进行mvc的实现。

通过swagger的使用来进行DispatcherServlet类的源码解析

项目源码地址

项目主要使用knife4j对swagger2的一个增强项目来实现swagger的功能,http server 是 tomcat 9。

Dispatcher分析
类图

继承类图

继承结构
结合两图可以看到
顶层接口类是 Servlet定义了如图1-1的方法,根据servlet的生命周期可以知道在实际http请求时http server调用的时service方法,debug模式下看线程栈图1-2发现从tomcat服务调用了DispatcherServlet类的service的方法最终在HttpServlet类中找到了实现类

 @Override
    public void service(ServletRequest req, ServletResponse res)
        throws ServletException, IOException {

        HttpServletRequest  request;
        HttpServletResponse response;

        try {
        	// 强转类型
            request = (HttpServletRequest) req;
            response = (HttpServletResponse) res;
        } catch (ClassCastException e) {
            throw new ServletException(lStrings.getString("http.non_http"));
        }
        调用service方法
        service(request, response);
    }

在ds父类FrameworkServlet找到service方法

@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		HttpMethod httpMethod = HttpMethod.resolve(request.getMethod());
		//根据http请求方法进行不同处理
		if (httpMethod == HttpMethod.PATCH || httpMethod == null) {
			processRequest(request, response);
		}
		else {
		//调用父类service方法
			super.service(request, response);
		}
	}

调用到HttpServlet的service方法

protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

        String method = req.getMethod();

        if (method.equals(METHOD_GET)) {
        	// 默认实现为返回-1,所以如果时get请求直接就走了doGet方法,不会走else判断逻辑。
            long lastModified = getLastModified(req);
            if (lastModified == -1) {
                // servlet doesn't support if-modified-since, no reason
                // to go through further expensive logic
                //调用doGet方法
                doGet(req, resp);
            } else {
                long ifModifiedSince;
                try {
                    ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
                } catch (IllegalArgumentException iae) {
                    // Invalid date header - proceed as if none was set
                    ifModifiedSince = -1;
                }
                if (ifModifiedSince < (lastModified / 1000 * 1000)) {
                    // If the servlet mod time is later, call doGet()
                    // Round down to the nearest second for a proper compare
                    // A ifModifiedSince of -1 will always be less
                    maybeSetLastModified(resp, lastModified);
                    doGet(req, resp);
                } else {
                    resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                }
            }

        } else if (method.equals(METHOD_HEAD)) {
            long lastModified = getLastModified(req);
            maybeSetLastModified(resp, lastModified);
            doHead(req, resp);

        } else if (method.equals(METHOD_POST)) {
            doPost(req, resp);

        } else if (method.equals(METHOD_PUT)) {
            doPut(req, resp);

        } else if (method.equals(METHOD_DELETE)) {
            doDelete(req, resp);

        } else if (method.equals(METHOD_OPTIONS)) {
            doOptions(req,resp);

        } else if (method.equals(METHOD_TRACE)) {
            doTrace(req,resp);

        } else {
            //
            // Note that this means NO servlet supports whatever
            // method was requested, anywhere on this server.
            //

            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[1];
            errArgs[0] = method;
            errMsg = MessageFormat.format(errMsg, errArgs);

            resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
        }
    }

  protected long getLastModified(HttpServletRequest req) {
        return -1;
    }

如果是get请求类型则调用doGet方法,因为ds类不存在doget方法则调用父类的默认实现即 FrameworkServlet,然后调用doService方法,子类实现所以调用到了ds中的doService方法。

@Override
	protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
		logRequest(request);

		// Keep a snapshot of the request attributes in case of an include,
		// to be able to restore the original attributes after the include.
		Map<String, Object> attributesSnapshot = null;
		if (WebUtils.isIncludeRequest(request)) {
			attributesSnapshot = new HashMap<>();
			Enumeration<?> attrNames = request.getAttributeNames();
			while (attrNames.hasMoreElements()) {
				String attrName = (String) attrNames.nextElement();
				if (this.cleanupAfterInclude || attrName.startsWith(DEFAULT_STRATEGIES_PREFIX)) {
					attributesSnapshot.put(attrName, request.getAttribute(attrName));
				}
			}
		}

		// Make framework objects available to handlers and view objects.
		request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
		request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
		request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
		request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());

		if (this.flashMapManager != null) {
			FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
			if (inputFlashMap != null) {
				request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
			}
			request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
			request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
		}

		try {
			doDispatch(request, response);
		}
		finally {
			if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
				// Restore the original attribute snapshot, in case of an include.
				if (attributesSnapshot != null) {
					restoreAttributesAfterInclude(request, attributesSnapshot);
				}
			}
		}
	}

设置请求属性,然后调用doDispatch方法

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
		HttpServletRequest processedRequest = request;
		HandlerExecutionChain mappedHandler = null;
		boolean multipartRequestParsed = false;

		WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

		try {
			ModelAndView mv = null;
			Exception dispatchException = null;

			try {
				// 根据content-type来进行组装流程的请求
				processedRequest = checkMultipart(request);
				
				multipartRequestParsed = (processedRequest != request);

				// Determine handler for the current request.
				根据流程请求,获取映射器处理器
				mappedHandler = getHandler(processedRequest);
				if (mappedHandler == null) {
					noHandlerFound(processedRequest, response);
					return;
				}

				// Determine handler adapter for the current request.
				HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

				// Process last-modified header, if supported by the handler.
				String method = request.getMethod();
				boolean isGet = "GET".equals(method);
				if (isGet || "HEAD".equals(method)) {
					long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
					if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
						return;
					}
				}
				// 如果当前请求流程存在拦截器的PreHandle方法则进行拦截,其中自定义的拦截器需要实现HandlerInterceptor重写preHandle方法,并加入到InterceptorRegistry注册器中如代码5-5
				if (!mappedHandler.applyPreHandle(processedRequest, response)) {
					return;
				}

				// Actually invoke the handler.
				//处理器适配器根据流程请求和处理器映射器进行处理,根据不同处理器映射器进行不同处理,静态资源文件通过将资源数组写入response,写回前端。如果是接口资源则解析参数,反射调用接口方法后返回mv。
				mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

				if (asyncManager.isConcurrentHandlingStarted()) {
					return;
				}

				applyDefaultViewName(processedRequest, mv);
			// 拦截器中的postHandle方法	mappedHandler.applyPostHandle(processedRequest, response, mv);
			}
			catch (Exception ex) {
				dispatchException = ex;
			}
			catch (Throwable err) {
				// As of 4.3, we're processing Errors thrown from handler methods as well,
				// making them available for @ExceptionHandler methods and other scenarios.
				dispatchException = new NestedServletException("Handler dispatch failed", err);
			}
			//处理结果,方法内进行triggerAfterCompletion对afterCompletion方法进行拦截
			processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
		}
		catch (Exception ex) {
			triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
		}
		catch (Throwable err) {
			triggerAfterCompletion(processedRequest, response, mappedHandler,
					new NestedServletException("Handler processing failed", err));
		}
		finally {
			if (asyncManager.isConcurrentHandlingStarted()) {
				// Instead of postHandle and afterCompletion
				if (mappedHandler != null) {
					mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
				}
			}
			else {
				// Clean up any resources used by a multipart request.
				if (multipartRequestParsed) {
					cleanupMultipart(processedRequest);
				}
			}
		}
	}
@Nullable
	protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
		if (this.handlerMappings != null) {
			//图2-1
			for (HandlerMapping mapping : this.handlerMappings) {
				HandlerExecutionChain handler = mapping.getHandler(request);
				if (handler != null) {
					return handler;
				}
			}
		}
		return null;
	}

图2-1
处理器映射器返回结果如图2-2,报含处理器和拦截器列表
图2-2
代码5-5

@Configuration
public class TestInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("this is preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("this is postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("this is afterCompletion");
    }
}

@Configuration
public class InterceptorConfig {
    @Autowired
    private TestInterceptor testInterceptor;

    @Bean
    public WebMvcConfigurer WebMvcConfigurer() {
        return new WebMvcConfigurer() {
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(testInterceptor).addPathPatterns("/user/**");
            }
        };
    }
}
Spring MVC介绍(一)之 Spring MVC体系结构与执行流程 Spring MVC介绍(一)之 MVC 体系结构与执行流程 Spring MVC是Spring的一个模块,包含Web MVC、Framework,Web Views,JSP等等。 其中MVC分别对应:Model,View,Controller,本质上SpirngMVC还是使用Servlet进行处理,并在其基础上进行了封装,简化了开发流程,提高易用性,并使得逻辑结构变得非常清晰。 Spring... 阅读详情

相关推荐

Spring MVC 自定义参数解析器

Spring MVC 自定义参数处理器SpringMVCDispatcherServletRequestMappingHandlerAdapterRequestResponseBodyMethodProcessor自定义解析器RequestParamMethodPropertiesBodyArgumentConvertObjectResolver配置测试Maven信息 SpringMVC spri...

guanzhengyinqin的博客 4248

SpringMVC的Dispatcher

1.Spring的web框架围绕DispatcherServlet设计。 以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类)。 借用B站狂神的流程图(其中实现全部是框架给我们做的,我们只需要补充虚线的流程就好。) SpringMVC是Spring中的模块,它实现了mvc设计模式的web框架,首先用户发出请求,请求到达SpringMVC的前端控制器(DispatcherServlet),

weixin_45066790的博客 932

减小伺服电机共振的方法(以松下伺服为例)

嘿 ! 我是【小黄】 , 我们又见面啦 !!! 毕竟技术只有大家交流才会进步嘛 ! 这博客是对自己学习的一点点记录和总结 ,如果您对自动控制感兴趣的话 ,可以关注一下我的动态 , 我们一起学习呀 ! 我们都还年轻 ,我们还有无限可能 。 YES ! 减小伺服电机共振的方法(以松下伺服为例)1. 准备工作:1.1.1 如何推定共振点:1.1.2 测定实操:1.1.3 总结:2. 下期预告: 在我们调试完伺服参数以后机器人运动到某个特定位置会产生振动或异响,我们要做的就是消除这个异响保..

在下小黄的博客 1万+

深入理解 Spring MVC:DispatcherServlet 与视图解析机制​

本文通过源码级分析深入剖析SpringMVC中DispatcherServlet的核心工作流程,详解请求处理的两大关键阶段:处理器调用与视图渲染。重点解析ViewResolver和View接口的设计原理,并提供自定义视图实现的完整方案,揭示SpringMVC框架扩展性的底层机制,帮助开发者深入理解MVC架构的核心思想

m0_73941339的博客 1486

【AI+教育】别再让 Cursor 只当编辑器了!4 步解锁 Claude 官方技能!

本文介绍了在Windows环境下通过OpenSkills工具在Cursor中调用Claude AI技能的方法。主要内容包括:1)安装Node.js环境;2)全局安装OpenSkills工具;3)安装Claude官方技能库;4)通过AGENTS.md文件同步技能;5)在Cursor中直接调用技能完成Excel、PPT等任务。文章提供了详细的操作步骤和示例,帮助用户快速上手使用AI技能提升工作效率。

奶爸的编程之路,也就一周冷个三天 753

大语言模型(LLM)在组合优化中的新突破:LLM-LNS与FunSearch性能对比

本文深入探讨了大语言模型(LLM)在组合优化中的创新应用,重点对比了LLM-LNS与FunSearch两种方法的性能差异。研究表明,LLM-LNS在物流路径规划、资源调度等场景中展现出显著优势,其双层自演化架构能有效平衡探索与利用,相比传统方法提升效率约43%。文章还提供了实践选择指南,帮助开发者根据具体需求选用合适的技术方案。

weixin_42526415的博客 406

SpringMVC之DispatcherServlet组件

讲述了SpringMVC的核心处理流程以及DispatcherServlet组件

xiaoyu_alive的博客 1350

I2C总线原理及总线信号的实现

I2C总线是一种多主机总线,连接IIC总线上的器件分为主机和从机,主机有权发起和结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,I2C也具备冲突检测和仲裁的功能来防止错误产生;每个连接到IIC总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(同一时刻只能有一个主机),总线上的器件增加和删除不影响其他器件正常工作;I2C总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器;主要用于近距离(抗干扰能力稍弱),低速的芯片之间的通信(传输视频,带宽

YLG_lin的博客 3941

spring mvc概述及配置DispatcherServlet

spring mvc概述及配置DispatcherServlet 1.Spring mvc 基于model2实现,整体框架流程如  ①web容器接收到http请求,若匹配DispatcherServlet的请求映射路径(web.xml),则容器会交给DispatcherServlet处理。   ②DispatcherServlet根据请求的信息及handlerMappin

wangqiankun2010的专栏 808

Vue3+uniapp开发必备:5分钟搞定unplugin-auto-import自动导入配置(附常见报错解决)

本文详细介绍了在Vue3+uniapp项目中配置unplugin-auto-import插件实现自动导入的方法。通过该配置,开发者无需手动导入ref、onLoad等常用API,可显著提升编码效率和团队协作规范性。文章提供了从安装、TypeScript集成到高级用法的完整指南,并附带了常见报错的解决方案。

weixin_29008805的博客 961

【Zabbix实战之部署篇】Docker部署Zabbix+grafana监控平台

【Zabbix实战之部署篇】docker部署Zabbix+grafana监控平台

jks212454的博客 2577

SpringMVC中DispatcherServlet详解

DispatcherServlet是Spring MVC框架的核心组件之一,它负责请求的接收、处理和响应。DispatcherServlet在整个请求处理过程中扮演着调度者的角色,将请求分发到相应的处理器进行处理,并将处理结果返回给客户端

技术人集结地 5282

SAP_FI模块_固定资产期初导入全流程(含导入代码)

SAP 期初导入资产主数据以及金额相关的操作全流程记录,包含了批导程序的代码,以及错误记录

风沙的博客 1405

Spring MVC 核心工作原理:DispatcherServlet 全流程深度解析

摘要:Spring MVC框架的核心Web模块DispatcherServlet贯穿应用启动到请求处理的全生命周期。本文从四个维度解析其工作原理:1)概述前端控制器模式的设计思想;2)详述DispatcherServlet的加载机制,包括Spring Boot自动配置与Tomcat注册流程;3)剖析请求处理流程,说明其协调多个功能组件完成请求解析、处理和响应的全链路机制;4)分析关键组件如HandlerMapping、HandlerAdapter等的作用及默认实现。理解这些机制是掌握Spring MVC核心

Debug日记的博客 1382

用 sapgenpse 把 SAPCRYPTOLIB 的 SNC 真正配通

摘要: 在SAP系统中配置SNC(Secure Network Communications)时,sapgenpse工具是关键,尤其在旧版本或组件缺乏图形化维护工具时。核心步骤包括安装SAP Cryptographic Library、创建PSE(Personal Security Environment)、生成运行凭据,并确保证书交换顺序正确。常见问题如RFC连接失败或握手错误,往往源于PSE创建或凭据配置不当。需特别注意SECUDIR目录设置、PSE身份管理(单一或独立PSE方案)、以及服务账号凭据的权

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 66

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【spring MVC】源码分析一 DispatcherServlet

  1. dispatcherServlet  1.1 DispatcherServlet 介绍  DispatcherServlet  是 HTTP 请求 的  处理器(handlers)和 控制器(controllers) 的 中央调度者,例如 web UI controller,或者是 其他的基于 Http 远程服务。调度已注册的 处理器 可以处理请求,提供方便的映射 以及 异常的处理...

lihuapiao的专栏 324

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

spring-boot源码解析之DispatcherServlet

DispatcherServlet

weixin_45594127的博客 1140

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spring MVC DispatcherServlet详解

一. DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。 DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下: 1、文件上传解析,如果请求类型是multipart将通过MultipartReso

lilun517735159的博客 580

Spring MVC 5 文档翻译与解析 —— DispatcherServlet解析

DispatcherServlet Spring MVC,像许多其他web框架,围绕前端控制器模式来设计, 具备一个中央Servlet,DispatcherServlet,它提供了一个 共享的请求处理算法, 而实际工作由可配置的委托组件执行。 这个模型非常灵活,支持多种多样的工作流。 Disp...

ciclzglq234200的博客 329

Spring Framework核心解析:DispatcherServlet工作原理与配置指南

在Java Web开发领域,Spring MVC框架凭借其优雅的设计和强大的功能成为了事实上的标准。作为Spring MVC的核心组件,DispatcherServlet承担着请求分发的关键角色。本文将深入剖析DispatcherServlet的工作原理,并通过具体示例展示其配置方法。 ## 一、DispatcherServlet概述 DispatcherServlet是Spring MVC框...

gitblog_01126的博客 615

说下对 Spring MVC 的理解? Spring MVC 具体的工作原理? SpringMVC 父子容器是什么知道吗?

Spring MVC 是基于 MVC 模式的 Web 框架,通过统一分发请求,借助找到并执行 Controller,再通过渲染视图;父子容器则是为了分离 Web 层与业务层 Bean 的管理,实现职责解耦与作用域隔离,让架构更清晰、可维护。理解这些,就能掌握 Spring MVC 的核心流程和设计思想,应对开发中的请求处理、分层解耦等问题。

weixin_43521001的博客 964

Spring中DispatcherServlet、WebApplicationContext和ServletContext的关系

理解DispatcherServlet、WebApplicationContext和ServletContext之间的关系对于深入理解Spring Web应用的工作原理至关重要。这种设计不仅提供了清晰的职责分离,还为开发灵活、可扩展的Web应用提供了坚实的基础。在Spring Web应用程序中,DispatcherServlet、WebApplicationContext和ServletContext是三个核心概念,它们之间的关系和交互对于理解Spring的工作原理至关重要。

five-five 995

MVC中的调度者 -- DispatcherServlet

3.1、DispatcherServlet作用 DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。具体请参考第二章的图2-1。 ...

choubaof72172的博客 187

spring mvc dispatcherServlet

1结构 dispatcherServlet继承FrameworkServlet,内部持有WebApplicationContext,所以具体Spring容器的功能 public DispatcherServlet(WebApplicationContext webApplicationContext) { super(webApplicationContext); this.setDispatchOptionsRequest(true); } 持有HandlerMa

weixin_41175789的博客 226

Spring MVC学习之二 DispatcherServlet如何处理请求

上一节我们知道了DispatcherServlet的初始化方法怎么调用后,接下来我们先看看下初始化时在initStrategies()都做了什么事情。其内部调用了9个init*()方法,这些方法基本上就是从context中取出对应的bean并赋值给DispatcherServlet对应的属性,例如此处只是简单的看下初始化,后续会进行详细的学习,请期待。Servlet的请求处理都是在doServic...

tony_java_2017的博客 4608

Spring 机制六: MVC 全链路源码解析:从 DispatcherServlet 到返回值解析(超硬核源码深度)

目标:自动解析 HeaderX-User-Id@Override@Override。

Java、Python、AI、前沿技术等领域的技术总结和经验分享。 5725
上一篇: jar:boot-demo/boot-demo-A/target/boot-demo-A-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/a.txt
下一篇: springmvc xml配置项目的改造执行过程
li_a_long
博客等级 码龄9年 1粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值