HandlerMapper的执行过程中的重要代码:
4.Spring MVC HandlerMapping 代码层面的执行流程
1.找到DispatcherServlet
2.找到doDispatch()方法
asynchronous:异步的
synchronous:同步的
//入参进来一个request
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
//接受request
HttpServletRequest processedRequest = request;
// 处理器执行链
HandlerExecutionChain mappedHandler = null;
//判断是否是多部分请求 解析器 (文件上传)
boolean multipartRequestParsed = false;
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {
try {
// 模型(数据)和视图
ModelAndView err = null;
//异常
Exception dispatchException = null;
try {
//指的是 DispatcherServlet 的实例 看看请求是不是多部分请求
<form enctype="multipart/form-data"> 表单有文件域 上传文件了
processedRequest = this.checkMultipart(request);
multipartRequestParsed = processedRequest != request;
mappedHandler = this.getHandler(processedRequest);
3. protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
//handlerMappings是单列集合 。只能是Set 或者 List
Iterator var2 = this.handlerMappings.iterator();
HandlerExecutionChain handler;
if(!var2.hasNext()) return null;
// 每next()拿到一个HandlerMapping实例
HandlerMapping hm = (HandlerMapping)var2.next();
handler = hm.getHandler(request);
return handler;
}
4.
1.找到DispatcherServlet
2.找到doDispatch()方法
asynchronous:异步的
synchronous:同步的
//入参进来一个request
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
//接受request
HttpServletRequest processedRequest = request;
// 处理器执行链
HandlerExecutionChain mappedHandler = null;
//判断是否是多部分请求 解析器 (文件上传)
boolean multipartRequestParsed = false;
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {
try {
// 模型(数据)和视图
ModelAndView err = null;
//异常
Exception dispatchException = null;
try {
//指的是 DispatcherServlet 的实例 看看请求是不是多部分请求
<form enctype="multipart/form-data"> 表单有文件域 上传文件了
processedRequest = this.checkMultipart(request);
multipartRequestParsed = processedRequest != request;
mappedHandler = this.getHandler(processedRequest);
3. protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
//handlerMappings是单列集合 。只能是Set 或者 List
Iterator var2 = this.handlerMappings.iterator();
HandlerExecutionChain handler;
if(!var2.hasNext()) return null;
// 每next()拿到一个HandlerMapping实例
HandlerMapping hm = (HandlerMapping)var2.next();
handler = hm.getHandler(request);
return handler;
}
4.
//我们知道,HandlerMapping是一个接口 ,找实现类 Ctrl+H
public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
Object handler = this.getHandlerInternal(request);
if(handler == null) {
handler = this.getDefaultHandler();
}
if(handler == null) {
return null;
} else {
if(handler instanceof String) {
String handlerName = (String)handler; // /hello
handler = this.getApplicationContext().getBean(handlerName);
}
return this.getHandlerExecutionChain(handler, request);
}
}
public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
Object handler = this.getHandlerInternal(request);
if(handler == null) {
handler = this.getDefaultHandler();
}
if(handler == null) {
return null;
} else {
if(handler instanceof String) {
String handlerName = (String)handler; // /hello
handler = this.getApplicationContext().getBean(handlerName);
}
return this.getHandlerExecutionChain(handler, request);
}
}
5.
getHandlerExecutionChain中的方法:
protected HandlerExecutionChain getHandlerExecutionChain(Object handler, HttpServletRequest request) {
//处理器执行链
HandlerExecutionChain chain = handler instanceof HandlerExecutionChain?(HandlerExecutionChain)handler:new HandlerExecutionChain(handler);
String lookupPath = this.urlPathHelper.getLookupPathForRequest(request);
//返回Iterator 类型
Iterator var5 = this.adaptedInterceptors.iterator();
while(var5.hasNext()) {
HandlerInterceptor interceptor = (HandlerInterceptor)var5.next();
if(interceptor instanceof MappedInterceptor) {
MappedInterceptor mappedInterceptor = (MappedInterceptor)interceptor;
if(mappedInterceptor.matches(lookupPath, this.pathMatcher)) {
chain.addInterceptor(mappedInterceptor.getInterceptor());
}
} else {
chain.addInterceptor(interceptor);
}
}
return chain;
}