SpringMVC源码分析(二)

本文深入剖析SpringMVC的工作机制,从DispatcherServlet接收到HTTP请求开始,详细讲解了HandlerMapping、HandlerAdapter、ModelAndView等核心组件的作用及交互流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这一篇记录springmvc的执行过程

当客户端发起http请求到达容器时会分配指定的servlet,并执行servlet的service方法。在springmvc中,所有请求都会到达DispatcherServlet,同上一篇原理一样,DispatcherServlet中并没有service方法,而是其父类重写了HttpServlet中的service方法,最终调用了DispatcherServlet的doSerivice(),doservice对request设置一系列属性,最后执行了一个受保护的方法doDispatch。

在这里插入图片描述
上面四个红框中是几个比较中的方法,DispatcherServlet的执行流程就是这几个方法;

  • 首先根据request获取HandlerExecutionChain
    这里的mappedHandler是一个handler执行链HandlerExecutionChain,这个对象里面包含了要执行的拦截器以及处理器handler。而handler是HandlerMapping通过request获取的。
  • 根据获取到的handler(这里指的就是Controller)找到对应的HandlerAdapter
  • HandlerAdapter执行handler方法,执行处理返回一个ModelAndView
  • 最后执行后置处理,渲染ModelAndView。

这里贴一下几个组件的用途

  • HandlerMapping
    将请求与拦截器列表一起映射到处理程序,以 进行预处理和后期处理。映射基于某些标准,具体标准因HandlerMapping 实现而异。
    两个主要HandlerMapping实现是RequestMappingHandlerMapping (支持带@RequestMapping注释的方法)和SimpleUrlHandlerMapping (维护对处理程序的URI路径模式的显式注册)。
  • HandlerAdapter
    帮助DispatcherServlet调用映射到请求的处理程序,而不管实际如何调用该处理程序。例如,调用带注释的控制器需要解析注释。主要目的HandlerAdapter是保护DispatcherServlet这些细节。
总结:

springmvc的执行流程可以分为以下几个步骤:
1、DispatcherServlet根据request找到需要执行的HandlerExecutorChain,HandlerExecutorChain中包括了要执行的拦截器和Handler(Controller),而handler是HandlerMapping根据request找到
2.DispatcherServlet根据要执行的Handler(Controller)找到对应的HandlerAdapter
3、HandlerAdapter处理HandlerExecutorChain放回一个ModelAndView
4、渲染ModelAndView

上面代码中有一段


				// 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 (logger.isDebugEnabled()) {
						logger.debug("Last-Modified value for [" + getRequestUri(request) + "] is: " + lastModified);
					}
					if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
						return;
					}
				}

这里作用是对get请求最后一次修改时间进行判断,如果服务器端没有发生改变,直接return,最终结果是客户端使用了缓存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值