Spring MVC 请求处理全流程:从 DispatcherServlet 到视图渲染

Spring MVC 请求处理全流程:从 DispatcherServlet 到视图渲染

基于Spring Framework 6.1.5源码深度解析

前言

Spring MVC作为Java Web开发中最主流的框架之一,其请求处理流程的优雅设计体现了框架的精髓。本文将基于Spring Framework 6.1.5源码,从DispatcherServlet出发,完整剖析一个HTTP请求如何在Spring MVC中被处理,最终渲染成视图返回给客户端的全过程。

通过本文,你将深入理解: - DispatcherServlet的核心工作机制 - HandlerMapping的请求路由策略 - HandlerAdapter的处理器适配模式 - ViewResolver的视图解析流程 - 各组件之间的协作关系

一、Spring MVC架构概览

1.1 核心组件角色

Spring MVC采用前端控制器模式(Front Controller Pattern),DispatcherServlet作为统一入口,协调九大核心组件完成请求处理。

复制代码
graph TB
    Client[客户端] --> DispatcherServlet[DispatcherServlet<br/>前端控制器]
    
    DispatcherServlet --> HandlerMapping[HandlerMapping<br/>处理器映射器]
    DispatcherServlet --> HandlerAdapter[HandlerAdapter<br/>处理器适配器]
    DispatcherServlet --> ViewResolver[ViewResolver<br/>视图解析器]
    
    HandlerMapping --> Controller[Controller<br/>处理器]
    Controller --> HandlerAdapter
    
    HandlerAdapter --> ModelAndView[ModelAndView<br/>模型与视图]
    HandlerAdapter --> ViewResolver
    
    ViewResolver --> View[View<br/>视图]
    View --> Response[响应]
    
    style DispatcherServlet fill:#f9f,stroke:#333,stroke-width:4px
    style Controller fill:#bbf,stroke:#333,stroke-width:2px

1.2 请求处理完整流程

下面的时序图展示了从请求到响应的完整交互过程:

复制代码
sequenceDiagram
    participant Client as 客户端
    participant DS as DispatcherServlet
    participant HM as HandlerMapping
    participant HA as HandlerAdapter
    participant C as Controller
    participant VR as ViewResolver
    participant V as View
    
    Client->>DS: 1. HTTP请求
    DS->>DS: 2. doService()
    DS->>HM: 3. getHandler()
    HM-->>DS: 4. HandlerExecutionChain
    
    DS->>HA: 5. getHandlerAdapter()
    HA-->>DS: 6. HandlerAdapter
    
    DS->>HA: 7. applyPreHandle()【拦截器】
    DS->>HA: 8. handle()【执行Controller】
    HA->>C: 调用处理器方法
    C-->>HA: 返回结果
    HA-->>DS: 9. ModelAndView
    
    DS->>HA: 10. applyPostHandle()【拦截器】
    DS->>VR: 11. resolveViewName()
    VR-->>DS: 12. View对象
    
    DS->>V: 13. render()
    V->>Client: 14. HTTP响应

二、DispatcherServlet:请求处理的指挥官

2.1 继承体系与初始化

DispatcherServlet继承自FrameworkServlet,而FrameworkServlet又继承自HttpServletBean。这种设计保证了Servlet规范的基本功能,同时提供了Spring特有的扩展能力。

