getHandler()
getHandler()会返回目标处理器的执行链
mappedHandler = getHandler(processedRequest);
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
if (this.handlerMappings != null) {
for (HandlerMapping mapping : this.handlerMappings) {
HandlerExecutionChain handler = mapping.getHandler(request);
if (handler != null) {
return handler;
}
}
}
return null;
}
-
handlerMappings:处理器映射,保存了每一个处理器可以处理哪些请求的方法的映射信息。
-
handlerMap:ioc容器启动创建Controller对象的时候,扫描每个处理器可以处理什么请求,保存在HandlerMapping的handlerMap属性中;下一次请求过来,就来看哪个HandlerMapping中有这个请求映射信息就行了。
getHandlerAdapter()
找到目标处理器的适配器,用适配器执行目标方法。
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
if (this.handlerAdapters != null) {
for (HandlerAdapter adapter : this.handlerAdapters) {
//判断处理器是否支持
if (adapter.supports(handler)) {
return adapter;
}
}
}
throw new ServletException("No adapter for handler [" + handler +
"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
}
AnnotationMethodHandlerAdapter:可以解析注解方法的适配器。
处理器里只要有标了注解的方法,就可以用。