CUBA 7 新特性(上篇)
??
?
三年前,我們宣布了 CUBA 框架的第二個公開的主版本。CUBA 6?是改變游戲規(guī)則的版本 - 框架的許可從私有化變成了公開的 Apache2.0。那些日子里,我們甚至猜不到這個變化會最終將框架帶向何方。隨之而來的是,CUBA社區(qū)開始呈指數(shù)級增長,從中我們學(xué)習(xí)到許多開發(fā)人員可能使用框架的方法(有時甚至是不可能的方法)。現(xiàn)在我們很高興的宣布 CUBA 7?的發(fā)布,通過這個版本,我們希望那些剛剛開始CUBA和Java之旅的社區(qū)成員能更加順利和快樂的成長為熟練的企業(yè)級開發(fā)人員或者Java專家。
?
開發(fā)工具
顯然,CUBA 的成功很大一部分要依賴于 CUBA Studio。它極大的簡化了繁瑣的 Java 企業(yè)級開發(fā)任務(wù),很多地方被簡化成只需要在可視化編輯器進(jìn)行簡單的配置即可,不需要了解Persistence API 或者 Gradle,甚至不需要了解 Spring 就能開發(fā)出來完整的、功能豐富的CRUD 應(yīng)用程序。這一切,Studio就能幫你完成。
以前,Studio 是一個單獨(dú)的 web 應(yīng)用程序,這樣會有一些明顯的局限:
l?首先,Studio 并不是功能完備的 IDE,所以開發(fā)者需要經(jīng)常在 Studio 和 IntelliJ IDEA 或者Eclipse 之間切換,以便在 IDE 中開發(fā)業(yè)務(wù)邏輯,也能更好的利用 IDE 方便的導(dǎo)航、代碼完成功能和其他必要的功能。來回地切換有時候很煩人。
l?其次,Studio 的簡單性是建立在大量的源碼解析和生成的基礎(chǔ)上。所以,要提高代碼生成的能力也就意味著要朝著開發(fā)功能完備的IDE方向努力 - 這個想法太過雄心勃勃了。
最后我們決定依靠另一位巨人的肩膀來解決這些局限。現(xiàn)在 Studio 跟 JetBrains 開發(fā)的IntelliJ IDEA 合并了。現(xiàn)在可以將 Studio 作為 IntelliJ IDEA 的插件安裝或者下載單獨(dú)打包的版本。
?
這個方法為我們開辟了新的視野:
l?能支持其它JVM的開發(fā)語言(首先就是Kotlin)
l?提升了熱部署的能力
l?整個項(xiàng)目中能更直觀的導(dǎo)航
l?更聰明的代碼生成和提醒
現(xiàn)在新的Studio正在積極的開發(fā)中:我們正在移植舊版本的功能。短期計劃還包括使用原生IntelliJ UI重新實(shí)現(xiàn)基于 Web 的設(shè)計器,并改善項(xiàng)目導(dǎo)航體驗(yàn)。
技術(shù)棧升級
跟以前主版本升級一樣,這次底層的技術(shù)棧也做了升級,比如 Java 8/11,Vaadin 8,Spring 5。
默認(rèn)情況下新項(xiàng)目會使用Java 8,但是也可以通過在build.gradle中添加下面的內(nèi)容來指定需要的Java版本:
?
升級到Vaadin 8是個不小的挑戰(zhàn),因?yàn)閂aadin的數(shù)據(jù)綁定API發(fā)生了很大的破壞性變化。但使用CUBA的開發(fā)者很幸運(yùn),因?yàn)镃UBA為開發(fā)者提供了統(tǒng)一封裝的自有API層,屏蔽了底層Vaadin的內(nèi)部結(jié)構(gòu)。CUBA開發(fā)團(tuán)隊(duì)做了大量的工作,重新實(shí)現(xiàn)了很多內(nèi)部邏輯以保持CUBA自有的API不變化。也就是說,這很好的保持了CUBA框架的兼容性,不需要做任何重構(gòu)就可以直接移植到CUBA 7并享受Vaadin 8帶來的好處。
依賴庫的完整升級列表可以在官方的 release notes?中找到。
新的界面API
這一小節(jié)也可以稱為 “第一版界面API”,因?yàn)镃UBA之前沒有任何官方的聲明在web客戶端層有API存在。界面API基于框架的歷史,也基于我們最初的一些假設(shè):
以聲明為中心的方法 - 所有可以以聲明式描述的,都應(yīng)該在界面描述文件中聲明,而不是在其控制器中編碼。
標(biāo)準(zhǔn)界面(瀏覽和編輯界面)提供具體的通用功能,一般不需要修改。
從最初的一千個成員加入了社區(qū)開始,我們就認(rèn)識到對于“標(biāo)準(zhǔn)” CRUD 界面的需求是有多么廣泛,已經(jīng)超出了最開始我們設(shè)計的一組功能了。然而,很長一段時間,即使沒有 API 層,我們也能夠處理自定義行為的需求,這是因?yàn)橛辛硪粋€第一階段假設(shè) - 開放繼承。有效地進(jìn)行開放繼承意味著可以覆蓋基礎(chǔ)類的任何公共或保護(hù)方法,再根據(jù)需要定制其行為。這聽起來似乎是所有頑疾的解藥,但事實(shí)上可能短期都不一定能見效:如果被覆蓋的方法被重命名、刪除了或者將來版本的框架根本不同這個方法了,該怎么辦?
所以,為了響應(yīng)社區(qū)日益增長的需求,我們決定引入新的界面API。API提供了清晰的長期的擴(kuò)展點(diǎn),而沒有隱藏的聲明式暗喻,靈活并且易于使用。
界面聲明
在 CUBA 7 里,界面聲明異常簡單:
?
從上面的例子我們可以看到,界面的標(biāo)識符在控制器類上顯式的進(jìn)行定義。也就是說,現(xiàn)在界面id和控制器類能相互唯一的對應(yīng)。由此帶來的好消息就是,現(xiàn)在界面可以直接通過其控制類來安全訪問了(注意下面例子用控制器類來創(chuàng)建確認(rèn)窗口):
?
至此,界面描述文件不再是必須的,而成為了一個補(bǔ)充的部分。界面布局可以通過編程的方式創(chuàng)建或者通過 XML 界面描述聲明式創(chuàng)建,界面描述通過控制器類的 @UiDescriptor 注解定義。這樣能使得控制器和布局更加容易讀懂。這個方式跟Android開發(fā)中使用的模式非常類似。
之前,需要在web-screens.xml中注冊一個界面描述并為其設(shè)置一個標(biāo)識符。在 CUBA 7 中,這個文件只是因?yàn)榧嫒菪缘目紤]被保留下來,用新方法創(chuàng)建界面不需要這種注冊了。
界面生命周期
新的API帶來了清晰的自描述的界面生命周期事件:
l?Init
l?AfterInit
l?BeforeShow
l?AfterShow
l?BeforeClose
l?AfterClose
CUBA 7 中所有的界面相關(guān)的事件都可以用下面的方式訂閱:
?
將新API與舊方法進(jìn)行比較,可以看到我們沒有重寫鉤子方法,之前這些鉤子方法在父類的層次結(jié)構(gòu)中被模糊地調(diào)用。現(xiàn)在我們在界面生命周期的明確預(yù)定義的點(diǎn)中定義業(yè)務(wù)邏輯。
事件處理和功能代理
前一小節(jié)我們介紹了如何訂閱生命周期事件,那么,其他組件呢?我們是否應(yīng)該像在6.x版本中那樣在界面初始化時分散所有必需的監(jiān)聽器?新API非常統(tǒng)一,因此訂閱其他事件與生命周期事件完全相似。
我們舉一個帶有兩個UI元素的簡單例子,一個按鈕和一個貨幣字段控件,因此它的XML描述符如下所示:
?
通過單擊按鈕我們調(diào)用中間件服務(wù)返回一個數(shù)字,該數(shù)字將被寫到貨幣控件中。貨幣控件需要根據(jù)價格的值更改其樣式。
?
在上面的例子中,我們看到有兩個事件處理器:一個是按鈕按下時調(diào)用的,另一個是當(dāng)貨幣控件的值發(fā)生變化時執(zhí)行的。就是這么簡單。
現(xiàn)在,我們設(shè)想一下,如果需要驗(yàn)證價格的值并確保其為一個正數(shù)。最直接的方法就是在界面初始化的時候?yàn)槠涮砑右粋€驗(yàn)證器:
?
在真實(shí)的應(yīng)用程序中,界面的入口點(diǎn)經(jīng)常會被這種界面元素的初始化方法填滿。為了避免這個問題,CUBA提供了一個非常有用的注解 @Install。看看使用這個注解怎么避免這個情況:
事實(shí)上,這里是將貨幣控件驗(yàn)證的邏輯代理給了界面的 currencyFieldValidator 方法來執(zhí)行。雖然看上去稍微復(fù)雜一點(diǎn),但是開發(fā)人員使用起這個功能來驚人的快速。
界面Builders/通知消息/對話框
CUBA 7 還引入了一些新的非常有用的帶有流式 API 的組件:
l?ScreenBuilders 結(jié)合了流式工廠來生成標(biāo)準(zhǔn)的查找、編輯和自定義界面。下面的例子展示了如何從一個界面打開另一個界面。注意,build() 方法能返回正確類型的界面實(shí)例,不需要不安全的類型轉(zhuǎn)換。
?
l?Screens 組件相對于 ScreenBuilders 來說提供了更底層的抽象,用來顯示和創(chuàng)建界面。并且提供了訪問 CUBA 應(yīng)用程序中所有已打開界面信息的方法(Screens#getOpenedScreens),如果需要遍歷這些界面,這個方法很有用。
l?Notifications和Dialogs 組件均提供了自描述的方便接口。這里有個例子創(chuàng)建對話框和消息通知:
?
數(shù)據(jù)綁定
CUBA 之所以可以做到后臺UI的快速開發(fā),不僅僅是因?yàn)樘峁┝丝梢陨纱蟛糠执a的可視化工具,還因?yàn)樘峁┝舜罅块_箱即用的具有數(shù)據(jù)感知能力的組件。 這些組件只需要知道要使用哪些數(shù)據(jù),其余事情會自動管理。例如, 查找列表、選擇器字段、具有 CRUD 操作的各種網(wǎng)格等。
在版本 7 之前,數(shù)據(jù)綁定是通過稱為數(shù)據(jù)源的對象實(shí)現(xiàn)的,數(shù)據(jù)源包裝單個實(shí)體或?qū)嶓w集合、與數(shù)據(jù)感知組件綁定,然后響應(yīng)數(shù)據(jù)感知組件的數(shù)據(jù)變化。 這種方法非常有效,但是是以一個整塊的方式實(shí)現(xiàn)的。 整塊石頭似的架構(gòu)通常在可定制性方面會有問題。因此在 CUBA 7 中,這塊堅固的巨石被分成 3 個數(shù)據(jù)組件:
l?Data Loader (數(shù)據(jù)加載器)?是數(shù)據(jù)容器的數(shù)據(jù)提供者。 數(shù)據(jù)加載器不保存數(shù)據(jù),它們只是將所有必需的查詢參數(shù)傳遞給數(shù)據(jù)存儲,并將結(jié)果數(shù)據(jù)集提供給數(shù)據(jù)容器。
l?Data container (數(shù)據(jù)容器) ?保留加載的數(shù)據(jù)(單個實(shí)體或多個實(shí)體)并以響應(yīng)式的方式將數(shù)據(jù)提供給數(shù)據(jù)感知組件:被包裝實(shí)體的所有更改都會暴露給相應(yīng)的UI組件,反之亦然,UI組件內(nèi)的所有更改都會引起數(shù)據(jù)容器作出相應(yīng)更改。
l?Data context??(數(shù)據(jù)上下文)是一個強(qiáng)大的數(shù)據(jù)更改管理器,可跟蹤更改并提交所有已修改的實(shí)體。 一個實(shí)體可以合并到一個數(shù)據(jù)上下文中,合并后會得到一個原始實(shí)體的副本,這個副本與原始實(shí)體有一個唯一但非常重要的區(qū)別:對副本實(shí)體及其引用的所有實(shí)體(包括集合)的所有修改都將被跟蹤、存儲和提交。
數(shù)據(jù)組件可以在界面描述符中聲明,也可以使用專門的工廠類 - DataComponents 以編程的方式創(chuàng)建。
其它
上面介紹了新的界面API中最重要的部分,所以剩下的部分我簡要列出 Web客戶端層中的其他重要功能:
URL 歷史記錄和導(dǎo)航。此功能解決了在 WEB 瀏覽器中具帶有“后退”按鈕的 SPA 應(yīng)用程序存在的一個普遍問題,提供了一種簡單地為應(yīng)用程序界面分配路徑的方法,同時使 API 能夠在URL中反映界面的當(dāng)前狀態(tài)。
使用 Form 代替 FieldGroup。 FieldGroup 是一個數(shù)據(jù)感知組件,用于顯示和修改單個實(shí)體的字段。它在運(yùn)行時推斷出用于顯示字段的實(shí)際UI組件。也就是說,如果你的實(shí)體中有一個日期類型的字段,它將使用 DateField 組件來顯示 。但是,如果你希望以編程方式使用此組件,則需要將此組件注入到界面控制器并手動將其轉(zhuǎn)換為正確的類型(在我們的示例中為DateField)。過了一段時間,可能會字段類型更改為其他類型,這時應(yīng)用程序就是崩潰。表單通過顯式聲明組件類型解決此問題。關(guān)于 Form 的更多信息請參閱這里。
顯著地簡化了第三方 JavaScript 組件的集成,可參考這個文檔將自定義 JavaScript 組件嵌入到CUBA 應(yīng)用程序中。
現(xiàn)在可以在 XML 界面描述中輕松定義 HTML/CSS屬性,也可以通過編程方式設(shè)置。詳細(xì)信息請參閱這里。
?
好了,以上只是關(guān)于 Studio 和偏前端的新功能介紹,下篇會介紹偏后端的新功能。
?
轉(zhuǎn)載于:https://www.cnblogs.com/cubacn/p/cuba-newversion.html
總結(jié)
以上是生活随笔為你收集整理的CUBA 7 新特性(上篇)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RealsenseD435,D455参数
- 下一篇: 素材网 持续更新