java 复制代码
#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}// Spring Framework 6.1.5`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}// org.springframework.web.servlet.DispatcherServlet`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}public class DispatcherServlet extends FrameworkServlet {`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}    `
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}    // 九大核心组件的常量定义`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}    // ... 其他组件常量`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}    `
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}    // 存储检测到的策略接口`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}    private List<HandlerMapping> handlerMappings;`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}    private List<HandlerAdapter> handlerAdapters;`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}    private List<ViewResolver> viewResolvers;`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}    `
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}    @Override`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}    protected void onRefresh(ApplicationContext context) {`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}        // 初始化九大组件`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}        initHandlerMappings(context);`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}        initHandlerAdapters(context);`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}        initViewResolvers(context);`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}        // ... 初始化其他组件`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}    }`
`#// Spring Framework 6.1.5
// org.springframework.web.servlet.DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
    
    // 九大核心组件的常量定义
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    // ... 其他组件常量
    
    // 存储检测到的策略接口
    private List<HandlerMapping> handlerMappings;
    private List<HandlerAdapter> handlerAdapters;
    private List<ViewResolver> viewResolvers;
    
    @Override
    protected void onRefresh(ApplicationContext context) {
        // 初始化九大组件
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initViewResolvers(context);
        // ... 初始化其他组件
    }
}}

2.2 doService():请求处理入口

当请求到达DispatcherServlet时,doService()方法被调用,它是请求处理的总入口。

java 复制代码
#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}// DispatcherServlet.java - Spring Framework 6.1.5`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}@Override`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    `
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    // 1. 保存请求快照,用于在include场景下恢复原始属性`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    Map<String, Object> attributesSnapshot = null;`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    if (WebUtils.isIncludeRequest(request)) {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}        attributesSnapshot = new HashMap<>();`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}        Enumeration<?> attrNames = request.getAttributeNames();`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}        while (attrNames.hasMoreElements()) {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}            String attrName = (String) attrNames.nextElement();`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}            if (this.cleanupAfterInclude) {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}                attributesSnapshot.put(attrName, request.getAttribute(attrName));`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}            }`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}        }`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    }`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    `
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    // 2. 设置Spring MVC框架特有的上下文属性`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    `
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    // 3. 处理FlashMap(用于重定向时的参数传递)`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    if (inputFlashMap != null) {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    }`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    `
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    `
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    try {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}        // 4. 核心处理逻辑`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}        doDispatch(request, response);`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    } finally {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}        // 5. 清理资源`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}            if (attributesSnapshot != null) {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}                restoreAttributesAfterInclude(request, attributesSnapshot);`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}            }`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}        }`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}    }`
`#// DispatcherServlet.java - Spring Framework 6.1.5

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 保存请求快照,用于在include场景下恢复原始属性
    Map<String, Object> attributesSnapshot = null;
    if (WebUtils.isIncludeRequest(request)) {
        attributesSnapshot = new HashMap<>();
        Enumeration<?> attrNames = request.getAttributeNames();
        while (attrNames.hasMoreElements()) {
            String attrName = (String) attrNames.nextElement();
            if (this.cleanupAfterInclude) {
                attributesSnapshot.put(attrName, request.getAttribute(attrName));
            }
        }
    }
    
    // 2. 设置Spring MVC框架特有的上下文属性
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
    
    // 3. 处理FlashMap(用于重定向时的参数传递)
    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
        request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }
    
    request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
    request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);
    
    try {
        // 4. 核心处理逻辑
        doDispatch(request, response);
    } finally {
        // 5. 清理资源
        if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
            if (attributesSnapshot != null) {
                restoreAttributesAfterInclude(request, attributesSnapshot);
            }
        }
    }
}}

2.3 doDispatch():核心调度逻辑

doDispatch()是整个请求处理的核心,它协调各个组件完成请求的处理。

java 复制代码
#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}// DispatcherServlet.java - Spring Framework 6.1.5`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}    `
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}    HttpServletRequest processedRequest = request;`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}    HandlerExecutionChain mappedHandler = null;`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}    boolean multipartRequestParsed = false;`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}    `
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}    // 1. 获取异步请求管理器`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}    `
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}    try {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}        ModelAndView mv = null;`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}        Exception dispatchException = null;`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}        `
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}        try {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            // 2. 检查是否是文件上传请求`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            processedRequest = checkMultipart(request);`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            multipartRequestParsed = (processedRequest != request);`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            `
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            // 3. 获取处理器执行链【HandlerMapping】`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            mappedHandler = getHandler(processedRequest);`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            if (mappedHandler == null) {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}                noHandlerFound(processedRequest, response);`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}                return;`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            }`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            `
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            // 4. 获取处理器适配器【HandlerAdapter】`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            `
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            // 5. 处理GET请求的Last-Modified头`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            String method = request.getMethod();`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            boolean isGet = "GET".equals(method);`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            if (isGet || "HEAD".equals(method)) {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}                    return;`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}                }`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            }`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            `
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            if (!mappedHandler.applyPreHandle(processedRequest, response)) {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}                return;`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            }`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            `
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            // 7. 实际调用处理器【执行Controller方法】`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            `
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            // 8. 如果是异步请求,直接返回`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            if (asyncManager.isConcurrentHandlingStarted()) {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}                return;`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            }`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            `
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            // 9. 应用默认视图名(当Controller返回null时)`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            applyDefaultViewName(processedRequest, mv);`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            `
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            mappedHandler.applyPostHandle(processedRequest, response, mv);`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            `
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}        } catch (Exception ex) {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            dispatchException = ex;`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}        } catch (Throwable err) {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            dispatchException = new NestedServletException("Handler dispatch failed", err);`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}        }`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}        `
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}        // 11. 处理分发结果【视图渲染】`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}        `
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}    } catch (Exception ex) {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}    } catch (Throwable err) {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}        triggerAfterCompletion(processedRequest, response, mappedHandler,`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}                               new NestedServletException("Handler processing failed", err));`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}    } finally {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}        if (asyncManager.isConcurrentHandlingStarted()) {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            if (mappedHandler != null) {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            }`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}        } else {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            if (multipartRequestParsed) {`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}                cleanupMultipart(processedRequest);`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}            }`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}        }`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}    }`
`#// DispatcherServlet.java - Spring Framework 6.1.5

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    
    // 1. 获取异步请求管理器
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        
        try {
            // 2. 检查是否是文件上传请求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            
            // 3. 获取处理器执行链【HandlerMapping】
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            // 4. 获取处理器适配器【HandlerAdapter】
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            
            // 5. 处理GET请求的Last-Modified头
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(processedRequest, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            
            // 6. 应用预处理拦截器【应用场景:权限校验、日志记录】
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            
            // 7. 实际调用处理器【执行Controller方法】
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            
            // 8. 如果是异步请求,直接返回
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            
            // 9. 应用默认视图名(当Controller返回null时)
            applyDefaultViewName(processedRequest, mv);
            
            // 10. 应用后置拦截器【应用场景:性能监控、资源清理】
            mappedHandler.applyPostHandle(processedRequest, response, mv);
            
        } catch (Exception ex) {
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        
        // 11. 处理分发结果【视图渲染】
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        
    } catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    } catch (Throwable err) {
        triggerAfterCompletion(processedRequest, response, mappedHandler,
                               new NestedServletException("Handler processing failed", err));
    } finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            if (mappedHandler != null) {
                mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            }
        } else {
            if (multipartRequestParsed) {
                cleanupMultipart(processedRequest);
            }
        }
    }
}}

三、HandlerMapping:请求路由的智慧大脑

3.1 HandlerMapping职责

HandlerMapping负责根据请求信息(URL、请求方法、请求参数等)找到匹配的处理器(Handler)。Spring MVC提供了多种实现:

实现类 功能描述 典型应用场景
RequestMappingHandlerMapping 基于@RequestMapping注解路由 最常用的RESTful接口
BeanNameUrlHandlerMapping 根据Bean的name属性匹配URL 传统Controller实现
RouterFunctionMapping 函数式路由 Spring WebFlux风格
SimpleUrlHandlerMapping 静态URL映射配置 静态资源处理

3.2 RequestMappingHandlerMapping工作原理

这是Spring MVC中最核心的映射器,支持精确的路径匹配、HTTP方法匹配、参数匹配、请求头匹配等。

java 复制代码
#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}// RequestMappingHandlerMapping.java - Spring Framework 6.1.5`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}@Override`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}protected HandlerMethod createHandlerMethod(Object handler, Method method) {`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    HandlerMethod handlerMethod;`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    if (handler instanceof String) {`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}        // 处理String类型的Bean名称`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}        String beanName = (String) handler;`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}        handlerMethod = new HandlerMethod(beanName,`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}            getApplicationContext().getAutowireCapableBeanFactory(),`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}            method);`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    } else {`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}        handlerMethod = new HandlerMethod(handler, method);`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    }`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    return handlerMethod;`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}}`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}@Override`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}protected boolean isHandler(Class<?> beanType) {`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    // 检查类上是否有@Controller或@RequestMapping注解`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}}`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}@Override`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    // 创建方法级别的RequestMappingInfo`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    RequestMappingInfo info = createRequestMappingInfo(method);`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    `
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    if (info != null) {`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}        // 合并类级别和方法级别的映射信息`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}        if (typeInfo != null) {`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}            info = typeInfo.combine(info);`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}        }`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    }`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    `
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    return info;`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}}`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    RequestCondition<?> condition = (element instanceof Class<?> ?`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    `
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    return (requestMapping != null ? `
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}        createRequestMappingInfo(requestMapping, condition) : null);`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}}`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}protected RequestMappingInfo createRequestMappingInfo(`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    `
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    RequestMappingInfo.Builder builder = RequestMappingInfo`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}        .methods(requestMapping.method())`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}        .params(requestMapping.params())`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}        .headers(requestMapping.headers())`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}        .consumes(requestMapping.consumes())`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}        .produces(requestMapping.produces())`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}        .mappingName(requestMapping.name());`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    `
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    if (customCondition != null) {`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}        builder.customCondition(customCondition);`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    }`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    `
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}    return builder.options(this.config).build();`
`#// RequestMappingHandlerMapping.java - Spring Framework 6.1.5

