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