当前位置: 首页 > 工具软件 > Errai > 使用案例 >

Errai框架简介

容寒
2023-12-01

Errai是Red Hat开发和维护的框架,旨在将GWT和JEE世界的优点融合在一起。 根据Red Hat的说法,Errai是基于GWT的框架,用于使用下一代Web技术构建富Web应用程序。 在此简单声明的后面,存在一种与GWT完全不同的开发方式,在下面的文章中,我们将了解原因。

官方文档建议了两种不同的方式来设置项目:

    1. 使用演示项目:

启动新项目的一种怪诞方法是克隆errai-tutorial:git clonegit@github.com:errai / errai-tutorial.git并使其适应您的项目需求。 实际上,https://github.com/errai/archetypes上也有一个原型,但是从现在起已弃用。

    1. 使用Errai Forge插件。

JBoss Forge可被描述为一种用于脚手架项目的CLI。 它可以使用附加组件进行扩展(其中有很多),因此可以用于从头开始创建几乎任何类型的项目:Spring,JEE,Vaadin,GWT等。

forge --install org.jboss.errai.forge:errai-forge-addon,4.0.2.Final 
      forge
      project-new --named errai-tutorial --topLevelPackage com.gwidgets.errai.tutorial --version
          1.0.0-SNAPSHOT --finalName "Errai Tutorial" --type war --buildSystem Maven
      errai-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 methods

public 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确实可以极大地帮助构建解耦的代码,最终将简化应用程序的开发和维护。 另一方面,这是有价格的,价格是与Application Server的绑定(在示例中,WildFly是开箱即用的,但其他任何方法都可以使用)。 使用Application Server意味着体系结构和复杂性方面的开销,并且应该考虑成本/收益比。 我们可以将Errai框架视为Spring + GWT应用程序的JEE对应物,因此,最终,它们都解决了一个古老的问题:您是JEE还是Spring开发人员?

翻译自: https://www.javacodegeeks.com/2017/09/introduction-errai-framework.html

 类似资料: