摘要:系列都是繼承于,它是通過來進行匹配的,是將與對應(yīng)的保存在一個中,在方法中使用從中獲取,中實現(xiàn)了具體用從中獲取的過程,而將的初始化則交給了具體的子類去完成。這里的就是定義在中的,另外還多帶帶定義了處理請求的處理器。
AbstractUrlHandlerMapping系列都是繼承于AbstractUrlHandlerMapping,它是通過URL來進行匹配的,是將URL與對應(yīng)的handler保存在一個map中,在getHandlerInternal方法中使用URL從map中獲取handler,AbstractUrlHandlerMapping中實現(xiàn)了具體用URL從map中獲取handler的過程,而將map的初始化則交給了具體的子類去完成。這里的map就是定義在AbstractUrlHandlerMapping中的handlerMap,另外還多帶帶定義了處理“/”請求的處理器rootHandler。
handler的入口是getHandlerInternal,具體實現(xiàn)如下:
/* Java
@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到結(jié)果,因為很多handler都是用了pattern的匹配模式,如“/getData/*",這里的星號可以代表任意內(nèi)容而不是真正的匹配URL中的星號,buildPathExposingHandler方法的作用是用于查找到的handler注冊兩個攔截器PathExposingHandlerInterceptor和UriTemplateVariablesHandlerInterceptor,這是兩個內(nèi)部攔截器,主要作用是將與當前URL實際匹配的pattern、匹配條件,和URL模版參數(shù)等設(shè)置到request的屬性里,這樣在后面的處理過程中可以直接從request屬性中獲取。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/72597.html
摘要:定義了一個變量,將所有的和的對應(yīng)關(guān)系放在里面,最后注冊在父類里面,創(chuàng)建時通過重寫調(diào)用方法完成的注冊,內(nèi)部又調(diào)用父類的方法將我們注冊的的注冊到之中。 SimpleUrlHandlerMapping定義了一個map變量,將所有的URL和handler的對應(yīng)關(guān)系放在里面,最后注冊在父類里面,SimpleUrlHandlerMapping創(chuàng)建時通過重寫initApplicationConte...
摘要:它的作用是根據(jù)找到相應(yīng)的處理器和接口里面只有一個方法只要使用就會返回一個,當然我們可以定義自己的實現(xiàn)類來實現(xiàn)。 HandlerMapping:它的作用是根據(jù)request找到相應(yīng)的處理器handler和interceptors,HandlerMapping接口里面只有一個方法HandlerExecutionChain getHandler(HttpServletRequest req...
摘要:由于抽象類重寫了父類的方法,所以此時會調(diào)用的方法,在該方法中通過調(diào)用父類的方法,該方法通過模板方法模式最終調(diào)到類的方法。分析該類間接實現(xiàn)了接口,直接實現(xiàn)該接口的是抽象類,映射與請求。 概述 在前一章https://segmentfault.com/a/1190000014901736的基礎(chǔ)上繼續(xù)分析,主要完成SimpleUrlHandlerMapping類的原理。 本系列文章是基于Sp...
摘要:與類圖對比,類繼承自抽象類,其又繼承自抽象類,再往上繼承關(guān)系與一致。創(chuàng)建初始化上一章我們分析了的創(chuàng)建初始化過程,的創(chuàng)建初始化過程與一樣,方法的入口在抽象類中的方法。至此,代碼編寫完畢。 概述 本節(jié)我們繼續(xù)分析HandlerMapping另一個實現(xiàn)類BeanNameUrlHandlerMapping,從類的名字可知,該類會根據(jù)請求的url與spring容器中定義的bean的name屬性值...
摘要:是開源的微服務(wù)網(wǎng)關(guān),它可以和,等組件配合使用,網(wǎng)上也有很多如何使用的文章,我們也在生產(chǎn)環(huán)境使用了,所以讀了下的源碼,下面把它分享出來,與大家探討下核心原理。 Zuul是Netflix開源的微服務(wù)網(wǎng)關(guān),它可以和Eureka,consul,Ribbon,Hystrix等組件配合使用,網(wǎng)上也有很多如何使用zuul的文章,我們也在生產(chǎn)環(huán)境使用了,所以讀了下zuul的源碼,下面把它分享出來,與大...
閱讀 2164·2021-11-11 16:55
閱讀 1685·2019-08-30 15:54
閱讀 2817·2019-08-30 15:53
閱讀 2211·2019-08-30 15:44
閱讀 1152·2019-08-30 15:43
閱讀 965·2019-08-30 11:22
閱讀 1942·2019-08-29 17:20
閱讀 1566·2019-08-29 16:56