💖 初始版
1. 发起请求
客户端通过 HTTP 协议向服务器发起请求。
2. 前端控制器(DispatcherServlet)
这个请求会先到前端控制器 DispatcherServlet,它是整个流程的入口点,负责接收请求并将其分发给相应的处理器。
3. 处理器映射(HandlerMapping)
DispatcherServlet 调用 HandlerMapping 来确定哪个 Controller 应该处理这个请求。通常会根据请求的 URL 来确定
4. 处理器适配器(HandlerAdapter)
一旦找到目标 Controller,DispatcherServlet 会使用 HandlerAdapter 来调用 Controller 的处理方法
5. 执行处理器(Controller)
Controller 处理请求,处理完后返回一个 ModelAndView 对象,其中包含模型数据和逻辑视图名
6. 视图解析器(ViewResolver)
DispatcherServlet 接收到 ModelAndView 后,会使用 ViewResolver 来解析视图名称,找到具体的视图页面
7. 渲染视图
视图使用模型数据渲染页面,生成最终的页面内容
8. 响应结果
DispatcherServlet 将视图结果返回给客户端
在前后端分离的情况下,步骤 ⑥、⑦、⑧ 会略有不同,后端通常只需要处理数据,并将 JSON 格式的数据返回给前端就可以了,而不是返回完整的视图页面。
💖 前后端分离版
Restful 接口,响应格式是 json,常用注解:@ResponseBody
@GetMapping("/user")
@ResponseBody
public User user(){
return new User(1,"张三");
}
加入了这个注解后,整体的流程上和使用 ModelAndView 大体上相同,但是细节上有一些不同:
-
客户端向服务端发送一次请求,这个请求会先到前端控制器 DispatcherServlet
-
DispatcherServlet
接收到请求后会调用HandlerMapping
处理器映射器。由此得知,该请求该由哪个Controller
来处理 -
DispatcherServlet
调用HandlerAdapter
处理器适配器,告诉处理器适配器应该要去执行哪个Controller
-
Controller
被封装成了ServletInvocableHandlerMethod
,HandlerAdapter
处理器适配器去执行invokeAndHandle
方法,完成对Controller
的请求处理 -
HandlerAdapter 执行完对 Controller 的请求,会调用 HandlerMethodReturnValueHandler 去处理返回值,主要的过程:
-
调用 RequestResponseBodyMethodProcessor,创建 ServletServerHttpResponse(Spring 对原生 ServerHttpResponse 的封装)实例
-
使用 HttpMessageConverter 的 write 方法,将返回值写入 ServletServerHttpResponse 的 OutputStream 输出流中
-
在写入的过程中,会使用 JsonGenerator(默认使用 Jackson 框架)对返回值进行 Json 序列化
-
-
执行完请求后,返回的 ModealAndView 为 null,ServletServerHttpResponse 里也已经写入了响应,所以不用关心 View 的处理