本文通過前端控制器源碼分析springmvc執(zhí)行過程
- 1.前端控制器接收請求
調(diào)用doDispatch方法
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
。煞肾。。趴酣。咏删。
}
- 2.前端控制器調(diào)用HandlerMapping(處理器映射器)根據(jù)url查找Handler
// Determine handler for the current request.
mappedHandler = getHandler(processedRequest);
/**
* Return the HandlerExecutionChain for this request.
* <p>Tries all handler mappings in order.
* @param request current HTTP request
* @return the HandlerExecutionChain, or {@code null} if no handler could be found
*/
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
for (HandlerMapping hm : this.handlerMappings) {
if (logger.isTraceEnabled()) {
logger.trace(
"Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'");
}
HandlerExecutionChain handler = hm.getHandler(request);
if (handler != null) {
return handler;
}
}
return null;
}
- 3.調(diào)用處理器適配器執(zhí)行Handler,得到執(zhí)行的結(jié)果ModelAndView mv在doDispatch方法中
// Actually invoke the handler.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
- 4.視圖渲染,將model數(shù)據(jù)填充到request域
doDispatch->processDispatchResult->render
在render方法中,視圖解析得到view
// We need to resolve the view name.
view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
調(diào)用view的渲染方法,將model數(shù)據(jù)填充到request域
在render方法中,調(diào)用View接口的render方法
view.render(mv.getModelInternal(), request, response);