SpringMVC 如何將請求找到匹配的處理方法

2021-08-21 23:40:17 字數 2825 閱讀 6292

在springmvc的模式下,瀏覽器的乙個請求是如何對映到指定的controller的呢?

在web伺服器啟動時,spring容器中會儲存乙個map的資料結構,裡邊記錄這controller和url請求中的對應關係。那麼這個map中的資料是如何來的呢?

protected void inithandlermethods() 

//獲取spring容器裝配的所有bean的名稱

string beannames = (this.detecthandlermethodsinancestorcontexts ?

//遍歷

for (string beanname : beannames)

} handlermethodsinitialized(gethandlermethods());

}

protected void detecthandlermethods(final object handler) 

else

} });

for (method method : methods)

}

@override

//該方法接收兩個引數,乙個是具體方法,乙個是方法所在的類

if (methodannotation != null)

} return info;

}

string patterns = resolveembeddedvaluesinpatterns(annotation.value());

annotation.name(),

new patternsrequestcondition(patterns, geturlpathhelper(), getpathmatcher(),

this.usesuffixpatternmatch, this.usetrailingslashmatch, this.fileextensions),

new requestmethodsrequestcondition(annotation.method()),

new paramsrequestcondition(annotation.params()),

new headersrequestcondition(annotation.headers()),

new consumesrequestcondition(annotation.consumes(), annotation.headers()),

new producesrequestcondition(annotation.produces(), annotation.headers(), this.contentnegotiationmanager),

customcondition); }

//初始化乙個handlermethod,包含一些類的名稱和方法等資訊

handlermethod newhandlermethod = createhandlermethod(handler, method);

//判斷是否有handlermethods是否有重複資料,有則拋異常,沒有則將其加入handlermethods map中

if (oldhandlermethod != null && !oldhandlermethod.equals(newhandlermethod))

if (logger.isinfoenabled())

//將沒有*號和問好的pattern加入到urlmap中

for (string pattern : patterns)

}//維護乙個namemap,key為名字,格式為congroller類大寫字母+#+方法名

//比如testbank類的getbank方法,可以為tb#getbank

if (this.namingstrategy != null) }

由上述registerhandlermethod方法我們可以看出,該方法共維護了三個map分別是:

namemap: key為名字,格式為congroller類大寫字母+#+方法名,比如testbank類的getbank方法,key為tb#getbank

上述三個map在後續匹配瀏覽器請求用哪個方法來處理時會重點用到。

那麼dispatcherservlet是如何處理乙個請求的呢?

//如果urlmap中沒有找到直接匹配的方法

if (matches.isempty())

if (!matches.isempty())

//如果成功匹配的方法只有乙個,拿這個方法返回。如果匹配到多個方法,取最匹配的前兩個進行比較。

//如果比較結果為0,則丟擲沒有找到唯一合適處理方法的異常

match bestmatch = matches.get(0);

if (matches.size() > 1) ");}}

return bestmatch.handlermethod;

} else

}從上述**可以看出,程式會先從this.urlmap中尋找是否有匹配的方法,那麼這個urlmap中的資料是從什麼時候載入的呢?我們網上翻看registerhandlermethod方法,在web伺服器啟動時,該方法初始化了urlmap中的資料。

通過上述分析,大致可以了解到spring容器是如何維護url和方法之間的對映關係,以及當收到請求時又是如何將請求匹配到正確的方法的。

如何將表單居中顯示 如何將重複資料突出顯示?

將 中一列資料中重複的,使用特殊顏色突出顯示或者使用一些符號標記出來。例如 乙個 商,可以邀請別的 商加入成為聯合體,報表要顯示所有 商,然後 商最後一列顯示所有聯合體,當聯合體 商跟別的 商重複時要突出顯示,並且加星號。用設計器自帶 demo 資料來源中的訂單明細資料表,使用嚮導建立一張分組報表,...

如何將FBReader引入MID

1.從fbreader的官網 得到源 包 這裡用到的是fbreader 0.8.17 2.編譯,執行make,報錯,這是因為其用到了linebreak這個庫,他是負責處理unicode編碼文件的換行問題的。google到linebreak,make,將debugdir裡的 a o全部複製到 usr ...

如何將ProtoBuffer生成Erlang檔案

1.安裝git工具,並將git下的bin目錄新增到path路徑中。2.安裝mingw,並新增到path路徑中。3.從中checkout原始碼。5.編譯我們的protobuffer檔案,假定我們將protobuffer檔案xx.proto複製到gpb bin目錄下,並在此目錄下建立乙個pb目錄,我們在...