1.1 spring-webmvc之HandlerAdapter
写在框架之前:
tomcat 内部建立连接,组装request等信息后,servlet容器的标准最重要的开始
StandardWrapperValve#invoke(Request request, Response response)
ApplicationFilterChain filterChain =ApplicationFilterFactory.createFilterChain(request, wrapper, servlet);
org.apache.catalina.core.ApplicationFilterChain#doFilter
ApplicationFilterConfig filterConfig = filters[pos++];
Filter filter = filterConfig.getFilter();
filter.doFilter(request, response, this);//递归调用下一个过滤器,这种方式可以实现过滤器后置
servlet.service(request, response);//servlet对一次请求有且唯一的一个,是在filterChain的后面部分调用,但因为过滤器链的递归模式,过滤器可以做到在servlet之后执行;
正文:
1:最主要父类FrameworkServlet完成了spring和servlet的整合功能,并托管所有请求到核心类DispatcherServlet的doService方法,在该类中,完成了request和response的threadLocal绑定,后续可通过RequestContextHolder的静态方法获取当前请求的request和response。
2:核心类DispatcherServlet,此类在spring-boot未兴起之前,需要配置到web.xml中,Servlet是最短路径匹配,/匹配所有,并且会选一个最匹配的Servlet执行(只会有一个Servlet会执行,不以申明顺序未为准),过滤器是完整路径匹配,/*匹配所有,每一个过滤器按申明顺序执行,在任一过滤器中可以断路。
2.1:初始化组件
protected void initStrategies(ApplicationContext context) { initMultipartResolver(context);//文件处理器 initLocaleResolver(context);//国际化处理器 initThemeResolver(context);//主题处理器,常用在页面多主题样式 initHandlerMappings(context); initHandlerAdapters(context); initHandlerExceptionResolvers(context); initRequestToViewNameTranslator(context); initViewResolvers(context); initFlashMapManager(context); }
2.2:主要处理逻辑:
文件处理(忽略);
HandlerExecutionChain mappedHandler=getHandler(processedRequest)//RequestMappingHandlerMapping,另两种默认的从来没用到过,mappedHandler=handler(HandlerMethod)+interceptorList (拦截器为spring定义的专有概念,和servlet规范无关)
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
RequestMappingHandlerAdapter匹配HandlerMethod(对应controller#method)
if (!mappedHandler.applyPreHandle(processedRequest, response)) {(返回false则短路)
核心方法:mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
即为适配器做一个运行环境,执行controller#method
mappedHandler.applyPostHandle(processedRequest, response, mv);
将结果+异常及各个变量做response相应:
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
处理逻辑主要就是有异常,用initHandlerExceptionResolvers定义的异常处理器处理,主要为HandlerExceptionResolverComposite处理
以下为默认的组件:
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\ org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,\ org.springframework.web.servlet.function.support.RouterFunctionMapping org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\ org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\ org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter,\ org.springframework.web.servlet.function.support.HandlerFunctionAdapter org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\ org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\ org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager