Vert Core 為vertx-web模塊提供了什么依賴?
? ?先來看段最原始的 vert core 提供的http 開發(fā)示例:
? ? ?首先,vertx 創(chuàng)建HttpServer,然后設置回調處理器hander涎拉,并傳入request參數(shù)(request提供了大量方法,基本跟傳統(tǒng)Serverlet Request類似)翼岁,最后設置服務器監(jiān)聽端口开财。然后運行訪問8080端口,頁面顯示“hello world”惹悄。
? ??Vert 依賴core包提供socket 通信能力以及http協(xié)議的編碼解碼功能(core 包源碼有具體實現(xiàn))春叫,最后留給用戶的只剩下處理器hander以及已經封裝好數(shù)據(jù)的HttpServerRequest。所以vert.x web開發(fā)的重要關注點就在這兩個東西泣港,其中HttpServerRequest將貫穿整個web模塊的始終暂殖。
? ? 上面示例,不管你訪問后綴是多少当纱,返回的結果都是一樣的比如:http://localhost:8080/{x},x隨便寫什么呛每。假如現(xiàn)在有個需求,需要根據(jù)不同的訪問后綴返回對應的數(shù)據(jù)坡氯,怎么實現(xiàn)晨横?首先我們要獲取到用戶訪問的path,然后根據(jù)path去匹配結果箫柳,偽代碼如下:
? ? ?if(path 匹配 “path1”){
? ? ? ? ? ? ?返回 “path1”手形;
? ? ? }else if(path 匹配 “path2”){
? ? ? ? ? ? 返回 “path2”;
? ? ? }......
? ? path 哪來悯恍?HttpServerRequest提供了獲取請求path的方法库糠,這個類封裝了所有用戶請求行為,比如請求路徑坪稽,參數(shù)曼玩,cookie等等鳞骤。在看上面例子窒百,回調處理hander黍判,并且傳入了HttpServerRequest參數(shù),方法體就是用戶需要實現(xiàn)的具體業(yè)務邏輯篙梢,比如操作數(shù)據(jù)庫進行業(yè)務處理顷帖,然后返回結果給客戶端等等。
? ? 回調函數(shù)是vert core 觸發(fā)的渤滞,上層調用并不需要關心贬墩。大概流程:瀏覽器發(fā)送請求->vert core監(jiān)聽端口接收數(shù)據(jù)->http 協(xié)議解碼,封裝HttpServerRequest->觸發(fā)回調函數(shù),處理完返回結果->vert core http協(xié)議編碼->返回結果到瀏覽器妄呕。
? ? 到目前為止陶舞,還沒提到半點vertx-web的功能。也就是說沒有vertx-web,vertx core也是完全可以開發(fā)web應用的绪励,他們關系跟severlet和 spring mvc類似肿孵,后者是對前者的進一步封裝,目的是為了簡化開發(fā)疏魏,提高效率停做。
? ? 在回過頭來看上面的偽代碼,假如有幾十個幾百個請求后綴再加上業(yè)務邏輯代碼大莫,這樣if else 的寫下去蛉腌,代碼完全是一坨混雜在一起,直覺告訴你這樣肯定是不行的只厘。好在 core包提供了最為關鍵的一個類HttpServerRequest以及函數(shù)入口烙丛。
? ? 好啦,現(xiàn)在我們的處境是:客戶端每次發(fā)送請求之后羔味,我們都能獲取到request蜀变,request里面完全封裝了用戶請求數(shù)據(jù),比如請求方法介评,請求參數(shù)库北,請求路徑等。獲取到request之后们陆,我們需要通過用戶請求的path分別做相應的業(yè)務處理寒瓦,我們肯定不會按照上面那樣 if else的去判斷區(qū)分。我們需要一個更“自動化”的東西坪仇,完成這些事杂腰,而我們只需關心自己的具體業(yè)務實現(xiàn)(spring mvc就做的很好)。在這樣的驅動下椅文,vertx-web也就登上歷史的舞臺了(當然喂很,假如用的不爽惜颇,也完全可以自己寫個web模塊)。
? ? ? 額少辣。凌摄。有點跑題了,現(xiàn)在來看下HttpServerRequest漓帅,它是個接口锨亏,在core包中有具體實現(xiàn),request相關的類并不是vertx-web提供的忙干,都在core里面的http包下器予。所以,request壓根就不是 web模塊中的源碼捐迫。但這個類是core和web模塊通信的橋廊乾翔,地位十分重要,所以也就在這Vert.x Web模塊源碼分析第一篇做個基本介紹施戴,但不展開源碼分析反浓,因為這涉及到http編碼解碼等一系列東西,不在web模塊分析的范疇暇韧。
? ? ? HttpServerRequest可以理解為對http協(xié)議字段的功能性封裝勾习,每次用戶發(fā)送請求,所有相關的請求行為全部會記錄到HttpServerRequest懈玻,比如http 頭部巧婶,host,parameter等等涂乌。具體可以參數(shù)api 文檔艺栈。后續(xù)章節(jié)會涉及到HttpServerRequest部分接口,具體到時候在講解湾盒。
PS:結束之前說個比較重要的類
? ?在vert中有許都地方用到 Hander類湿右,源碼
@FunctionalInterface
public?interface Handler<E>{
void handle(E event);
}
其中@FunctionalInterface是java8新加的一個注解,用于說明該接口是函數(shù)式接口
之前示例代碼中的server.requestHandler()的參數(shù)就是具體實現(xiàn)罚勾。
server.requestHandler(request -> {
? ?HttpServerResponse response = request.response();
? response.putHeader("content-type","text/plain");
? ?response.end("Hello World!");
});
因為Hander<E>使用了泛型毅人,幾乎所有Vert.x Hander類型的功能都是基于這個跟接口實現(xiàn)回調,其中E可以根據(jù)具體業(yè)務變化尖殃,在之后章節(jié)源碼分析中有大量實現(xiàn)丈莺。