SpringMVC

SpringMVC Restful风格的接口的流程是什么样的呢?

PS:这是一道全新的八股,毕竟ModelAndView这种方式应该没人用了吧?现在都是前后端分离接口,八股也该更新换代了。

我们都知道Restful接口,响应格式是json,这就用到了一个常用注解:

@ResponseBody

1
2
3
4
5
@GetMapping("/user")
@ResponseBody
public User user(){
return new User(1,"张三");
}

加入了这个注解后,整体的流程上和使用ModelAndView大体上相同,但是细节上有一些不同:

img

1. 客户端向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet

2. DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知,该请求该由哪个Controller来处理

3. DispatcherServlet调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controller

4. Controller被封装成了ServletInvocableHandlerMethod,HandlerAdapter处理器适配器去执行invokeAndHandle方法,完成对Controller的请求处理

5. HandlerAdapter 用执行完对Controller的请求,会调用

HandlerMethodReturnValueHandler去处理返回值,主要的过程:

5.1. 调用RequestResponseBodyMethodProcessor,创建

ServletServerHttpResponse(Spring对原生ServerHttpResponse的封装)实例

5.2.使用HttpMessageConverter的write方法,将返回值写入

ServletServerHttpResponse的OutputStream输出流中

5.3.在写入的过程中,会使用JsonGenerator(默认使用Jackson框架)对返回值进行Json序列化

6. 执行完请求后,返回的ModelAndView为null,ServletServerHttpResponse里也已 经写入了响应,所以不用关心View的处理