SpringMVC源码分析(二)
程序员文章站
2024-03-06 16:04:26
...
这一篇记录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,最终结果是客户端使用了缓存。