上文中提到在DispatcherServlet.doDispatch()方法中,通过getHandler()方法获取HandlerExecutionChain对象(处理器执行链)
那么接下来就讲一讲这个方法:
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
Iterator var2 = this.handlerMappings.iterator();
HandlerExecutionChain handler;
do {
if (!var2.hasNext()) {
return null;
}
HandlerMapping hm = (HandlerMapping)var2.next();
if (this.logger.isTraceEnabled()) {
this.logger.trace("Testing handler map [" + hm + "] in DispatcherServlet with name '" + this.getServletName() + "'");
}
handler = hm.getHandler(request);
} while(handler == null);
return handler;
}
getHandler()涉及一个设计模式——拦截过滤器模式,它会从List<HandlerMapping> handlerMappings中遍历查找对应的HandlerMapping对象,并由HandlerMapping对象创建HandlerExecutionChain对象。List<HandlerMapping> handlerMappings是初始化时在initStrategies()方法中完成的(在上一篇DispatcherServlet的初始化过程 提到过)
HandlerMapping的getHandler()方法是一个接口
实现类为AbstractHandlerMapping.class
public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
// 根据请求查找对应的handler
Object handler = this.getHandlerInternal(request);
if (handler == null) {
// 没有找到,则会使用getDefaultHandler()方法获取默认的处理器
handler = this.getDefaultHandler();
}
if (handler == null) {
return null;
} else {
if (handler instanceof String) {
String handlerName = (String)handler;
handler = this.getApplicationContext().getBean(handlerName);
}
HandlerExecutionChain executionChain = this.getHandlerExecutionChain(handler, request);