SpringMVC学习笔记——运行流程及源码解析

流程图

SpringMVC学习笔记——运行流程及源码解析_第1张图片

源码解析

主要就是DispatcherServlet的doDispatch方法。
DispatcherServlet916行:mappedHandler = getHandler(processedRequest);获取一个HandlerExecutionChain
DispatcherServlet923行:HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());获取一个HandlerAdapter,它做了校验、格式化、绑定(转换messageConverter)等工作。
DispatcherServlet939行:if (!mappedHandler.applyPreHandle(processedRequest, response)) {,调用拦截器的preHandle方法。
DispatcherServlet945行:mv = ha.handle(processedRequest, response, mappedHandler.getHandler());真正调用目标方法。
DispatcherServlet954行:mappedHandler.applyPostHandle(processedRequest, response, mv);调用了拦截器的postHandle方法。
DispatcherServlet959行:processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);处理doDispatch结果,渲染视图。
进入上述方法内:
DispatcherServlet1005行:mv = processHandlerException(request, response, handler, exception);若有异常,则进行异常处理,进入该方法内部:
DispatcherServlet1164行:exMv = handlerExceptionResolver.resolveException(request, response, handler, ex);调用异常处理去处理异常。
若没有异常,在DispatcherServlet1012行:render(mv, request, response);渲染视图。
进入render方法内部,在DispatcherServlet1204行:view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);,用视图解析器去解析视图,获取一个View对象。
DispatcherServlet1225行:view.render(mv.getModelInternal(), request, response);,真正渲染视图。
进入render方法内,CTRL+T,找到AbstractView的render方法,找到AbstractView266renderMergedOutputModel(mergedModel, request, response);,点进去,CTRL+T,找到InternalResourceView的renderMergedOutputModel方法,可以看到方法内部,有转发(forward)的流程。

回到DispatcherServlet1030行:mappedHandler.triggerAfterCompletion(request, response, null);调用拦截器的afterCompletion方法。

你可能感兴趣的:(spring-mvc,SSM学习之路)