欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringMVC源码分析(二)

程序员文章站 2024-03-06 16:04:26
...
这一篇记录springmvc的执行过程

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

SpringMVC源码分析(二)
上面四个红框中是几个比较中的方法,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,最终结果是客户端使用了缓存。

相关标签: springmvc执行过程