Spring MVC前置控制器DispatcherServlet对请求进行处理的主要逻辑位于其方法doDispatch,如下 :
-
找到可以处理该请求的
Handler- 找到的
Handler以HandlerExecutionChain形式封装 - 任务执行主要代码行 :
#getHandler(processedRequest) - 如果没有能处理该请求的
Handler,则抛出异常或者返回404任务执行主要代码行 :
noHandlerFound(processedRequest, response)
- 找到的
-
找到能执行该
Handler的HandlerAdapter用于调用该Handler- 任务执行主要代码行 :
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()) - 如果没有找到合适的
HandlerAdapter,则该方法抛出异常ServletException,带相应信息描述。
- 任务执行主要代码行 :
-
通过找到的
HandlerAdapter处理相应的请求- 对当前
Handler的前置处理- 任务执行主要代码行 :
mappedHandler.applyPreHandle(processedRequest, response) - 如果某个
HandlerInterceptor#preHandle返回false,则doDispatch调用triggerAfterCompletion然后return
- 任务执行主要代码行 :
- 通过
HandlerAdapter真正处理当前Handler任务执行主要代码行 :
mv = ha.handle(processedRequest, response, mappedHandler.getHandler()) - 必要时应用缺省视图
任务执行主要代码行 :
applyDefaultViewName(processedRequest, mv) - 对当前
Handler的后置处理任务执行主要代码行 :
mappedHandler.applyPostHandle(processedRequest, response, mv)
以上流程涉及视图名称的获取和设置,但尚不涉及从视图名称到视图的解析逻辑。
- 对当前
-
处理
Handler执行结果- 上面的执行要么成功返回一个
ModelAndView mv,要么错误产生异常dispatchException。 - 任务执行主要代码行 :
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException) - 如果该任务执行出现异常/错误,则
doDispatch会携带相应异常/错误信息调用triggerAfterCompletion并return。
- 如果是
dispatchException的情况,则根据异常构建相应的一个ModelAndView对象记到mv然后继续。exception是ModelAndViewDefiningException的情况直接从其中获取ModelAndView到mv;- 要么调用
processHandlerException(request, response, handler, exception)获取一个ModelAndView到mv;- 这里遍历所登记的
HandlerExceptionResolver bean尝试从异常解析出相应的ModelAndView对象; - 也可能调用结果为
null;
- 这里遍历所登记的
- 渲染视图
任务执行主要代码行 :
render(mv, request, response)Locale应用设置到response;- 根据视图名称解析视图;
如果解析不到视图,则抛出异常
ServletException携带相应信息描述。 - 真正的渲染视图;
- 任务执行主要代码行 :
view.render(mv.getModelInternal(), request, response) redirect/forward处理在这里完成。
- 任务执行主要代码行 :
- 上面的执行要么成功返回一个
本文详细解析了SpringMVC框架中DispatcherServlet处理HTTP请求的核心逻辑,包括查找Handler、选择HandlerAdapter、执行前置处理、处理请求、后置处理、错误处理及视图渲染等关键步骤。
930

被折叠的 条评论
为什么被折叠?



