發(fā)布于:2021-01-25 09:42:48
0
161
0
如果你想從頭開始創(chuàng)建一個UI工具包,它看起來一點也不像DOM。Web技術(shù)確實不是為應用程序開發(fā)而設(shè)計的,而是為富文本表示而設(shè)計的。事實證明,對于更靜態(tài)的內(nèi)容(如網(wǎng)站),基于標記的表示方式更為優(yōu)越,但應用程序的情況則有所不同。在計算機圖形用戶界面的早期階段,用戶界面框架并不是偶然形成“基于組件”的庫。這些UI庫已經(jīng)開發(fā)了幾十年,但是基于組件的UI框架的基本概念仍然是創(chuàng)建應用程序最強大的方法。
但是Swing、SWT、Qt和類似的桌面UI框架與web應用相比有一個主要問題:它們要求您在客戶機上安裝特殊的軟件。正如我們在互聯(lián)網(wǎng)時代學到的,這可能是一個大問題。用戶現(xiàn)在使用的應用程序種類繁多,安裝所有這些應用程序,尤其是維護這些應用程序,將成為IT部門的負擔。
像Java的Applet/javawebstart支持(還有Swing或JavaFX)和Flash這樣的瀏覽器插件是傳統(tǒng)的解決方法,可以避免在工作站上安裝實際的軟件。但其中著名的安全漏洞,尤其是過時的軟件,可能會成為一個巨大的問題,你的IT部門現(xiàn)在最有可能反對安裝任何類型的第三方瀏覽器插件。對他們來說,只維護一個瀏覽器應用程序要容易得多。這就是為什么純web應用正在征服當今最復雜的應用領(lǐng)域的根本原因之一。
歡迎來到“奇妙”的網(wǎng)絡應用世界
即使對于有經(jīng)驗的桌面開發(fā)人員來說,從桌面世界到web開發(fā)也可能是一個巨大的飛躍。開發(fā)web應用程序比開發(fā)基本的桌面應用程序要復雜得多。有很多事情使事情變得復雜,例如客戶機-服務器通信、用于顯示的標記語言和CSS、用于客戶機端的新編程語言(JavaScript)以及許多不同形式的客戶機-服務器通信(基本http、ajax樣式的請求、長輪詢、web套接字等)。事實是,即使使用最現(xiàn)代的web應用框架,web開發(fā)也不像構(gòu)建桌面應用那么容易。
Vaadin框架是一個開源的Java框架,與主流web應用世界中基于組件的Swing UI開發(fā)最為接近。Vaadin是一個基于組件的UI框架,它試圖使web開發(fā)和傳統(tǒng)桌面開發(fā)一樣簡單,最大限度地提高開發(fā)人員的生產(chǎn)力和最終用戶體驗的質(zhì)量。在Vaadin應用程序中,您編寫的實際UI邏輯存在于服務器的JVM中。Vaadin沒有瀏覽器插件,而是有一個內(nèi)置的“瘦客戶機”,可以在使用原始瀏覽器技術(shù)的瀏覽器中高效地呈現(xiàn)UI。高度優(yōu)化的通信通道只將用戶屏幕上真正可見的內(nèi)容發(fā)送到瘦客戶端。完成初始渲染后,客戶端和服務器之間只傳輸兩種方式的增量。
Vaadin框架的體系結(jié)構(gòu)為web開發(fā)挑戰(zhàn)提供了一個抽象概念,大多數(shù)時候,您可能會忘記您正在構(gòu)建一個web應用程序。Vaadin負責處理所有的通信、html標記、css和瀏覽器差異—您可以使用干凈的Java方法將所有精力集中在域問題上,并利用桌面應用程序的經(jīng)驗。
Vaadin使用GWT實現(xiàn)在瀏覽器中運行的“瘦客戶端”。GWT是另一個類似于web開發(fā)的工具,它的核心是Java到JavaScript的“編譯器”。GWT還有一個類似Swing的UI組件庫,但是在GWT中,Java代碼被編譯成JavaScript并在瀏覽器中執(zhí)行。編譯器只支持Java的一個子集,而且它沒有在JVM中運行這一事實會導致一些其他限制,但是在它中的概念也是相同的。在瀏覽器中以白盒的形式運行代碼也會帶來一些安全隱患。
應該注意的架構(gòu)差異
每個架構(gòu)決策都有其優(yōu)點和后果,在UI層中從Swing切換到Vaadin也是如此。
一個應用實例,多個用戶
首先您會注意到,您現(xiàn)在正在數(shù)據(jù)旁邊開發(fā)UI。幾乎所有現(xiàn)代商業(yè)應用程序,包括web和桌面應用程序,都以某種方式將數(shù)據(jù)保存到中央服務器。通常,數(shù)據(jù)被業(yè)務邏輯層“屏蔽”,例如用ejb實現(xiàn)。現(xiàn)在您開始使用vaadinui,EJB,或者您在“后端”中使用的任何技術(shù),都“更接近”UI。它通??梢栽谂c您的vaadinui非常相同的。應用服務器中運行,這使得一些以前很難解決的問題變得微不足道。使用本地EJB既高效又安全。
即使您仍然為EJB使用單獨的應用程序服務器,它們很可能使用快速網(wǎng)絡連接到UI服務器,該網(wǎng)絡可以比典型的客戶機-服務器通信更有效地處理UI和業(yè)務層之間的連接–Vaadin瘦客戶機的網(wǎng)絡要求在大多數(shù)情況下要求較低,因此您的應用程序可以在移動網(wǎng)絡上使用。
從桌面Java到Vaadin的開發(fā)人員很快就會注意到的另一件事是,在服務器端,帶有“static”關(guān)鍵字的字段是完全不同的。許多桌面應用程序使用靜態(tài)字段作為“用戶全局”變量。在服務器上運行的應用程序中,它們是“應用程序全局”,這是一個很大的區(qū)別。應用服務器通常為每個web應用程序(.war文件)使用類加載器,而不是為每個用戶會話使用類加載器。對于“用戶全局”變量,應該使用UI類、VaadinSession、HttpSession或@SessionScoped cdibean中的字段。
一般來說,IT部門維護Web應用程序的成本要低得多。傳統(tǒng)上,它們是在公司的內(nèi)部服務器上運行的,但這個時代的趨勢是將它們托管在PaaS服務中,或者更普遍地托管在“云”中。與在每個用戶的工作站中維護應用程序不同,更新和更改只需要應用到服務器。此外,所有數(shù)據(jù)(不僅僅是共享部分)都保存在服務器上,而服務器的備份更易于處理。當你的用戶的工作站壞了,你可以給他/她一個替換設(shè)備,他們可以繼續(xù)他們的工作。
內(nèi)存和CPU使用集中在服務器上
消極的一面是,以前由用戶工作站完成的一些計算現(xiàn)在被移到了服務器上。CPU命中率通??梢院雎圆挥?,但是如果不考慮這個事實,您可能會面臨一些內(nèi)存限制。另一方面,應用程序內(nèi)存和處理現(xiàn)在主要在服務器上進行,這可能是一件好事。服務器端方法使得處理非常復雜的計算任務成為可能,即使是使用非常普通的手持設(shè)備。當然,這在Swing和中央服務器上也是可能的,但是在Vaadin方法中,這是一個免費的額外特性。
一個典型的Vaadin商業(yè)應用程序每個用戶消耗50-500kB的服務器內(nèi)存,這取決于您的應用程序特性。如果你有一個非常小的應用程序,你可以用更小的數(shù)字來完成,如果你從你的用戶界面引用了大量的數(shù)據(jù),這通常會使事情變得更快更簡單,你可能需要更多的內(nèi)存給每個用戶。
每個用戶的內(nèi)存使用率與javaee標準JSF一致。如果你做了一些基本的計算,你就會明白這對于大多數(shù)典型的應用程序和現(xiàn)代應用服務器來說都不是問題。但是,如果您在應用程序代碼中創(chuàng)建了意外的內(nèi)存泄漏,或者不小心將整個數(shù)據(jù)庫表加載到內(nèi)存中,那么內(nèi)存消耗可能比桌面應用程序更早成為一個問題。從一個用戶會話中意外引用一百萬個基本數(shù)據(jù)庫實體很容易在每個會話中消耗100-200MB的內(nèi)存。這在桌面應用程序中可能仍然可以接受,但是如果您在服務器應用程序中有多個并發(fā)用戶這樣做,您很快就會遇到麻煩。
內(nèi)存問題通常可以很容易地通過使用分頁或從后端將數(shù)據(jù)延遲加載到UI來解決。如今服務器容量也非常便宜,因此購買一臺效率更高的服務器或?qū)贸绦蛉杭蕉鄠€應用程序服務器上,很可能比花幾個小時優(yōu)化應用程序或在其體系結(jié)構(gòu)設(shè)計上做出妥協(xié)要便宜得多。但是,如果您的每個應用程序用戶都需要對大量內(nèi)存數(shù)據(jù)集進行大量分析,那么web應用程序仍然不是您的用例的發(fā)展方向。
如果你的應用程序的內(nèi)存使用比它的開發(fā)成本要重要得多(閱讀:你正在嘗試編寫下一個GMail),那么Vaadin框架可能不是適合你的應用程序的合適工具。如果您仍然想轉(zhuǎn)到web應用程序,在這種情況下,您應該努力實現(xiàn)完全(服務器)無狀態(tài)的應用程序,并將UI邏輯保留在瀏覽器中。GWT(也嵌入到Vaadin中,由Vaadin有限公司支持)是這類應用程序的一個很好的庫。