@Override
protected HandlerMethod createHandlerMethod(Object handler, Method method) {
    HandlerMethod handlerMethod;
    if (handler instanceof String) {
        // 处理String类型的Bean名称
        String beanName = (String) handler;
        handlerMethod = new HandlerMethod(beanName,
            getApplicationContext().getAutowireCapableBeanFactory(),
            method);
    } else {
        handlerMethod = new HandlerMethod(handler, method);
    }
    return handlerMethod;
}

@Override
protected boolean isHandler(Class<?> beanType) {
    // 检查类上是否有@Controller或@RequestMapping注解
    return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
            AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}

@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
    // 创建方法级别的RequestMappingInfo
    RequestMappingInfo info = createRequestMappingInfo(method);
    
    if (info != null) {
        // 合并类级别和方法级别的映射信息
        RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);
        if (typeInfo != null) {
            info = typeInfo.combine(info);
        }
    }
    
    return info;
}

private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
    RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
    RequestCondition<?> condition = (element instanceof Class<?> ?
        getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));
    
    return (requestMapping != null ? 
        createRequestMappingInfo(requestMapping, condition) : null);
}

protected RequestMappingInfo createRequestMappingInfo(
        RequestMapping requestMapping, @Nullable RequestCondition<?> customCondition) {
    
    RequestMappingInfo.Builder builder = RequestMappingInfo
        .paths(resolveEmbeddedValuesInPatterns(requestMapping.path()))
        .methods(requestMapping.method())
        .params(requestMapping.params())
        .headers(requestMapping.headers())
        .consumes(requestMapping.consumes())
        .produces(requestMapping.produces())
        .mappingName(requestMapping.name());
    
    if (customCondition != null) {
        builder.customCondition(customCondition);
    }
    
    return builder.options(this.config).build();
}}

3.3 请求匹配流程

当请求到达时,HandlerMapping会按照以下步骤进行匹配:

复制代码
flowchart TD
    Start[请求到达] --> GetMappings[获取所有@RequestMapping信息]
    GetMappings --> PathMatch[路径匹配]
    PathMatch -->|不匹配| NextMapping[下一个映射]
    PathMatch -->|匹配| MethodCheck[HTTP方法检查]
    
    MethodCheck -->|不匹配| NextMapping
    MethodCheck -->|匹配| ParamsCheck[参数检查]
    
    ParamsCheck -->|不匹配| NextMapping
    ParamsCheck -->|匹配| HeadersCheck[请求头检查]
    
    HeadersCheck -->|不匹配| NextMapping
    HeadersCheck -->|匹配| ConsumesCheck[Consumes检查]
    
    ConsumesCheck -->|不匹配| NextMapping
    ConsumesCheck -->|匹配| ProducesCheck[Produces检查]
    
    ProducesCheck -->|不匹配| NextMapping
    ProducesCheck -->|匹配| Found[找到匹配的Handler]
    
    NextMapping -->|还有映射| PathMatch
    NextMapping -->|没有映射| NotFound[404 Not Found]
    
    style Found fill:#90EE90
    style NotFound fill:#FFB6C1

四、HandlerAdapter:处理器执行的适配器

4.1 适配器模式的应用

Spring MVC使用适配器模式来支持多种类型的Handler。不同的Controller实现方式(注解、接口、Bean名称等)需要不同的适配器来执行。

HandlerAdapter实现 支持的Handler类型 核心方法
RequestMappingHandlerAdapter @RequestMapping注解的方法 handleInternal()
HttpRequestHandlerAdapter HttpRequestHandler接口 handle()
SimpleControllerHandlerAdapter Controller接口 handleRequest()
RpcServiceExporter RPC服务导出 invoke()

4.2 RequestMappingHandlerAdapter核心实现

这是最常用的适配器,负责执行带@RequestMapping注解的方法。

