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
处理在这里完成。
- 任务执行主要代码行 :
- 上面的执行要么成功返回一个