Errai框架简介
Errai是Red Hat開發(fā)和維護(hù)的框架,旨在結(jié)合GWT和JEE世界的優(yōu)點(diǎn)。 根據(jù)Red Hat的說法,Errai是基于GWT的框架,用于使用下一代Web技術(shù)構(gòu)建富Web應(yīng)用程序。 在此簡單聲明的背后,存在一種與GWT完全不同的開發(fā)方式,在下面的文章中,我們將了解原因。
官方文檔建議了兩種不同的方式來設(shè)置項(xiàng)目:
啟動新項(xiàng)目的一種怪誕方法是克隆errai-tutorial:git clone
git@github.com:errai / errai-tutorial.git并使其適應(yīng)您的項(xiàng)目需求。 實(shí)際上,https://github.com/errai/archetypes也有一個(gè)原型 ,但是從現(xiàn)在起已棄用。
JBoss Forge可描述為一種用于腳手架項(xiàng)目的CLI。 它可以使用附加組件進(jìn)行擴(kuò)展(其中有很多),因此它可以用于從頭開始創(chuàng)建幾乎任何類型的項(xiàng)目: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在應(yīng)用命令之后,我們應(yīng)該有一個(gè)名為“ errai-tutorial”的Errai項(xiàng)目的空支架。
本教程基于此處的項(xiàng)目: https : //github.com/gitgabrio/errai-tutorial 。 我們將遵循逐步的方法,其中每個(gè)步驟都對應(yīng)一個(gè)分支。 要從一個(gè)步驟轉(zhuǎn)到另一個(gè)步驟,
分支需要簽出。 在這個(gè)項(xiàng)目中,我們利用了官方Errai教程中的一些類。
Errai框架非常適合使用JBoss Application Server(當(dāng)前為WildFly版本10)。使用默認(rèn)配置,在首次運(yùn)行時(shí),Maven將在本地存儲庫中下載WildFly zip發(fā)行版;否則,將不再運(yùn)行。 然后,在構(gòu)建過程中,它將在項(xiàng)目的構(gòu)建目錄(目標(biāo))中將其解壓縮。 該應(yīng)用程序?qū)⒃诖薟ildFly服務(wù)器的實(shí)例中運(yùn)行,因此要配置它,您必須提供WildFly屬性作為GWT插件的JVM參數(shù):
<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的行家罐子。 您可以手動添加它們,但是,由于某些功能需要多個(gè)jar,因此最好在提供的教程中復(fù)制它們,或者甚至更好的是,使用以下命令(在Forge控制臺內(nèi)部)將它們與Forge添加:
errai-add-features --feature-select [name of the feature]- 錯(cuò)誤消息:
此功能啟用ErraiBus。 ErraiBus是用于與端點(diǎn)之間交換消息的消息傳遞系統(tǒng)的骨干。 端點(diǎn)可以在客戶端或服務(wù)器端實(shí)例化,并且框架之間幾乎沒有區(qū)別:消息可以往返于任何一個(gè)。 給定主題的多個(gè)偵聽器可能會收到發(fā)給該主題的消息。
端點(diǎn)注冊自己以偵聽給定主題,并將回調(diào)傳遞給MessageBus。
例如,在教程項(xiàng)目中,ReceiverMessagePanel類中有兩個(gè)端點(diǎn):
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);});} 每當(dāng)將消息發(fā)送到CLIENT_SUBJECT或VARIABLE_SUBJECT時(shí),都會調(diào)用該回調(diào)。 消息由JSON格式的String表示,并通過RequestDispatcher的實(shí)例發(fā)送。
為了發(fā)送消息,該框架提供了實(shí)用程序類MessageBuilder,它具有流暢的樣式,允許創(chuàng)建消息并將其發(fā)送給給定的主題。
有多種選擇,但最簡單的選擇如下:
這樣,我們將向HelloServerService.SERVER_SUBJECT發(fā)送一條消息,該消息將包含具有給定String值的字段文本。 消息立即與給定的RequestDispatcher發(fā)送。
- errai-cdi-integration:
Errai CDI包含JSR-299上下文和依賴注入規(guī)范的實(shí)現(xiàn)。 它本身也是Errai-IOC功能的擴(kuò)展,因此添加CDI將自動添加IOC。 為了使此功能正常運(yùn)行,您必須在每個(gè)目錄的根目錄中添加一個(gè)“ ErrayApp.properties”文件,該目錄包含Errai應(yīng)該知道其存在的類。 此外,我們將在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>此功能未實(shí)現(xiàn)所有JSR-299規(guī)范,但它增加了產(chǎn)生和使用事件的可能性,因此Bean可以在完全分離的同時(shí)進(jìn)行交互。 ContactStorageServiceImpl和ReceiverEventPanel演示了事件的用法。 暫時(shí)忽略其他所有內(nèi)容,讓我們關(guān)注事件創(chuàng)建:
@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);...}}在此類內(nèi)部,已注入Event <ContactOperation>(特定于CREATE操作類型); 在創(chuàng)建方法Event.fire中調(diào)用,這會將給定事件推送到上下文中。
ReceiverEventPanel:
public void onRemoteCreated(final @Observes @Operation(Operation.OperationType.CREATE) ContactOperation contactOperation) {}@Observes注釋會導(dǎo)致在事件發(fā)生時(shí)調(diào)用onRemoteCreated方法
(操作類型為CREATE)被觸發(fā)。
- 數(shù)據(jù)綁定
通過數(shù)據(jù)綁定,可以使用特定DTO類的數(shù)據(jù)自動填充用戶界面中的字段。為此,應(yīng)使用@Bindable對該類進(jìn)行注釋,并為其屬性提供標(biāo)準(zhǔn)的getter / setter方法。 @Templated注釋的ui Bean(請參閱下文)將使其字段與這些類的值自動同步。 在我們的示例中,Contact類將具有這樣的注釋,以便我們可以在單個(gè)類中實(shí)現(xiàn)所有堆棧(從客戶端表示到服務(wù)器端持久性):
@Bindable @Portable @Entity @NamedQueries({@NamedQuery(name = Contact.ALL_CONTACTS_QUERY, query = "SELECT c FROM Contact c ORDER BY c.id") }) public class Contact- 導(dǎo)航:
此功能允許創(chuàng)建具有多個(gè)可標(biāo)記頁面的應(yīng)用程序。 可以用@Page注釋類,以指示其角色和路徑,例如下面的ContactListPage,它被標(biāo)記為應(yīng)用程序的默認(rèn)頁面:
@Page(role = DefaultPage.class, path = "/contacts") @Templated(value = "contact-page.html#contact-list", stylesheet = "contact-page.css") public class ContactListPage只有@Templated注釋的類或?qū)崿F(xiàn)(直接或間接)IsWidget的類可以具有@Page注釋。其他注釋用于在特定頁面事件時(shí)調(diào)用方法:
將對象附加到NavigationPanel時(shí),將調(diào)用@PageShown。
從NavigationPanel中刪除對象時(shí),將調(diào)用@PageHiding。
頁面之間的導(dǎo)航可以使用“ org.jboss.errai.ui.nav.client.local.Navigation”類實(shí)現(xiàn),該類提供了一些方法,例如:
Navigation.goTo([PAGE_NAME])
當(dāng)然,Errai提供了許多工具來開發(fā)基于GWT的完整JEE應(yīng)用程序。 除了所有的用戶界面增強(qiáng)功能外,真正有趣的是代碼的客戶端和服務(wù)器端之間的“模糊”,特別是對于消息系統(tǒng)。使用MessageBus或Events確實(shí)可以極大地幫助構(gòu)建解耦的代碼,最終將簡化應(yīng)用程序的開發(fā)和維護(hù)。 另一方面,這是有價(jià)格的,價(jià)格是與應(yīng)用服務(wù)器的綁定(在示例中,WildFly是開箱即用的,但其他任何方法都可以使用)。 與Application Server一起使用意味著體系結(jié)構(gòu)和復(fù)雜性方面的開銷,并且應(yīng)該考慮成本/收益比。 我們可以將Errai框架視為Spring + GWT應(yīng)用程序的JEE對應(yīng)物,因此,最終,所有這些都可以解決一個(gè)古老的問題:您是JEE還是Spring開發(fā)人員?
翻譯自: https://www.javacodegeeks.com/2017/09/introduction-errai-framework.html
總結(jié)
- 上一篇: 20%的人才知道的3Dmax渲染小技巧
- 下一篇: 项目包装组织