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也有一个原型 ,但是从现在起已弃用。
- 使用Errai Forge插件。
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]
- 错误消息:
git checkout messaging
此功能启用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,它具有流畅的样式,允许创建消息并将其发送给给定的主题。
有多种选择,但最简单的选择如下:
MessageBuilder.createMessage().toSubject(HelloServerService.SERVER_SUBJECT).signalling().with("text", requestTextBox.getText()).noErrorHandling().sendNowWith(dispatcher)
这样,我们将向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)被触发。
- 数据绑定
git checkout persistence
通过数据绑定,可以使用特定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