java 复制代码
#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}@Override`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}protected ModelAndView handleInternal(HttpServletRequest request,`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    ModelAndView mav;`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    // 1. 检查请求是否需要在Session级别同步`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    checkRequest(request);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    // 2. 执行HandlerMethod【关键步骤】`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    mav = invokeHandlerMethod(request, response, handlerMethod);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    // 3. 处理响应头中的Cache-Control`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    if (!responseContainsCommitted(response)) {`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        applyCacheControl(response);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    }`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    return mav;`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}}`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}@Nullable`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}protected ModelAndView invokeHandlerMethod(HttpServletRequest request,`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    ServletWebRequest webRequest = new ServletWebRequest(request, response);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    try {`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        // 1. 创建Web数据绑定工厂`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        // 2. 创建Model工厂【用于向Model中添加数据】`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        // 4. 设置参数解析器【@RequestParam, @PathVariable等】`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        if (this.argumentResolvers != null) {`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        }`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        // 5. 设置返回值处理器【@ResponseBody等】`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        if (this.returnValueHandlers != null) {`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        }`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        // 6. 设置数据绑定器和类型转换器`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        invocableMethod.setDataBinderFactory(binderFactory);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        ModelAndViewContainer mavContainer = new ModelAndViewContainer();`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        modelFactory.initModel(webRequest, mavContainer, invocableMethod);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        // 8. 设置异步请求超时时间`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        asyncWebRequest.setTimeout(this.asyncRequestTimeout);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        asyncManager.setTaskExecutor(this.taskExecutor);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        asyncManager.setAsyncWebRequest(asyncWebRequest);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        asyncManager.registerCallableInterceptors(this.callableInterceptors);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        // 9. 设置请求上下文到拦截器`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        if (asyncManager.hasConcurrentResult()) {`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}            Object result = asyncManager.getConcurrentResult();`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}            asyncManager.clearConcurrentResult();`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}            invocableMethod = invocableMethod.wrapConcurrentResult(result);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        }`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        // 10. 实际调用Controller方法【核心逻辑】`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        invocableMethod.invokeAndHandle(webRequest, mavContainer);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        // 11. 根据容器状态返回ModelAndView或null`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        if (asyncManager.isConcurrentHandlingStarted()) {`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}            return null;`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        }`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        `
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        return getModelAndView(mavContainer, modelFactory, webRequest);`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    } finally {`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}        webRequest.requestCompleted();`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}    }`
`#// RequestMappingHandlerAdapter.java - Spring Framework 6.1.5

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ModelAndView mav;
    
    // 1. 检查请求是否需要在Session级别同步
    checkRequest(request);
    
    // 2. 执行HandlerMethod【关键步骤】
    mav = invokeHandlerMethod(request, response, handlerMethod);
    
    // 3. 处理响应头中的Cache-Control
    if (!responseContainsCommitted(response)) {
        applyCacheControl(response);
    }
    
    return mav;
}

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
    
    ServletWebRequest webRequest = new ServletWebRequest(request, response);
    
    try {
        // 1. 创建Web数据绑定工厂
        WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
        
        // 2. 创建Model工厂【用于向Model中添加数据】
        ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        
        // 3. 创建可调用的处理器方法对象【封装了反射调用逻辑】
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        
        // 4. 设置参数解析器【@RequestParam, @PathVariable等】
        if (this.argumentResolvers != null) {
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
        }
        
        // 5. 设置返回值处理器【@ResponseBody等】
        if (this.returnValueHandlers != null) {
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
        }
        
        // 6. 设置数据绑定器和类型转换器
        invocableMethod.setDataBinderFactory(binderFactory);
        invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
        
        // 7. 创建ModelAndViewContainer【用于存储处理过程中的Model和View】
        ModelAndViewContainer mavContainer = new ModelAndViewContainer();
        mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
        modelFactory.initModel(webRequest, mavContainer, invocableMethod);
        
        mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
        
        // 8. 设置异步请求超时时间
        AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
        asyncWebRequest.setTimeout(this.asyncRequestTimeout);
        
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
        asyncManager.setTaskExecutor(this.taskExecutor);
        asyncManager.setAsyncWebRequest(asyncWebRequest);
        asyncManager.registerCallableInterceptors(this.callableInterceptors);
        asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
        
        // 9. 设置请求上下文到拦截器
        if (asyncManager.hasConcurrentResult()) {
            Object result = asyncManager.getConcurrentResult();
            mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
            asyncManager.clearConcurrentResult();
            invocableMethod = invocableMethod.wrapConcurrentResult(result);
        }
        
        // 10. 实际调用Controller方法【核心逻辑】
        invocableMethod.invokeAndHandle(webRequest, mavContainer);
        
        // 11. 根据容器状态返回ModelAndView或null
        if (asyncManager.isConcurrentHandlingStarted()) {
            return null;
        }
        
        return getModelAndView(mavContainer, modelFactory, webRequest);
    } finally {
        webRequest.requestCompleted();
    }
}}

4.3 参数解析器体系

RequestMappingHandlerAdapter通过26种参数解析器来处理不同类型的Controller方法参数:

java 复制代码
#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}// 参数解析器配置顺序(Spring 6.1.5)`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    `
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    // 1. 基于注解的解析器`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new RequestParamMapMethodArgumentResolver());`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new PathVariableMethodArgumentResolver());`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new PathVariableMapMethodArgumentResolver());`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new MatrixVariableMethodArgumentResolver());`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new MatrixVariableMapMethodArgumentResolver());`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new ServletModelAttributeMethodProcessor(false));`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), `
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}        this.requestResponseBodyAdvice));`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), `
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}        this.requestResponseBodyAdvice));`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new RequestHeaderMapMethodArgumentResolver());`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new SessionAttributeMethodArgumentResolver());`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new RequestAttributeMethodArgumentResolver());`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    `
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    // 2. 基于类型的解析器`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new ServletRequestMethodArgumentResolver());`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new ServletResponseMethodArgumentResolver());`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), `
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}        this.requestResponseBodyAdvice));`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new RedirectAttributesMethodArgumentResolver());`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new ModelMethodProcessor());`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new MapMethodProcessor());`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new ErrorsMethodArgumentResolver());`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new SessionStatusMethodArgumentResolver());`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    `
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    // 3. 自定义解析器`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    if (getCustomArgumentResolvers() != null) {`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}        resolvers.addAll(getCustomArgumentResolvers());`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    }`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    `
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}    return resolvers;`
`#// 参数解析器配置顺序(Spring 6.1.5)
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    
    // 1. 基于注解的解析器
    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
    resolvers.add(new RequestParamMapMethodArgumentResolver());
    resolvers.add(new PathVariableMethodArgumentResolver());
    resolvers.add(new PathVariableMapMethodArgumentResolver());
    resolvers.add(new MatrixVariableMethodArgumentResolver());
    resolvers.add(new MatrixVariableMapMethodArgumentResolver());
    resolvers.add(new ServletModelAttributeMethodProcessor(false));
    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new SessionAttributeMethodArgumentResolver());
    resolvers.add(new RequestAttributeMethodArgumentResolver());
    
    // 2. 基于类型的解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), 
        this.requestResponseBodyAdvice));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
    
    // 3. 自定义解析器
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }
    
    return resolvers;
}}

