vert.x-web是基於vertx的一套http服務框架。官網以下:html
vert.x-webjava
vert.x-web是不一樣於j2ee標準的web服務,基於netty容器,異步執行,在思想上更接近於node.js。寫多了各類ssh/ssm框架以後,體驗一下不一樣的口味也是很不錯的。node
從某種角度上來講,這是一套特別適合於「學習」的框架。官方的文檔不盡詳細,不少地方須要本身領會。不過官方的demo給的很齊全,並且源碼真的是十分簡單易懂,clone下來看一遍也是沒問題的,可以從裏面學到不少好東西。vert.x在不少思想和java新特性的應用上都是十分領先的。android
其實vert.x自己就是支持http協議的,因此vert.x-web說究竟是vert.x的一個擴展類庫,封裝並實現了一些經常使用的web功能。在代碼的難度上天然就降低了不少。git
下面是官網給出的hello world程序,有必定node.js基礎的同窗必定看起來十分熟悉:github
HttpServer server = vertx.createHttpServer();
server.requestHandler(request -> {
// This handler gets called for each request that arrives on the server
HttpServerResponse response = request.response();
response.putHeader("content-type", "text/plain");
// Write to the response and end it
response.end("Hello World!");
});
server.listen(8080);
複製代碼
提及來,由於脫離了熟悉的tomcat等servlet容器,vert.x-web看起來更接近於一個乾巴巴的骨架,不少基礎的工做都須要本身來實現,好比返回html頁面什麼的。web
不過話說回來,java的東西翻來覆去都離不開java se的套路,搞一遍vert.x對於理解web服務器的某些原理也是很是有益的。spring
要想學習vert.x-web,首先要忘掉servlet什麼的東西,而後忘掉spring-mvc什麼的web框架。編程
接下來必需要了解幾個基本的類:api
下面咱們來講說這些東西。
看名字就知道這個類很NB了是吧:-D
Vertx類是Vert.x框架的核心api入口。更形象的說,它就是「當前這個應用」,或者說android中的Application類。服務的整個生命週期都離不開這個類的實例。在寫代碼的時候你會發現時刻都會遇到這個類。
另外當咱們須要寫一些阻塞的代碼的時候,也須要用到這個類來建立一個阻塞的任務。
Verticle是Vert.x框架中的一個核心概念。若是說Vertx是「應用」,那麼Verticle就是應用中的一個服務。
另外一個更形象一點的比喻,若是說Vertx是一個機架,那麼Veticle就是機架上的服務器。
然而,由於咱們在這裏只要初學vert.x-web框架,這個東西只要知道它的存在就差很少了。一樣想深刻學習vert.x,請到官網仔細閱讀相關文檔。
恩恩,這個就是咱們的Http服務器了。
可是你不要覺得這就開始學習到web了!其實你仔細看一下源碼就知道,HttpServer這個類仍是屬於vertx.core包下的東西。
這個就是vert.x原封提供的http服務器了。估計是由於netty的強大功能,翻看一下文檔能夠發現vert.x提供了tcp/http等協議的服務端和客戶端實現,甚至還有個dns client能夠用。
可是HttpServer須要瞭解一點東西。
HttpServer有兩個須要用到的api:
第二個就是開始監聽指定端口,沒必要多說,這裏說說第一個。
若是有Netty基礎的同窗必定對Netty的各類Handler印象深入,那麼Vert.x這個骨子裏寫着Netty的框架也離不開這個。從Handler開始,咱們就開始進入本身的業務邏輯。
Router是真正由Vert.x-web提供的一個Handler。由此其實也可見Netty/Vert.x架構的強大擴展性能。經過不一樣的Handler就能夠實現各類功能。絕不懷疑經過Handler去實現一套servlet api也是沒問題的。不過在此並無。
Router提供了路由功能:
router.route("/user/info").handler(this::info);
複製代碼
經過router方法指定一個路徑,handler方法爲這個路由提供一個Handler進行處理。
這裏可能有些初學的朋友對於Handler這種東西有點懵了。Handler翻譯爲「處理機,處理者」,它是一個接口。實現了這個接口,說明這個類能夠對傳入的數據進行一些處理工做。並不侷限於程序的某一層。
若是有用過JFinal的朋友會發現RoutingContext的api和JFinal的Controller類有殊途同歸之處。然而不一樣的是JFinal是對servlet的封裝,而RoutingContext則是從根本上的另外一套api。
RoutingContext提供了常見的獲取請求參數的方法,也提供了返回數據的方法。可是從另外一面來講,它並無直接提供返回頁面的方法。也就是說不能如spring等框架同樣直接返回一個視圖。
不過框架提供了一個靜態資源路由 StaticHandler ,能夠經過此路由直接訪問靜態頁面資源,而若是須要用到FreeMarker等模板渲染框架,就須要本身在代碼上實現了。
斷斷續續寫了很久才完成這一部分,期間對於vertx框架又有了更深刻的理解。
vertx並非針對特定應用的框架,它其實很大程度上就是netty的一個最佳實踐的封裝。在java上實現了相似於node.js的異步處理框架。
學習vertx的最好方法其實就是去看周邊項目的源碼,好比vertx-web,vertx-jdbc等,在官網均有連接。代碼十分簡潔優美。讀過這些源碼對於學習和鍛鍊異步編程的思惟習慣有很大幫助。
這一部分就先簡單介紹一下這個框架,下一部分將會用實際代碼來搭建一個登錄流程,會涉及到vertx-web的各個功能。