JavaScript 世界提供了有用且有趣的 Web 框架,這是毫無疑問的。對于 Java 開發(fā)人員,有一個有趣的替代方案——開源Vaadin框架。有了它,您可以僅使用 Java 編程語言輕松地為 Web實現(xiàn)圖形用戶界面(GUI)。無需編寫一行 HTML 或 JavaScript。一張圖片勝過千言萬語:
Vaadin 如何工作?
在上一個屏幕截圖中,您可以在左側(cè)看到一個 Java 類。此代碼在服務(wù)器上運行,例如 Apache Tomcat、Eclipse Jetty 或任何其他 servlet 容器。
您可以使用框架提供的 API 來創(chuàng)建用戶界面 (UI)組件,例如文本字段、組合框、數(shù)據(jù)網(wǎng)格、日期選擇器、上傳字段等。您可以組合這些組件來構(gòu)建視圖(也稱為頁面或 UI),使用布局垂直、水平放置 UI 組件,或使用 CSS 以任何自定義方式放置 UI 組件。
在前面的示例中,我們創(chuàng)建了 aTextField并且 aButton都添加到了 a 中VerticalLayout。視圖準(zhǔn)備就緒后,您可以使用@Route注釋通過 URL 公開它。在這個例子中,我們在將其提供的http://本地主機(jī):8080 /你好用@Route("hello")。
Vaadin 應(yīng)用程序是一個 Java Web 應(yīng)用程序。該框架提供了一個為您處理 HTTP 請求和響應(yīng)的Servlet實現(xiàn) ( VaadinServlet)。該 servlet 掃描標(biāo)有@Route注釋的 Java 類以在瀏覽器中顯示正確的視圖。第一次請求 Vaadin 應(yīng)用程序時,Vaadin 使用一個輕量級 JavaScript 文件作為客戶端引擎進(jìn)行響應(yīng)。該引擎負(fù)責(zé)處理瀏覽器中的事件并以 JSON 消息的形式將它們發(fā)送到服務(wù)器。該VaadinServlet處理的請求和JSON響應(yīng)同樣返回給客戶端引擎。引擎然后根據(jù)此消息更新頁面中需要更新的元素(如果有)。
如果客戶端-服務(wù)器通信是對話,它看起來像這樣:
(用戶單擊瀏覽器中的按鈕)
客戶端引擎:嘿 VaadinServlet,用戶單擊了 ID 為 5 的按鈕。
VaadinServlet:當(dāng)然。讓我檢查一下那個按鈕上是否有任何點擊偵聽器......是的,有一個,讓我們執(zhí)行偵聽器......完成。好的客戶端引擎,似乎偵聽器想要添加帶有“感謝點擊”文本的通知。
客戶端引擎:我將使用瀏覽器中的 DOM 將通知添加到頁面。
那么上面這個對話當(dāng)然是一種簡化,但是你需要去明白了這個面的相關(guān)原理。
在幕后,Vaadin 使用 HTTP 會話來存儲組件樹。這包含 UI 的狀態(tài)。諸如哪些組件構(gòu)成視圖以及它們的狀態(tài)是什么(啟用/禁用、標(biāo)題、值等)。這提供了一個值得一提的安全層。由于 UI 邏輯駐留在服務(wù)器中,因此不會暴露給攻擊者。驗證在服務(wù)器上執(zhí)行。例如,如果 aButton被禁用(使用setEnabled(false)),這不僅僅是瀏覽器中的裝飾功能——服務(wù)器不會在添加到未啟用按鈕的點擊偵聽器中運行任何邏輯,從而防止攻擊者使用開發(fā)人員工具瀏覽器更改啟用狀態(tài)或調(diào)用VaadinServlet以模擬單擊事件。
Vaadin 可以免費使用嗎?
是的。Vaadin 是在Apache License 2.0下發(fā)布的開源框架。您無需購買任何東西即可使用它構(gòu)建成熟的 Web 應(yīng)用程序。
有一些商業(yè)組件可以提高生產(chǎn)力,但它們是可選的。例如,有一個可視化設(shè)計器和一個 CRUD 組件可以幫助您更快地構(gòu)建視圖。您可以在訂閱前免費試用這些組件。
Vaadin 是 JSP 和 JSF 的替代品嗎?
是的。它可以用作 JSP、JSF 甚至 JavaScript 框架(如 Angular)的替代品。許多 Vaadin 客戶已成功從這些技術(shù)遷移到 Vaadin。
Vaadin 是否支持 Spring 和 Jakarta EE?
是的。Vaadin 與Spring和Jakarta EE(以前稱為 Java EE)有官方集成。當(dāng)您使用Spring Initializr創(chuàng)建新的 Spring Boot 項目時,您可以將 Vaadin 添加為依賴項。對于 Jakarta EE,您可以下載一個使用 Jakarta EE的簡單Hello, World示例。在撰寫本文時,僅支持 Jakarta EE 版本 8。