在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目錄,我們在...