一、 簡介
vert.x-web是基於vertx的一套http服務框架。官網如下:
vert.x-web是不同於j2ee標準的web服務,基於netty容器,非同步執行,在思想上更接近於node.js。寫多了各種ssh/ssm框架之後,體驗一下不同的口味也是很不錯的。
從某種角度上來說,這是一套特別適合於“學習”的框架。官方的文件不盡詳細,很多地方需要自己領會。不過官方的demo給的很齊全,而且原始碼真的是十分簡單易懂,clone下來看一遍也是沒問題的,能夠從裡面學到很多好東西。vert.x在很多思想和java新特性的應用上都是十分領先的。
其實vert.x本身就是支援http協議的,所以vert.x-web說到底是vert.x的一個擴充套件類庫,封裝並實現了一些常用的web功能。在程式碼的難度上自然就下降了很多。
下面是官網給出的hello world程式,有一定node.js基礎的同學一定看起來十分熟悉:
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頁面什麼的。
不過話說回來,java的東西翻來覆去都離不開java se的套路,搞一遍vert.x對於理解web伺服器的某些原理也是非常有益的。
二、基本類
要想學習vert.x-web,首先要忘掉servlet什麼的東西,然後忘掉spring-mvc什麼的web框架。
接下來必須要了解幾個基本的類:
- Vertx
- Verticle
- HttpServer
- Handler
- Router
- RoutingContxt
下面我們來說說這些東西。
Vertx & Verticle
看名字就知道這個類很NB了是吧:-D
Vertx類是Vert.x框架的核心api入口。更形象的說,它就是“當前這個應用”,或者說android中的Application類。服務的整個生命週期都離不開這個類的例項。在寫程式碼的時候你會發現時刻都會遇到這個類。
另外當我們需要寫一些阻塞的程式碼的時候,也需要用到這個類來建立一個阻塞的任務。
Verticle是Vert.x框架中的一個核心概念。如果說Vertx是“應用”,那麼Verticle就是應用中的一個服務。
另一個更形象一點的比喻,如果說Vertx是一個機架,那麼Veticle就是機架上的伺服器。
然而,因為我們在這裡只要初學vert.x-web框架,這個東西只要知道它的存在就差不多了。同樣想深入學習vert.x,請到官網仔細閱讀相關文件。
HttpServer & Handler & Router
恩恩,這個就是我們的Http伺服器了。
但是你不要以為這就開始學習到web了!其實你仔細看一下原始碼就知道,HttpServer這個類還是屬於vertx.core包下的東西。
這個就是vert.x原封提供的http伺服器了。估計是因為netty的強大功能,翻看一下文件可以發現vert.x提供了tcp/http等協議的服務端和客戶端實現,甚至還有個dns client可以用。
但是HttpServer需要了解一點東西。
HttpServer有兩個需要用到的api:
- HttpServer.requestHandler(Handler handler)
- HttpServer.listen(port)
第二個就是開始監聽指定埠,不必多說,這裡說說第一個。
如果有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翻譯為“處理機,處理者”,它是一個介面。實現了這個介面,說明這個類可以對傳入的資料進行一些處理工作。並不侷限於程式的某一層。
RoutingContext
如果有用過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的各個功能。