我们在编写接口的时候,对外暴露用于获取请求,那请求是怎么进来的呢?进来之后做了哪些操作?结果是怎么返回的呢?我们带着疑问,去看一下底层原理,首先先看一下图
我们请求接口出发点都是从浏览器上操作的,所有我们从IE浏览器那边开始看起
1、通过IE或其他 浏览器请求接口,发送HTTP请求,我们这个请求会被前端控制器DispatcherServlet捕获
2、DispatcherServlet根据-servlet.xml中的配置对请求的URL进行解析,得到请求资源标识符URI,然后根据URI调用HandlerMapping获得该Handler配置的所有相关的对象,包括Handler对象以及Handler对象对应的拦截器,最后以HandlerExecutionChain对象的形式返回
3、DispatcherServlet根据获得的Handler选择一个合适的HandlerAdapter,然后执行拦截器中的preHandler方法
4、提取Request中的模型数据,填充Handler入参,开始执行Handler,也就是Controller,在填充Handler的入参过程中,根据你的配置,Spring将为你做一些额外的工作
- HttpMessageConveter:将请求消息转换为一个对象,将对象转换为指定的响应信息
- 数据转换:对请求消息进行数据转换,如String转换为Integer等
- 数据根式化:对请求消息进行数据格式化,如将字符串转换为格式化数字或格式化日期
- 数据验证:验证数据的有效性,验证结果存储到BindingResult或Error中
5、Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象
6、根据返回的ModelAndView,选择一个合适的ViewResolver,必须是已经注册到Spring容器中的ViewResolver返回给DispatcherServlet
7、ViewResolver结合Model和View,来渲染视图
8、视图负责将渲染结果返回给客户端,也就是我们最后看到的请求响应