HandlerMapping的工作就是爲每個請求找到合適的請求找到一個處理器handler,其實現機制簡單來說就是維持了一個url到Controller關係的Map結構,其提供的實際功能也是根據request請求來獲取具體執行的包含Controller信息的HandlerAdapter。
HandlerMapping接口及實現類如下:
HandlerMapping 接口:接口中主要定義了一個getHandler方法,返回一個HandlerExecutionChain對象springMVC源碼分析--攔截器HandlerExecutionChain(三)
AbstractHandlerMapping 抽象類:
(1)實現了接口的getHandler方法
(2)定義了getHandlerInternal方法,返回HandlerMethod
(3)定義了getHandlerExecutionChain方法,返回HandlerExecutionChain
通過上圖我們可以看到接下來是兩個抽象類及其子類AbstractHandlerMethodMapping和AbstractUrlHandlerMapping
一、AbstractHandlerMethodMapping系列是將具體的Method作爲Handler來使用的,也是我們用的最多的,比如經常使用的@RequestMapping所註釋的方法就是這種Handler,這種Handler是HandlerMethod
二、AbstractUrlHandlerMapping是通過url來進行匹配的,大致原理就是將url與對應的Handler保存在一個map中。
接下來我們會用多篇博客對整個HandlerMapping的實現類進行介紹。
在DispatcherServlet的doDispatch方法中實現如下:
-
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
-
HandlerExecutionChain mappedHandler = null;
-
........
-
mappedHandler = getHandler(processedRequest);
-
........
-
}
getHandler方法的操作就是選擇HandlerMapping,調用getHandler(request)方法獲得HandlerExecutionChain
-
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
-
for (HandlerMapping hm : this.handlerMappings) {
-
if (logger.isTraceEnabled()) {
-
logger.trace(
-
"Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'");
-
}
-
HandlerExecutionChain handler = hm.getHandler(request);
-
if (handler != null) {
-
return handler;
-
}
-
}
-
return null;
-
}
接口HandlerMapping定義的方法很簡單就是一個getHandler方法,採用模板方法模式,很多實現是在子類中具體實現的。
-
-
-
-
-
-
public interface HandlerMapping {
-
-
-
String PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE = HandlerMapping.class.getName() + ".pathWithinHandlerMapping";
-
-
String BEST_MATCHING_PATTERN_ATTRIBUTE = HandlerMapping.class.getName() + ".bestMatchingPattern";
-
-
String INTROSPECT_TYPE_LEVEL_MAPPING = HandlerMapping.class.getName() + ".introspectTypeLevelMapping";
-
-
String URI_TEMPLATE_VARIABLES_ATTRIBUTE = HandlerMapping.class.getName() + ".uriTemplateVariables";
-
-
String MATRIX_VARIABLES_ATTRIBUTE = HandlerMapping.class.getName() + ".matrixVariables";
-
-
String PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE = HandlerMapping.class.getName() + ".producibleMediaTypes";
-
-
-
HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
-
-
}
總結:我們簡單的介紹了一下HandlerMapping及其實現類,簡單來說HandlerMapping的實現機制就是根據request來獲得HandlerExecutionChain,其實就是獲取真正要執行的Controller或者某個具體的方法。HandlerMapping接口提供的唯一的方法就是HandlerExecutionChain getHandler(HttpServletRequest request)