天天看点

Spring MVC 原理 - DispatcherServlet调用完整过程(下)

上一篇到440行返回结果result.

Spring MVC 原理 - DispatcherServlet调用完整过程(下)

返回result之后,使用result去获取modelandview,执行方法getmodelandview:

Spring MVC 原理 - DispatcherServlet调用完整过程(下)

该方法主要通过result返回值来判断:

Spring MVC 原理 - DispatcherServlet调用完整过程(下)

当前方法是带responsebody注解的,所以执行到这里:

Spring MVC 原理 - DispatcherServlet调用完整过程(下)

进去方法:

Spring MVC 原理 - DispatcherServlet调用完整过程(下)

这里是根据http类型做出相应的输出:

Spring MVC 原理 - DispatcherServlet调用完整过程(下)

用户配置的:

Spring MVC 原理 - DispatcherServlet调用完整过程(下)

接收的类型:

Spring MVC 原理 - DispatcherServlet调用完整过程(下)

写的方法:

Spring MVC 原理 - DispatcherServlet调用完整过程(下)

这里配置的json格式,所以会进入json方法:

Spring MVC 原理 - DispatcherServlet调用完整过程(下)

写入responsebody后,返回mav:

Spring MVC 原理 - DispatcherServlet调用完整过程(下)

最后返回之前调用handler的地方,之后会有一些不同种类的拦截器方法:

Spring MVC 原理 - DispatcherServlet调用完整过程(下)

拦截器如:

Spring MVC 原理 - DispatcherServlet调用完整过程(下)
Spring MVC 原理 - DispatcherServlet调用完整过程(下)
Spring MVC 原理 - DispatcherServlet调用完整过程(下)

还有一些处理不同异常情况的拦截器。

系统默认都会去执行一个拦截器,这个拦截器基本上都是空方法,是一个private类:

Spring MVC 原理 - DispatcherServlet调用完整过程(下)

返回调用dodispatch的地方:

Spring MVC 原理 - DispatcherServlet调用完整过程(下)

返回到doservice的地方:

Spring MVC 原理 - DispatcherServlet调用完整过程(下)

最后回到httpservlet的service方法:

Spring MVC 原理 - DispatcherServlet调用完整过程(下)

到这里就完成了一次完整的调用过程。

可以发现,整个过程的流程是比较清晰,程序启动时会根据mvc的配置和spring配置来处理配置信息和注解的类。

servlet处理请求,通过request(主要是url)来获取handler,之后最主要的一个部分就是获取需要注入的参数,最后调用用户方法,处理返回结果。

整个过程中麻烦的地方就是在一些细节的处理上,这些细节未必一开始就有的,一开始应该是一个主要的流程,后续发现问题或者为了通用性做的改进。