本文基于spring 5.5.2.release
项目中一直在使用SpringMVC,自信对它很了解,但是前几天测试环境出了一个问题,才发现对它的了解远远不够。于是我计划开一个springmvc的专栏,详细介绍请求处理逻辑,以及它的各个组件功能。今天是第一篇关于springmvc的文章,先从整体上看一下springmvc的逻辑。
下图是springmvc的一个经典图,图中最重要的是DispatcherServlet,它是整个处理过程的核心,它将各个组件串在一起,完成一次http请求。
DispatcherServlet实现了Servlet接口,因此它可以接受http请求,springmvc将所有的请求都发送给DispatcherServlet,下面看一下它对请求的处理过程:
- 遍历HandlerMapping找到对应的Controller,HandlerMapping的作用是根据请求参数找到对应的Handler,每个Handler对象包含了一个Controller,springmvc提供了多种HandlerMapping,每种HandlerMapping都可以根据某个请求参数查找对应的Handler;
- 找到Controller后,调用Controller处理请求获得返回结果,不过springmvc不是直接调用Controller,而是通过适配器(HandlerAdapter),适配器在调用前,会处理Controller方法入参,包括类型转换,参数校验等,Controller返回结果后,适配器根据配置对返回结果做不同的处理,比如可以将返回值直接返回客户端,请求结束;还可以将返回结果组装成ModelAndView对象,以进行后续处理;
- 如果上一步创建了ModelAndView对象,那么接下来遍历ViewResolver,以找到合适的View对象,每个View对象可以理解为一个Html页面,或者一个返回给客户端的json串,总之一个View对象代表最终呈现给客户端的内容;
- 找到了View对象后,需要对View对象进行渲染,我觉得这个渲染用的比较高端,对View对象的处理显得很奇妙,其实简单的说就是处理页面中的一些参数,将不确定的值转换为确定值,比如jsp页面中判断,显示值等;
- View渲染之后,就可以将View对象内容转换为字符串返回给客户端,请求处理结束。
上面这个流程是一个正常的请求处理过程,为了简单,里面忽略了很多细节,在后续文章中会介绍。