五、视图解析与渲染

5.1 ViewResolver视图解析器体系

ViewResolver负责将逻辑视图名解析为具体的View对象。

复制代码
graph LR
    A[ModelAndView] --> B[ViewResolver<br/>视图解析器]
    B --> C[View<br/>视图对象]
    C --> D[渲染]
    D --> E[HTML/JSON/XML]
    
    B1[InternalResourceViewResolver<br/>JSP] --> B
    B2[ContentNegotiatingViewResolver<br/>内容协商] --> B
    B3[FreeMarkerViewResolver<br/>模板引擎] --> B
    B4[ThymeleafViewResolver<br/>现代模板] --> B
    B5[BeanNameViewResolver<br/>Bean视图] --> B

5.2 视图解析器对比

视图解析器 支持的视图类型 使用场景 配置示例
InternalResourceViewResolver JSP、HTML 传统JSP项目 prefix="/WEB-INF/views/", suffix=".jsp"
ThymeleafViewResolver Thymeleaf模板 现代Web应用 template- engine配置
FreeMarkerViewResolver FreeMarker模板 邮件模板、报表 template-loader-path
ContentNegotiatingViewResolver 多种视图 RESTful API 根据Accept头选择
BeanNameViewResolver Bean定义的View 自定义视图 viewName="beanName"

5.3 视图渲染流程

