Errai框架简介
Errai是Red Hat開發和維護的框架,旨在結合GWT和JEE世界的優點。 根據Red Hat的說法,Errai是基于GWT的框架,用于使用下一代Web技術構建富Web應用程序。 在此簡單聲明的背后,存在一種與GWT完全不同的開發方式,在下面的文章中,我們將了解原因。
官方文檔建議了兩種不同的方式來設置項目:
啟動新項目的一種怪誕方法是克隆errai-tutorial:git clone
git@github.com:errai / errai-tutorial.git并使其適應您的項目需求。 實際上,https://github.com/errai/archetypes也有一個原型 ,但是從現在起已棄用。
JBoss Forge可描述為一種用于腳手架項目的CLI。 它可以使用附加組件進行擴展(其中有很多),因此它可以用于從頭開始創建幾乎任何類型的項目:Spring,JEE,Vaadin,GWT等。
forge --install org.jboss.errai.forge:errai-forge-addon,4.0.2.Final forgeproject-new --named errai-tutorial --topLevelPackage com.gwidgets.errai.tutorial --version1.0.0-SNAPSHOT --finalName "Errai Tutorial" --type war --buildSystem Mavenerrai-setup --version-select 4.0.2.Final --logical-module-name com.gwidgets.errai.tutorial --module-name ErraiTutorial在應用命令之后,我們應該有一個名為“ errai-tutorial”的Errai項目的空支架。
本教程基于此處的項目: https : //github.com/gitgabrio/errai-tutorial 。 我們將遵循逐步的方法,其中每個步驟都對應一個分支。 要從一個步驟轉到另一個步驟,
分支需要簽出。 在這個項目中,我們利用了官方Errai教程中的一些類。
Errai框架非常適合使用JBoss Application Server(當前為WildFly版本10)。使用默認配置,在首次運行時,Maven將在本地存儲庫中下載WildFly zip發行版;否則,將不再運行。 然后,在構建過程中,它將在項目的構建目錄(目標)中將其解壓縮。 該應用程序將在此WildFly服務器的實例中運行,因此要配置它,您必須提供WildFly屬性作為GWT插件的JVM參數:
<properties><errai.dev.context>${project.artifactId}</errai.dev.context>??? <as.version>10.0.0.Final</as.version>??? <errai.jboss.home>${project.build.directory}/wildfly-${as.version}</errai.jboss.home><listening.address>127.0.0.1</listening.address></properties><plugin><groupId>org.codehaus.mojo</groupId><artifactId>gwt-maven-plugin</artifactId><version>${gwt.version}</version><executions><execution><goals><goal>compile</goal></goals></execution></executions><configuration><logLevel>INFO</logLevel><noServer>false</noServer><extraJvmArgs>-Xmx3096m-XX:CompileThreshold=7000 -Derrai.jboss.home=${errai.jboss.home}-Derrai.dev.context=${errai.dev.context}-Djboss.bind.address=${listening.address}</extraJvmArgs><server>org.jboss.errai.cdi.server.gwt.EmbeddedWildFlyLauncher</server> <!--other configuration properties --> </configuration>Errai提供了可以通過所謂的功能啟用的不同功能。 功能只是添加到pom的行家罐子。 您可以手動添加它們,但是,由于某些功能需要多個jar,因此最好在提供的教程中復制它們,或者甚至更好的是,使用以下命令(在Forge控制臺內部)將它們與Forge添加:
errai-add-features --feature-select [name of the feature]- 錯誤消息:
此功能啟用ErraiBus。 ErraiBus是用于與端點之間交換消息的消息傳遞系統的骨干。 端點可以在客戶端或服務器端實例化,并且框架之間幾乎沒有區別:消息可以往返于任何一個。 給定主題的多個偵聽器可能會收到發給該主題的消息。
端點注冊自己以偵聽給定主題,并將回調傳遞給MessageBus。
例如,在教程項目中,ReceiverMessagePanel類中有兩個端點:
public static final String CLIENT_SUBJECT = "ClientSubject";public static final String VARIABLE_SUBJECT = "VariableSubject";private void subscriptions() {subscribe(CLIENT_SUBJECT);subscribe(VARIABLE_SUBJECT);}private void subscribe(String subject) {bus.subscribe(subject, message -> {String messageText = message.get(String.class, "text");logger.debug("Received " + messageText + " on " + subject);showReceived(subject, messageText);});} 每當將消息發送到CLIENT_SUBJECT或VARIABLE_SUBJECT時,都會調用該回調。 消息由JSON格式的String表示,并通過RequestDispatcher的實例發送。
為了發送消息,該框架提供了實用程序類MessageBuilder,它具有流暢的樣式,允許創建消息并將其發送給給定的主題。
有多種選擇,但最簡單的選擇如下:
這樣,我們將向HelloServerService.SERVER_SUBJECT發送一條消息,該消息將包含具有給定String值的字段文本。 消息立即與給定的RequestDispatcher發送。
- errai-cdi-integration:
Errai CDI包含JSR-299上下文和依賴注入規范的實現。 它本身也是Errai-IOC功能的擴展,因此添加CDI將自動添加IOC。 為了使此功能正常運行,您必須在每個目錄的根目錄中添加一個“ ErrayApp.properties”文件,該目錄包含Errai應該知道其存在的類。 此外,我們將在web.xml中啟用CDIServiceLocator:
<servlet><servlet-name>ErraiServlet</servlet-name><servlet-class>org.jboss.errai.bus.server.servlet.DefaultBlockingServlet</servlet-class><init-param><param-name>service-locator</param-name><param-value>org.jboss.errai.cdi.server.CDIServiceLocator</param-value></init-param><load-on-startup>1</load-on-startup></servlet>此功能未實現所有JSR-299規范,但它增加了產生和使用事件的可能性,因此Bean可以在完全分離的同時進行交互。 ContactStorageServiceImpl和ReceiverEventPanel演示了事件的用法。 暫時忽略其他所有內容,讓我們關注事件創建:
@Stateless @Service public class ContactStorageServiceImpl implements ContactStorageService {@Inject@Operation(CREATE)private Event<ContactOperation> created;// other fields and methodspublic Response create(final ContactOperation contactOperation) {..// This event is delivered to call connected clients.created.fire(contactOperation);...}}在此類內部,已注入Event <ContactOperation>(特定于CREATE操作類型); 在創建方法Event.fire中調用,這會將給定事件推送到上下文中。
ReceiverEventPanel:
public void onRemoteCreated(final @Observes @Operation(Operation.OperationType.CREATE) ContactOperation contactOperation) {}@Observes注釋會導致在事件發生時調用onRemoteCreated方法
(操作類型為CREATE)被觸發。
- 數據綁定
通過數據綁定,可以使用特定DTO類的數據自動填充用戶界面中的字段。為此,應使用@Bindable對該類進行注釋,并為其屬性提供標準的getter / setter方法。 @Templated注釋的ui Bean(請參閱下文)將使其字段與這些類的值自動同步。 在我們的示例中,Contact類將具有這樣的注釋,以便我們可以在單個類中實現所有堆棧(從客戶端表示到服務器端持久性):
@Bindable @Portable @Entity @NamedQueries({@NamedQuery(name = Contact.ALL_CONTACTS_QUERY, query = "SELECT c FROM Contact c ORDER BY c.id") }) public class Contact- 導航:
此功能允許創建具有多個可標記頁面的應用程序。 可以用@Page注釋類,以指示其角色和路徑,例如下面的ContactListPage,它被標記為應用程序的默認頁面:
@Page(role = DefaultPage.class, path = "/contacts") @Templated(value = "contact-page.html#contact-list", stylesheet = "contact-page.css") public class ContactListPage只有@Templated注釋的類或實現(直接或間接)IsWidget的類可以具有@Page注釋。其他注釋用于在特定頁面事件時調用方法:
將對象附加到NavigationPanel時,將調用@PageShown。
從NavigationPanel中刪除對象時,將調用@PageHiding。
頁面之間的導航可以使用“ org.jboss.errai.ui.nav.client.local.Navigation”類實現,該類提供了一些方法,例如:
Navigation.goTo([PAGE_NAME])
當然,Errai提供了許多工具來開發基于GWT的完整JEE應用程序。 除了所有的用戶界面增強功能外,真正有趣的是代碼的客戶端和服務器端之間的“模糊”,特別是對于消息系統。使用MessageBus或Events確實可以極大地幫助構建解耦的代碼,最終將簡化應用程序的開發和維護。 另一方面,這是有價格的,價格是與應用服務器的綁定(在示例中,WildFly是開箱即用的,但其他任何方法都可以使用)。 與Application Server一起使用意味著體系結構和復雜性方面的開銷,并且應該考慮成本/收益比。 我們可以將Errai框架視為Spring + GWT應用程序的JEE對應物,因此,最終,所有這些都可以解決一個古老的問題:您是JEE還是Spring開發人員?
翻譯自: https://www.javacodegeeks.com/2017/09/introduction-errai-framework.html
總結
- 上一篇: 20%的人才知道的3Dmax渲染小技巧
- 下一篇: 项目包装组织