雖然網上有許多的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()方法