天天看点

spring 中 DispatcherServlet 请求调用流程

作者:四季更新221789896

在 Spring MVC 中,DispatcherServlet 是前端控制器,它接收 HTTP 请求并将请求分发给正确的处理程序。具体的逻辑如下:

  1. 接收 HTTP 请求。

DispatcherServlet 的入口方法是 doService(),它接收 HTTP 请求,实例化 HttpServletRequest 和 HttpServletResponse 对象,并将它们传递给 doDispatch() 方法:

protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    // ...
    doDispatch(request, response);
    // ...
}           
  1. 根据请求的 URL 找到对应的处理程序。

在 doDispatch() 方法中,DispatcherServlet 首先需要找到与请求 URL 匹配的处理程序。这个任务由 HandlerMapping 接口及其实现类完成。HandlerMapping 会解析请求 URL,并查找与之匹配的处理程序。最常用的实现类是 RequestMappingHandlerMapping,它会解析 @RequestMapping 注解,将 URL 映射到对应的处理程序。

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    // ...
    HandlerExecutionChain mappedHandler = null;
    mappedHandler = this.handlerMapping.getHandler(request);
    // ...
}           
  1. 调用处理程序。

找到处理程序后,DispatcherServlet 就需要执行它了。这个任务由 HandlerAdapter 接口及其实现类完成。HandlerAdapter 会根据处理程序的类型和参数信息来调用处理程序。

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    // ...
    HandlerAdapter handlerAdapter = getHandlerAdapter(mappedHandler.getHandler());
    ModelAndView mv = handlerAdapter.handle(request, response, mappedHandler.getHandler());
    // ...
}           
  1. 根据处理程序返回的视图名或视图对象找到对应的视图。

处理程序执行完毕后,通常会返回一个 ModelAndView 对象,其中包含视图名或视图对象。DispatcherServlet 需要根据这个信息找到对应的视图。这个任务由 ViewResolver 接口及其实现类完成。ViewResolver 会根据视图名或视图对象,查找并返回对应的视图。

protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
    // ...
    View view;
    if (mv.isReference()) {
        // We need to resolve the view name.
        view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
        // ...
    } else {
        // No need to lookup: the ModelAndView object contains the actual View object.
        view = mv.getView();
        // ...
    }
    // ...
}           
  1. 渲染视图并将结果返回给客户端。

最后,DispatcherServlet 需要将视图渲染后的结果返回给客户端。这个任务由视图本身完成。视图通常会将渲染结果写入到 HttpServletResponse 对象中,然后 DispatcherServlet 将其发送给客户端。

protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
    // ...
    view.render(mv.getModelInternal(), request, response);
    // ...
}           

总之,DispatcherServlet 是 Spring MVC 的核心组件,它实现了前端控制器模式,负责接收 HTTP 请求,将其分发给正确的处理程序,并将处理结果渲染为视图返回给客户端。

请求流程图

上述流程图描述了一个完整的请求过程,包括以下步骤:

spring 中 DispatcherServlet 请求调用流程
  1. 客户端发送请求到 DispatcherServlet。
  2. DispatcherServlet 获取请求的 HandlerExecutionChain。
  3. DispatcherServlet 获取 HandlerAdapter。
  4. HandlerAdapter 调用 Handler 处理请求。
  5. Handler 返回 ModelAndView。
  6. DispatcherServlet 获取 ViewResolver。
  7. ViewResolver 解析视图。
  8. View 渲染视图。
  9. DispatcherServlet 返回响应给客户端。

继续阅读