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