java 复制代码
#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}// DispatcherServlet.java - processDispatchResult方法`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}private void processDispatchResult(HttpServletRequest request,`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    `
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    boolean errorView = false;`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    if (exception != null) {`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        if (exception instanceof ModelAndViewDefiningException) {`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}            mv = ((ModelAndViewDefiningException) exception).getModelAndView();`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        } else {`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}            mv = processHandlerException(request, response, handler, exception);`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}            errorView = (mv != null);`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        }`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    }`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    `
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    // 2. 渲染视图`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    if (mv != null && !mv.wasCleared()) {`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        render(mv, request, response);`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        if (errorView) {`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}            WebUtils.clearErrorRequestAttributes(request);`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        }`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    }`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    `
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    if (mappedHandler != null) {`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        mappedHandler.triggerAfterCompletion(request, response, null);`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    }`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}}`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}protected void render(ModelAndView mv, HttpServletRequest request,`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        HttpServletResponse response) throws Exception {`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    `
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    // 1. 确定使用的Locale`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    Locale locale = (this.localeResolver != null ? `
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        this.localeResolver.resolveLocale(request) : request.getLocale());`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    `
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    response.setLocale(locale);`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    `
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    // 2. 获取视图名称`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    String viewName = mv.getViewName();`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    View view;`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    `
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    if (viewName != null) {`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        // 3. 解析视图【使用ViewResolver】`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        if (view == null) {`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + `
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}                "' in servlet with name '" + getServletName() + "'");`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        }`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    } else {`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        // 直接使用View对象`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        view = mv.getView();`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        if (view == null) {`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}                "View object in servlet with name '" + getServletName() + "'");`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        }`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    }`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    `
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    // 4. 委托给View对象进行渲染`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    try {`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        if (mv.getStatus() != null) {`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}            response.setStatus(mv.getStatus().value());`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        }`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        view.render(mv.getModelInternal(), request, response);`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    } catch (Exception ex) {`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        if (logger.isDebugEnabled()) {`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}            logger.debug("Error rendering view [" + view + "]", ex);`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        }`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}        throw ex;`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}    }`
`#// DispatcherServlet.java - processDispatchResult方法

private void processDispatchResult(HttpServletRequest request,
        HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler,
        @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
    
    // 1. 错误处理:如果发生异常,尝试用HandlerExceptionResolver处理
    boolean errorView = false;
    if (exception != null) {
        if (exception instanceof ModelAndViewDefiningException) {
            mv = ((ModelAndViewDefiningException) exception).getModelAndView();
        } else {
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            mv = processHandlerException(request, response, handler, exception);
            errorView = (mv != null);
        }
    }
    
    // 2. 渲染视图
    if (mv != null && !mv.wasCleared()) {
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
    
    // 3. 触发AfterCompletion拦截器【应用场景:资源清理、事务提交】
    if (mappedHandler != null) {
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
}

protected void render(ModelAndView mv, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 确定使用的Locale
    Locale locale = (this.localeResolver != null ? 
        this.localeResolver.resolveLocale(request) : request.getLocale());
    
    response.setLocale(locale);
    
    // 2. 获取视图名称
    String viewName = mv.getViewName();
    View view;
    
    if (viewName != null) {
        // 3. 解析视图【使用ViewResolver】
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + 
                "' in servlet with name '" + getServletName() + "'");
        }
    } else {
        // 直接使用View对象
        view = mv.getView();
        if (view == null) {
            throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                "View object in servlet with name '" + getServletName() + "'");
        }
    }
    
    // 4. 委托给View对象进行渲染
    try {
        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }
        view.render(mv.getModelInternal(), request, response);
    } catch (Exception ex) {
        if (logger.isDebugEnabled()) {
            logger.debug("Error rendering view [" + view + "]", ex);
        }
        throw ex;
    }
}}

5.4 Thymeleaf视图渲染示例

java 复制代码
#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}// ThymeleafView.java - Spring Boot集成Thymeleaf`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}@Override`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}public void render(Map<String, ?> model, HttpServletRequest request,`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}        HttpServletResponse response) throws Exception {`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    `
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    // 1. 准备渲染上下文`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    ServletContext servletContext = getServletContext();`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    ThymeleafEvaluationContext evaluationContext = `
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    `
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    // 2. 合并Model数据`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    Map<String, Object> mergedModel = new HashMap<>();`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    if (model != null) {`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}        mergedModel.putAll(model);`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    }`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    `
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, `
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}        new RequestContext(request, response, getServletContext(), mergedModel));`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    `
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    // 4. 创建WebContext【Thymeleaf的上下文对象】`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    WebContext ctx = new WebContext(request, response, servletContext, `
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}        getLocale(), mergedModel);`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    `
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    `
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    // 5. 获取模板引擎并渲染`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    ISpringTemplateEngine templateEngine = getTemplateEngine();`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    String templateName = getTemplateName();`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    `
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    String result = templateEngine.process(templateName, ctx);`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    `
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    // 6. 写入响应`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    response.setContentType(getContentType());`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}    response.getWriter().write(result);`
`#// ThymeleafView.java - Spring Boot集成Thymeleaf

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    
    // 1. 准备渲染上下文
    ServletContext servletContext = getServletContext();
    ThymeleafEvaluationContext evaluationContext = 
        new ThymeleafEvaluationContext(getApplicationContext(), getConversionService());
    
    // 2. 合并Model数据
    Map<String, Object> mergedModel = new HashMap<>();
    if (model != null) {
        mergedModel.putAll(model);
    }
    
    // 3. 添加Spring的RequestContext到Model【用于在模板中访问Spring上下文】
    mergedModel.put(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, 
        new RequestContext(request, response, getServletContext(), mergedModel));
    
    // 4. 创建WebContext【Thymeleaf的上下文对象】
    WebContext ctx = new WebContext(request, response, servletContext, 
        getLocale(), mergedModel);
    
    ctx.setVariable(SpringContextVariableNames.THYMELEAF_EVALUATION_CONTEXT, evaluationContext);
    
    // 5. 获取模板引擎并渲染
    ISpringTemplateEngine templateEngine = getTemplateEngine();
    String templateName = getTemplateName();
    
    String result = templateEngine.process(templateName, ctx);
    
    // 6. 写入响应
    response.setContentType(getContentType());
    response.getWriter().write(result);
}}

六、拦截器机制

6.1 HandlerInterceptor接口定义

拦截器是Spring MVC中非常重要的AOP机制,允许在请求处理的前、中、后三个阶段插入自定义逻辑。

java 复制代码
#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}// HandlerInterceptor.java - Spring Framework 6.1.5`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}public interface HandlerInterceptor {`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}    `
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}    /**`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}     * 预处理:在Controller方法执行之前调用`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}     * 应用场景:权限校验、日志记录、参数验证`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}     * `
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}     * @return true表示继续执行,false表示中断流程`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}     */`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}    default boolean preHandle(HttpServletRequest request, `
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}            HttpServletResponse response, Object handler) throws Exception {`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}        return true;`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}    }`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}    `
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}    /**`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}     * 后处理:在Controller方法执行之后,视图渲染之前调用`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}     * 应用场景:修改Model、性能监控`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}     */`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}    default void postHandle(HttpServletRequest request, `
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}            HttpServletResponse response, Object handler,`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}            @Nullable ModelAndView modelAndView) throws Exception {`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}    }`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}    `
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}    /**`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}     * 完成后处理:在整个请求完成之后调用(视图渲染后)`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}     * 应用场景:资源清理、事务提交、日志记录`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}     */`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}    default void afterCompletion(HttpServletRequest request, `
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}            HttpServletResponse response, Object handler,`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}            @Nullable Exception ex) throws Exception {`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}    }`
`#// HandlerInterceptor.java - Spring Framework 6.1.5

public interface HandlerInterceptor {
    
    /**
     * 预处理:在Controller方法执行之前调用
     * 应用场景:权限校验、日志记录、参数验证
     * 
     * @return true表示继续执行,false表示中断流程
     */
    default boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    
    /**
     * 后处理:在Controller方法执行之后,视图渲染之前调用
     * 应用场景:修改Model、性能监控
     */
    default void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 完成后处理:在整个请求完成之后调用(视图渲染后)
     * 应用场景:资源清理、事务提交、日志记录
     */
    default void afterCompletion(HttpServletRequest request, 
            HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}}

6.2 拦截器执行流程

复制代码
sequenceDiagram
    participant Request as 请求
    participant Interceptor1 as 拦截器1
    participant Interceptor2 as 拦截器2
    participant Controller as Controller
    participant View as View
    participant Response as 响应
    
    Request->>Interceptor1: preHandle()
    Interceptor1->>Interceptor2: preHandle()
    Interceptor2->>Controller: 执行Controller方法
    
    Controller-->>Interceptor2: postHandle()
    Interceptor2-->>Interceptor1: postHandle()
    Interceptor1->>View: 渲染视图
    
    View-->>Interceptor1: afterCompletion()
    Interceptor1-->>Interceptor2: afterCompletion()
    Interceptor2-->>Response: 响应
    
    Note over Interceptor1,Interceptor2: 责任链模式

6.3 拦截器配置示例

