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,