虽然网上有许多的springmvc流程分析,但别人的总是别人的,自己不来走一遍,总感觉空空的
1.首先,用户发送请求request到SpringMVC的前端控制器-DispatcherServlet,
2.收到request请求之后的前端控制器调用getHandler()方法,获取Handler执行链HandlerExecutionChain
3.然后前端控制器调用getHandlerAdapter(Handler)方法获得HandlerAdapter方法,并由其去掉用相应的处理方法去返回ModelAndView>>具体流程如下:
①、首先遍历HandlerExecutionChain处理器执行链中拦截器intercepter的preHandle()方法–
boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
if (getInterceptors() != null) {
for (int i = 0; i < getInterceptors().length; i++) {
HandlerInterceptor interceptor = getInterceptors()[i];
if (!interceptor.preHandle(request, response, this.handler)) {
triggerAfterCompletion(request, response, null);
return false;
}
this.interceptorIndex = i;
}
}
return true;
}
②、然后调用目标处理方法来返回ModelAndView对象
③、在渲染视图view之前遍历执行拦截器的postHandle()方法–
for (int i = getInterceptors().length - 1; i >= 0; i--) {
HandlerInterceptor interceptor = getInterceptors()[i];
interceptor.postHandle(request, response, this.handler, mv);
}
④、:调用render方法进行视图view的渲染:
——第一步:由我们在springmvc的配置文件中的视图解析器,获得view对象即对应的物理路径。
——第二步:调用view.render()方法,进行model模型数据的装配对应的方法renderMergedOutputModel(mergedModel, request, response);有java的官方文档可以知道,the steb will be the actual rendering of the view.
⑤、:遍历HandlerExecutionChain处理器执行链中拦截器intercepter的方法afterCompletion()方法,
for (int i = this.interceptorIndex; i >= 0; i--) {
HandlerInterceptor interceptor = getInterceptors()[i];
try {
interceptor.afterCompletion(request, response, this.handler, ex);
}
catch (Throwable ex2) {
logger.error("HandlerInterceptor.afterCompletion threw exception", ex2);
}
}
–由源码可以看到,先配置的intercepter后执行其aftercompletion()方法