首先看一下DispatcherServlet结构:
spring
观察HandlerExecutionChain对象的建立与赋值,这个方法用来表示执行这个方法的整条链。
mvc
进入getHandler方法:
app
此时的变量handlerMappings为:
post
恰好对应咱们的三个方法,说明了咱们的方法映射所有存放在handlerMappings中,经过遍历handlerMapping来进行操做。
经过HandlerMapping来对HandlerExecutionChain赋值。
学习
执行完这一句参数有,说明获取了一条完整的链,能够来进行执行了,注意此时获取到的是全部拦截器,由于必需要走过全部拦截器。spa
经过HandlerExecutionChain对象来获取HandlerAdapter对象,经过这个对象进行控制器方法的调用,并返回ModelAndView对象,再经过ModelAndView对象调用解析器建立视图对象,再经过视图对象的渲染方法来进行最终的用户的需求结果处理。
3d
完成这一步后使用ha调用拦截器的preHandle方法,若是放行,则执行handle方法,不放行,则返回:
对象
进入此方法中:
blog
下一步就是执行handler处理方法,执行完方法返回一个ModelAndView对象,使用此对象调用视图解析器建立视图对象,再根据视图对象调用其渲染方法将模型中的数据以特定的格式传输给用户。
get
继续执行:
执行到这里以及执行完核心业务了,须要执行postHandler方法,注意这个注释,不管是否是有异常,最终都是到这个方法中,而且有相应的异常的话仍是会返回一个ModalAndView对象,让错误的结果仍是能正常返回,并给出相对友好的提示信息。
/**
有异常的处理:
执行渲染方法:
进入方法,根据视图解析器获取视图,得到视图对象就返回:
解析完成,调用view的 render方法(注意不是DispatcherServlet的render方法):
view的render方法:
执行完渲染,跳转时执行拦截器的afterCompletion方法。
进入方法:
弄完这些,还要经过过滤器链等等,最终才完成一整个springmvc的执行流程。
按照我本身的理解,画出了这么一幅流程图,但愿对你们有帮助:
我是福尔斯甘,若是对本篇有疑问,或者发现有什么错误之处,欢迎提出指出,以为评论不方便的话,本人邮箱是96532354@qq.com,qq同号,欢迎共同窗习讨论问题。 以为不错的话能够点个推荐分享一下哦,谢谢你们的支持~~