java 复制代码
#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}@Configuration`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}@EnableWebMvc`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}public class WebConfig implements WebMvcConfigurer {`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}    `
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}    @Override`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}    public void addInterceptors(InterceptorRegistry registry) {`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}        // 拦截器配置`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}        registry.addInterceptor(new HandlerInterceptor() {`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}            `
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}            @Override`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}            public boolean preHandle(HttpServletRequest request, `
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                    HttpServletResponse response, Object handler) throws Exception {`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                // 1. 记录请求开始时间`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                long startTime = System.currentTimeMillis();`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                request.setAttribute("startTime", startTime);`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                `
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                // 2. 权限校验`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                String uri = request.getRequestURI();`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                if (uri.startsWith("/admin/")) {`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                    HttpSession session = request.getSession(false);`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                    if (session == null || session.getAttribute("user") == null) {`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                        response.sendRedirect("/login");`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                        return false; // 中断请求`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                    }`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                }`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                `
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                return true; // 继续执行`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}            }`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}            `
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}            @Override`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}            public void postHandle(HttpServletRequest request, `
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                    HttpServletResponse response, Object handler,`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                    ModelAndView modelAndView) throws Exception {`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                // 修改Model数据`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                if (modelAndView != null) {`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                    modelAndView.addObject("currentTime", `
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                }`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}            }`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}            `
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}            @Override`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}            public void afterCompletion(HttpServletRequest request, `
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                    HttpServletResponse response, Object handler, Exception ex) throws Exception {`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                // 计算请求处理时间`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                Long startTime = (Long) request.getAttribute("startTime");`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                if (startTime != null) {`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                    long duration = System.currentTimeMillis() - startTime;`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                    System.out.println("请求处理耗时: " + duration + "ms");`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}                }`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}            }`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}        }).addPathPatterns("/**") // 拦截所有路径`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}          .excludePathPatterns("/static/**", "/error"); // 排除静态资源`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}    }`
`#@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器配置
        registry.addInterceptor(new HandlerInterceptor() {
            
            @Override
            public boolean preHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler) throws Exception {
                // 1. 记录请求开始时间
                long startTime = System.currentTimeMillis();
                request.setAttribute("startTime", startTime);
                
                // 2. 权限校验
                String uri = request.getRequestURI();
                if (uri.startsWith("/admin/")) {
                    HttpSession session = request.getSession(false);
                    if (session == null || session.getAttribute("user") == null) {
                        response.sendRedirect("/login");
                        return false; // 中断请求
                    }
                }
                
                return true; // 继续执行
            }
            
            @Override
            public void postHandle(HttpServletRequest request, 
                    HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {
                // 修改Model数据
                if (modelAndView != null) {
                    modelAndView.addObject("currentTime", 
                        LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
            
            @Override
            public void afterCompletion(HttpServletRequest request, 
                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // 计算请求处理时间
                Long startTime = (Long) request.getAttribute("startTime");
                if (startTime != null) {
                    long duration = System.currentTimeMillis() - startTime;
                    System.out.println("请求处理耗时: " + duration + "ms");
                }
            }
        }).addPathPatterns("/**") // 拦截所有路径
          .excludePathPatterns("/static/**", "/error"); // 排除静态资源
    }
}}

七、异常处理机制

7.1 HandlerExceptionResolver体系

Spring MVC提供了三种主要的异常处理方式:

处理方式 实现类 优先级 适用场景
@ExceptionHandler ExceptionHandlerExceptionResolver Controller局部异常处理
@ControllerAdvice ExceptionHandlerExceptionResolver 全局异常处理
SimpleMappingExceptionResolver SimpleMappingExceptionResolver 基于配置的传统方式

7.2 @ControllerAdvice全局异常处理

java 复制代码
#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}// 全局异常处理器`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}@ControllerAdvice`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}public class GlobalExceptionHandler {`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}    `
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}    /**`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}     * 处理自定义业务异常`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}     */`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}    @ExceptionHandler(BusinessException.class)`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}    public ModelAndView handleBusinessException(BusinessException ex, `
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}            HttpServletRequest request) {`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}        ModelAndView mav = new ModelAndView();`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}        mav.addObject("errorCode", ex.getErrorCode());`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}        mav.addObject("errorMessage", ex.getMessage());`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}        mav.addObject("timestamp", LocalDateTime.now());`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}        mav.setViewName("error/business");`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}        return mav;`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}    }`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}    `
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}    /**`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}     * 处理参数校验异常`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}     */`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}    @ExceptionHandler(MethodArgumentNotValidException.class)`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}    public ResponseEntity<ErrorResponse> handleValidationException(`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}            MethodArgumentNotValidException ex) {`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}        `
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}        Map<String, String> errors = new HashMap<>();`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}        ex.getBindingResult().getFieldErrors().forEach(error -> `
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}            errors.put(error.getField(), error.getDefaultMessage()));`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}        `
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}        ErrorResponse errorResponse = new ErrorResponse(`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}            "VALIDATION_FAILED",`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}            "参数校验失败",`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}            errors`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}        );`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}        `
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}        return ResponseEntity.badRequest().body(errorResponse);`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}    }`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}    `
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}    /**`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}     * 处理所有未捕获的异常`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}     */`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}    @ExceptionHandler(Exception.class)`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}    public ModelAndView handleException(Exception ex, HttpServletRequest request) {`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}        ModelAndView mav = new ModelAndView();`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}        mav.addObject("exception", ex);`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}        mav.addObject("url", request.getRequestURL());`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}        mav.setViewName("error/500");`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}        return mav;`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}    }`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}}`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}// 统一错误响应格式`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}@Data`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}@AllArgsConstructor`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}public class ErrorResponse {`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}    private String errorCode;`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}    private String errorMessage;`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}    private Map<String, String> details;`
`#// 全局异常处理器

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public ModelAndView handleBusinessException(BusinessException ex, 
            HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("errorCode", ex.getErrorCode());
        mav.addObject("errorMessage", ex.getMessage());
        mav.addObject("timestamp", LocalDateTime.now());
        mav.setViewName("error/business");
        return mav;
    }
    
    /**
     * 处理参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        
        ErrorResponse errorResponse = new ErrorResponse(
            "VALIDATION_FAILED",
            "参数校验失败",
            errors
        );
        
        return ResponseEntity.badRequest().body(errorResponse);
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURL());
        mav.setViewName("error/500");
        return mav;
    }
}

// 统一错误响应格式
@Data
@AllArgsConstructor
public class ErrorResponse {
    private String errorCode;
    private String errorMessage;
    private Map<String, String> details;
}}

7.3 异常处理流程

复制代码
flowchart TD
    Start[Controller抛出异常] --> Check1{是否有<br/>@ExceptionHandler?}
    Check1 -->|是| LocalHandler[执行局部异常处理器]
    Check1 -->|否| Check2{是否有<br/>@ControllerAdvice?}
    
    LocalHandler --> Result1[返回结果]
    
    Check2 -->|是| GlobalHandler[执行全局异常处理器]
    Check2 -->|否| Check3{是否有<br/>SimpleMappingExceptionResolver?}
    
    GlobalHandler --> Result2[返回结果]
    
    Check3 -->|是| ConfigHandler[使用配置的异常视图]
    Check3 -->|否| DefaultHandler[默认500页面]
    
    ConfigHandler --> Result3[返回结果]
    DefaultHandler --> Result4[返回结果]
    
    style Result1 fill:#90EE90
    style Result2 fill:#87CEEB
    style Result3 fill:#FFD700
    style Result4 fill:#FFB6C1

八、完整请求处理流程总结

8.1 请求处理的九大步骤

复制代码
graph TB
    Start[HTTP请求到达] --> Step1[1. 请求到达DispatcherServlet<br/>doService]
    Step1 --> Step2[2. 文件上传检查<br/>checkMultipart]
    Step2 --> Step3[3. 获取处理器<br/>getHandler-HandlerMapping]
    Step3 --> Step4[4. 获取适配器<br/>getHandlerAdapter]
    Step4 --> Step5[5. 前置拦截器<br/>applyPreHandle]
    Step5 --> Step6[6. 执行Controller<br/>handle]
    Step6 --> Step7[7. 后置拦截器<br/>applyPostHandle]
    Step7 --> Step8[8. 视图渲染<br/>render]
    Step8 --> Step9[9. 完成后拦截器<br/>triggerAfterCompletion]
    Step9 --> End[返回响应]
    
    style Start fill:#FFE4B5
    style End fill:#98FB98
    style Step3 fill:#87CEFA
    style Step6 fill:#FFA07A
    style Step8 fill:#DDA0DD

8.2 核心组件协作关系

组件 职责 输入 输出
DispatcherServlet 前端控制器,统一调度 HTTP请求 HTTP响应
HandlerMapping 处理器映射 HTTP请求 HandlerExecutionChain
HandlerAdapter 处理器适配 Handler方法 ModelAndView
ViewResolver 视图解析 视图名 View对象
View 视图渲染 Model数据 HTML/JSON/XML
HandlerInterceptor 拦截器 上下文 true/false
HandlerExceptionResolver 异常解析 Exception 错误视图

8.3 性能优化建议

基于源码分析,以下是Spring MVC性能优化的关键点:

```java @Configuration @EnableWebMvc @ComponentScan(basePackages = "com.example.controller") public class PerformanceOptimizationConfig implements WebMvcConfigurer {

复制代码
/**
 * 优化1: 配置静态资源缓存
 */
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/**")
            .addResourceLocations("classpath:/static/")
            .setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS));
}

/**
 * 优化2: 启用路径匹配优化
 */
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
    configurer.setUseSuffixPatternMatch(false) // 禁用后缀匹配
            .setUseTrailingSlashMatch(false)   // 禁用尾部斜杠匹配
            .setUrlPathHelper(new UrlPathHelper()); // 使用缓存的URL解析
}

