springMvc源碼解讀--AbstractUrlHandlerMapping

  • AbstractUrlHandlerMapping系列都是繼承於AbstractUrlHandlerMapping,它是經過URL來進行匹配的,是將URL與對應的handler保存在一個map中,在getHandlerInternal方法中使用URL從map中獲取handler,AbstractUrlHandlerMapping中實現了具體用URL從map中獲取handler的過程,而將map的初始化則交給了具體的子類去完成。這裏的map就是定義在AbstractUrlHandlerMapping中的handlerMap,另外還單獨定義了處理「/」請求的處理器rootHandler。

handler的入口是getHandlerInternal,具體實現以下:
/* Javaapp

@Override
@Nullable
protected Object getHandlerInternal(HttpServletRequest request) throws Exception {
    String lookupPath = getUrlPathHelper().getLookupPathForRequest(request);
    Object handler = lookupHandler(lookupPath, request);
    if (handler == null) {
        // We need to care for the default handler directly, since we need to
        // expose the PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE for it as well.
        Object rawHandler = null;
        if ("/".equals(lookupPath)) {
            rawHandler = getRootHandler();
        }
        if (rawHandler == null) {
            rawHandler = getDefaultHandler();
        }
        if (rawHandler != null) {
            // Bean name or resolved handler?
            if (rawHandler instanceof String) {
                String handlerName = (String) rawHandler;
                rawHandler = obtainApplicationContext().getBean(handlerName);
            }
            validateHandler(rawHandler, request);
            handler = buildPathExposingHandler(rawHandler, lookupPath, lookupPath, null);
        }
    }
    if (handler != null && logger.isDebugEnabled()) {
        logger.debug("Mapping [" + lookupPath + "] to " + handler);
    }
    else if (handler == null && logger.isTraceEnabled()) {
        logger.trace("No handler mapping found for [" + lookupPath + "]");
    }
    return handler;
}

*/
這裏lookupHandler方法用於使用lookupPath從map中查找handler,不過不少時候不能從map中直接get到結果,由於不少handler都是用了pattern的匹配模式,如「/getData/*",這裏的星號能夠表明任意內容而不是真正的匹配URL中的星號,buildPathExposingHandler方法的做用是用於查找到的handler註冊兩個攔截器PathExposingHandlerInterceptor和UriTemplateVariablesHandlerInterceptor,這是兩個內部攔截器,主要做用是將與當前URL實際匹配的pattern、匹配條件,和URL模版參數等設置到request的屬性裏,這樣在後面的處理過程當中能夠直接從request屬性中獲取。ide

相關文章
相關標籤/搜索