image.png

  1. 发起请求
  2. **前置处理器:**DispatcherServlet,将请求分发给相应的处理器
  3. 处理器映射:调用 HandlerMapping 确定哪个 Controller 应该处理这个请求,通常会根据请求的 URL 来确定
  4. 处理器适配器:一旦找到目标 Controller,DispatcherServlet 会使用 HandlerAdapter 来调用 Controller 的处理方法。
  5. 执行处理器:Controller 处理请求,处理完后返回一个 ModelAndView 对象,其中包含模型数据和逻辑视图名。
  6. 视图解析器:DispatcherServlet 接收到 ModelAndView 后,会使用 ViewResolver 来解析视图名称,找到具体的视图页面。
  7. 渲染视图:视图使用模型数据渲染页面,生成最终的页面内容。
  8. 响应结果:DispatcherServlet 将视图结果返回给客户端。

HandlerAdapter 适配器模式

Handler 一般就是指 Controller,Controller 是 Spring MVC 的核心组件,负责处理请求,返回响应。

Spring MVC 允许使用多种类型的处理器。不仅仅是标准的@Controller注解的类,还可以是实现了特定接口的其他类(如 HttpRequestHandler 或 SimpleControllerHandlerAdapter 等)。这些处理器可能有不同的方法签名和交互方式。

HandlerAdapter 的主要职责就是调用 Handler 的方法来处理请求,并且适配不同类型的处理器。HandlerAdapter 确保 DispatcherServlet 可以以统一的方式调用不同类型的处理器,无需关心具体的执行细节。

适配器模式(Adapter Pattern)的作用是将一个接口转换为客户端希望的另一个接口,以使原本不兼容的接口可以协同工作。适配器模式主要用于接口不兼容的情况,通过适配器来桥接不同的接口,使得系统更灵活。

假设你有两个不同的 Controller,一个是传统实现接口的 Controller,另一个是基于注解的 Controller:

java
复制代码
// 旧式 Controller
public class OldController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("oldView");
    }
}

// 基于注解的 Controller
@Controller
public class NewController {
    @RequestMapping("/new")
    public String handleRequest(Model model) {
        model.addAttribute("attribute", "value");
        return "newView";
    }
}

Spring 通过不同的 HandlerAdapter 适配这两种控制器,使得它们都能被 DispatcherServlet 正常调用。

引入 Restful 之后执行流程的区别

spring-2da963a0-5da9-4b3a-aafd-fd8dbc7e1807.png

不用再处理 View 了,而是直接将结果序列化成 JSON 格式,并且写入 HttpServletResponse 的输出流中。