/**
 * 优化3: 配置消息转换器【JSON处理优化】
 */
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    // 使用Jackson代替默认的转换器
    MappingJackson2HttpMessageConverter converter = 
        new MappingJackson2HttpMessageConverter();
    
    // 配置Jackson优化
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
    
    converter.setObjectMapper(objectMapper);
    converters.add(converter);
}

/**
 * 优化4: 异步请求处理
 */
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
    configurer.setDefaultTimeout(30000) // 30秒超时
            .setTaskExecutor(new ThreadPoolTaskExecutor()); // 自定义线程池
}

/**
 * 优化5: 拦截器优化【避免不必要的拦截】
 */
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new PerformanceInterceptor())
            .addPathPatterns("/api/**") // 只拦截API路径
            .excludePathPatterns("/api/health/**"); // 排除健康检查
}

/**
 * 性能监控拦截器
 */
private static class PerformanceInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler) {
        request.setAttribute("startTime", System.currentTimeMillis());
        return true;
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request,
相关推荐
商吉婆尼4 小时前
天地图API调用注意事项
java·spring·天地图
种时光的人5 小时前
Java+AI 无缝衔接:Spring AI 聊天模型入门到精通
java·人工智能·spring·ai·spring ai
野生技术架构师6 小时前
Spring Boot 4 与 Spring Framework 7 全面解析:新特性、升级要点与实战指南
spring boot·后端·spring
weixin_704266057 小时前
Spring 注解驱动开发与 Spring Boot 核心知识点梳理
java·spring boot·spring
无名-CODING7 小时前
小白初识 SpringCloud:微服务基础与 SpringCloud 核心作用
spring·spring cloud·微服务
小江的记录本8 小时前
【Spring注解】Spring生态常见注解——面试高频考点总结
java·spring boot·后端·spring·面试·架构·mvc
Predestination王瀞潞8 小时前
Java EE3-我独自整合(第二章:Spring IoC 入门案例)
数据库·spring·java-ee
梁山话事人8 小时前
Spring IOC
java·数据库·spring
计算机学姐9 小时前
基于SpringBoot的新能源充电桩管理系统
java·vue.js·spring boot·后端·mysql·spring·java-ee