基础知识
springMvc的执行关键在是在DispatcherServlet类里面,该类继承了Servlet,在Servlet类上做了扩展。springmvc执行流程也是由DispatcherServlet类来管理控制。DispatcherServlet包括了springmvc处理请求中所需要的九大组件。
- MultipartResolver:用来解析文件的解析器;(常用)
- localeResolver:位置解析器;
- themeResolver:主题解析器;
- HandlerMapping:处理器映射器,使用list存储;(常用)
- HandlerAdapter:处理器适配器,使用list存储;(常用)
- HandlerExceptionResolver:异常解析器,使用list存储;(常用)
- RequestToViewNameTranslator:获取view视图名;
- FlashMapManager:重定向使用;
- ViewResolver:视图解析器;
执行流程
-
请求第一步会请求到DispatcherServlet中的doService中,在doService中会调用doDispatch方法。doDispatch方法中会执行一下操作。
-
检查当前的请求是不是文件类型,如果是则通过multipartResolver的resolveMultipart方法对request进行处理。
-
遍历HandlerMappings,通过请求url获取到对应的处理器执行链(包含handler跟过滤器链)
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception { if (this.handlerMappings != null) { for (HandlerMapping mapping : this.handlerMappings) { HandlerExecutionChain handler = mapping.getHandler(request); if (handler != null) { return handler; } } } return null; }
-
通过上一步获取到处理器执行链中的handler去遍历HandlerAdaptors获取handlerAdaptor(这里使用了适配器模式)
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException { if (this.handlerAdapters != null) { for (HandlerAdapter adapter : this.handlerAdapters) { if (adapter.supports(handler)) { return adapter; } } } throw new ServletException("No adapter for handler [" + handler + "]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler"); }
-
执行处理器执行链的applyPreHandle方法,执行拦截器链。(过滤器在此处执行,而拦截器则是在doService之前执行)
boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception { for (int i = 0; i < this.interceptorList.size(); i++) { HandlerInterceptor interceptor = this.interceptorList.get(i); if (!interceptor.preHandle(request, response, this.handler)) { triggerAfterCompletion(request, response, null); return false; } this.interceptorIndex = i; } return true; }
-
通过handlerAdaptor执行相应的handler(也就是controller中的方法),执行完成后会返回一个modelAndView对象
-
执行完上一步后,执行执行器处理链的applyPostHandle方法,执行拦截器链。
-
将视图交给视图解析器(viewResolver)进行解析,并返回一个view对象
protected View resolveViewName(String viewName, @Nullable Map<String, Object> model, Locale locale, HttpServletRequest request) throws Exception { if (this.viewResolvers != null) { for (ViewResolver viewResolver : this.viewResolvers) { View view = viewResolver.resolveViewName(viewName, locale); if (view != null) { return view; } } } return null; }
-
最后调用view对象的render方法,将返回写入到response中返回给客户端。