springMVC源碼分析--HandlerMapping(一)

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方法中實現如下:
[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {  
  2.     HandlerExecutionChain mappedHandler = null;   
  3.     ........  
  4.     mappedHandler = getHandler(processedRequest);  
  5.     ........              
  6. }  
getHandler方法的操作就是選擇HandlerMapping,調用getHandler(request)方法獲得HandlerExecutionChain
[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {  
  2.         for (HandlerMapping hm : this.handlerMappings) {  
  3.             if (logger.isTraceEnabled()) {  
  4.                 logger.trace(  
  5.                         "Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'");  
  6.             }  
  7.             HandlerExecutionChain handler = hm.getHandler(request);  
  8.             if (handler != null) {  
  9.                 return handler;  
  10.             }  
  11.         }  
  12.         return null;  
  13.     }  
接口HandlerMapping定義的方法很簡單就是一個getHandler方法,採用模板方法模式,很多實現是在子類中具體實現的。
[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. /** 
  2.  *handlerMapping的工作就是爲了請求找到合適的處理器handler 
  3.  *最常用的兩個handlerMapping:BeanNameURLHandlerMapping:查找spring容器中和請求的url同名的bena 
  4.  *SimpleUrlHandlerMapping:配置請求url和handler的映射關係 
  5.  */  
  6. public interface HandlerMapping {  
  7.   
  8.       
  9.     String PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE = HandlerMapping.class.getName() + ".pathWithinHandlerMapping";  
  10.   
  11.     String BEST_MATCHING_PATTERN_ATTRIBUTE = HandlerMapping.class.getName() + ".bestMatchingPattern";  
  12.   
  13.     String INTROSPECT_TYPE_LEVEL_MAPPING = HandlerMapping.class.getName() + ".introspectTypeLevelMapping";  
  14.   
  15.     String URI_TEMPLATE_VARIABLES_ATTRIBUTE = HandlerMapping.class.getName() + ".uriTemplateVariables";  
  16.   
  17.     String MATRIX_VARIABLES_ATTRIBUTE = HandlerMapping.class.getName() + ".matrixVariables";  
  18.   
  19.     String PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE = HandlerMapping.class.getName() + ".producibleMediaTypes";  
  20.   
  21.     //獲得HandlerExecutionChain  
  22.     HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;  
  23.   
  24. }  

總結:我們簡單的介紹了一下HandlerMapping及其實現類,簡單來說HandlerMapping的實現機制就是根據request來獲得HandlerExecutionChain,其實就是獲取真正要執行的Controller或者某個具體的方法。HandlerMapping接口提供的唯一的方法就是HandlerExecutionChain getHandler(HttpServletRequest request)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章