上一篇 <<<SpringMVC运行流程
下一篇 >>>过滤器与拦截器的区别
SpringMVC核心的就是DispatcherServlet,所有的请求都会转发到DispatcherServlet,然后在通过DispatcherServlet执行具体的控制层(Handler) 返回modelAndView给客户端视图展示。
1.容器初始化
1、初始化:HttpServletBean:init()
2、层层调用:FrameworkServlet:initServletBean()→initWebApplicationContext()→configureAndRefreshWebApplicationContext(cwac)→wac.refresh();
AbstractApplicationContext:refresh()→finishRefresh();
3、最后调用到具体类:DispatcherServlet:onRefresh(ApplicationContext context)→initStrategies(context){
initMultipartResolver(context); //初始化上传文件解析器(或者是多部分请求解析器)
initLocaleResolver(context);//初始化本地化解析器
initThemeResolver(context);//初始化主题解析器
initHandlerMappings(context);//初始化处理器映射器
initHandlerAdapters(context);//初始化处理器适配器
initHandlerExceptionResolvers(context);//初始化处理器异常解析器
initRequestToViewNameTranslator(context);//初始化请求到视图名翻译器
initViewResolvers(context);//初始化视图解析器
initFlashMapManager(context);//初始化重定向数据管理器
2.http请求过程:doDispatch(request, response);
try {
//1.根据request里的url从handlerMappings里获得请求目标的方法,也就是控制层具体的方法
mappedHandler = getHandler(processedRequest);
//2.从handlerAdapters中获取控制层适配器RequestMappingHandlerAdapter
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
//3.执行拦截器的前置方法
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
//3.1 直接拦截器的具体preHandle方法
if (!interceptor.preHandle(request, response, this.handler)) {
//3.2 如果拦截器的preHandle方法返回false,则执行拦截器的afterCompletion方法
triggerAfterCompletion(request, response, null);
return false;
}
return;
}
//4.利用反射机制,执行实际请求目标方法返回modeAndView对象
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
//5.执行拦截器PostHandle()方法
mappedHandler.applyPostHandle(processedRequest, response, mv);
//6.设置渲染视图层内容
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
{
//6.1如果有抛异常,则执行异常处理的相关操作
mv = processHandlerException(request, response, handler, exception);
//6.2 视图层渲染具体操作
render(mv, request, response);
//6.3 执行拦截器afterCompletion方法
mappedHandler.triggerAfterCompletion(request, response, null);
}
}
catch (Exception ex) {
//执行拦截器afterCompletion方法
triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
}
catch (Throwable err) {
//执行拦截器afterCompletion方法
triggerAfterCompletion(processedRequest, response, mappedHandler, new NestedServletException("Handler processing failed", err));
}
推荐阅读:
<<<Spring Servlet相关知识
<<<Spring原理汇总及零碎知识点
<<<Web项目的启动方式汇总
<<<SpringMVC底层无web.xml启动原理分析
<<<SpringMVC运行流程
<<<过滤器与拦截器的区别
<<<SpringMVC拦截器的用法
<<<SpringMVC异步实现方式
<<<@Async注解的失效之谜
<<<SpringMVC适配器类型汇总
网友评论