Статьи

Введение в Errai Framework

Errai — это среда, разработанная и поддерживаемая Red Hat в попытке объединить хорошие аспекты миров GWT и JEE. Согласно Red Hat , Errai — это основанная на GWT инфраструктура для создания многофункциональных веб-приложений с использованием веб-технологий следующего поколения. За этим простым утверждением стоит принципиально иной способ разработки с GWT, и в следующем посте мы увидим почему.

Как настроить проект:

Официальная документация предлагает два разных способа настройки проекта:

    1. Используя демонстрационный проект:

Хакерский способ начать новый проект состоит в том, чтобы клонировать обучающее руководство: git clone
[email protected]: errai / errai-tutorial.git и адаптируйте его к потребностям вашего проекта. На самом деле есть также архетип по адресу https://github.com/errai/archetypes, но на данный момент он устарел.

    1. Использование Errai Forge Addon.

JBoss Forge можно назвать своего рода CLI для строительных лесов. Он расширяется с помощью надстроек (их много), так что его можно использовать для создания практически любого типа проекта с нуля: Spring, JEE, Vaadin, GWT и так далее.

1
2
3
4
5
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 под названием «errai-tutorial».

Учебный проект:

Этот учебник основан на проекте здесь: https://github.com/gitgabrio/errai-tutorial . Мы будем следовать пошаговому подходу, в котором каждый шаг соответствует ветви. Чтобы перейти от одного шага к другому,
ветка должна быть проверена. В этом проекте мы использовали несколько классов, взятых из официального руководства по Errai.

Общая архитектура:

Платформа Errai полностью ориентирована на использование сервера приложений JBoss, в настоящее время WildFly версии 10. При первой конфигурации по умолчанию Maven загрузит zip-дистрибутив WildFly в локальный репозиторий; затем, во время сборки, он разархивирует его в директорию сборки проекта (цель). Приложение будет работать внутри экземпляра этого сервера WildFly, поэтому для его настройки необходимо предоставить свойства WildFly в качестве аргументов JVM для плагина GWT:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<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 предлагает различные функции, которые могут быть включены с помощью так называемых функций. Особенности — это баночки maven, добавленные в пом. Вы можете добавить их вручную, но, поскольку некоторые функции требуют более одного jar-файла, лучше скопировать их в предоставленном учебном пособии или, что еще лучше, добавить их с помощью Forge, используя следующую команду (внутри консоли Forge):

1
errai-add-features --feature-select [name of the feature]
    • Errai-сообщения:
1
git checkout messaging

Эта функция включает ErraiBus. ErraiBus является основой системы обмена сообщениями, используемой для обмена сообщениями с / на конечные точки. Конечные точки могут быть созданы на стороне клиента или сервера, и инфраструктура практически не делает различий между ними: сообщения могут отправляться с любого из них. Несколько слушателей данной темы могут получать сообщения, адресованные этой теме.
Конечные точки регистрируют себя для прослушивания данного субъекта, передавая обратный вызов в MessageBus.

Например, в учебном проекте есть пара конечных точек в классе ReceiverMessagePanel:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
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 и отправляются через экземпляр RequestDispatcher.
Для отправки сообщения инфраструктура предоставляет служебный класс MessageBuilder, который в свободном стиле позволяет создавать сообщение и отправлять его в заданную тему.
Есть несколько вариантов, но самый простой из них:

1
2
3
4
5
6
7
MessageBuilder
                .createMessage()
                .toSubject(HelloServerService.SERVER_SUBJECT)
                .signalling()
                .with("text", requestTextBox.getText())
                .noErrorHandling()
                .sendNowWith(dispatcher)

При этом мы отправляем сообщение, в котором будет текст поля с заданным значением String, в HelloServerService.SERVER_SUBJECT. Сообщение отправляется немедленно с заданным RequestDispatcher.

  • errai-КДИ-интеграция:

Errai CDI содержит реализацию спецификации JSR-299 «Контексты и внедрение зависимостей». Это также само по себе расширение функции Errai-IOC, поэтому добавление CDI автоматически добавит IOC. Чтобы эта функция работала должным образом, вы должны добавить файл «ErrayApp.properties» в корень каждого каталога, содержащего классы, существование которых должно быть известно Errai. Кроме того, мы включим CDIServiceLocator внутри web.xml:

1
2
3
4
5
6
7
8
9
<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, но добавляет возможность генерировать и потреблять События, так что компоненты могут взаимодействовать, будучи полностью отделенными. Использование событий демонстрируется ContactStorageServiceImpl и ReceiverEventPanel. Не обращая внимания на все остальное, на данный момент давайте сосредоточимся на создании события:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
@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);
       ...
    }
 
}

Внутри этого класса было введено Событие <ContactOperation> (определенное для типа операции CREATE); внутри метода create вызывается Event.fire, и это подтолкнет данное событие внутри контекста.

ReceiverEventPanel:

1
2
3
public void onRemoteCreated(final @Observes @Operation(Operation.OperationType.CREATE) ContactOperation contactOperation) {
        
    }

Аннотация @Observe вызывает метод onRemoteCreated при вызове события

(с типом операции CREATE) запускается.

  • errai-data -inding:
1
git checkout persistence

При связывании данных можно автоматически заполнять поля в пользовательском интерфейсе данными определенного класса DTO. Для этого такой класс должен быть аннотирован @Bindable и иметь стандартные свойства getter / setter для своих свойств. @ Templated-аннотированные пользовательские компоненты (см. Далее) будут автоматически синхронизировать свои поля со значениями этих классов. В нашем примере класс Contact будет иметь такую ​​аннотацию, чтобы мы могли реализовать весь стек (от представления на стороне клиента до сохранения на стороне сервера) в одном единственном классе:

1
2
3
4
5
6
7
@Bindable
@Portable
@Entity
@NamedQueries({
  @NamedQuery(name = Contact.ALL_CONTACTS_QUERY, query = "SELECT c FROM Contact c ORDER BY c.id")
})
public class Contact
  • Errai-навигация:

Эта функция позволяет создавать приложения с несколькими закладками. Классы могут быть помечены @Page, чтобы указать их роль и путь, как ContactListPage ниже, который помечен как страница приложения по умолчанию:

1
2
3
@Page(role = DefaultPage.class, path = "/contacts")
@Templated(value = "contact-page.html#contact-list", stylesheet = "contact-page.css")
public class ContactListPage

Только @ Templated-аннотированные классы или классы, реализующие (прямо или косвенно) IsWidget, могут иметь аннотацию @Page. Другие аннотации используются для вызова методов при определенных событиях страницы:

@PageShown вызывается, когда объект прикреплен к NavigationPanel.

@PageHiding вызывается, когда объект удаляется из NavigationPanel.

Навигация между страницами может быть реализована с использованием класса «org.jboss.errai.ui.nav.client.local.Navigation», который предлагает несколько методов для этого, например:

Navigation.goTo ([PAGE_NAME])

Заворачивать:

Конечно, Errai предлагает множество инструментов для разработки полноценного приложения JEE поверх GWT. Помимо всех улучшений пользовательского интерфейса, действительно интересно «размывание» границ между клиентской и серверной сторонами кода, особенно для системы обмена сообщениями. Использование MessageBus или Events может действительно помочь в построении отделенный код, который, в конце концов, облегчит разработку и обслуживание приложений. С другой стороны, это идет с ценой, и цена — это привязка к Серверу приложений (WildFly предоставляется из коробки в примерах, но любой другой должен работать). Работа с серверами приложений подразумевает дополнительные затраты с точки зрения архитектуры и сложности, и необходимо учитывать соотношение затрат и выгод. Мы можем рассматривать инфраструктуру Errai как аналог JEE для приложения Spring + GWT, поэтому, в конце концов, все решает один и тот же старый вопрос: являетесь ли вы разработчиком JEE или Spring?

Опубликовано на Java Code Geeks с разрешения Закарии Амине, партнера по нашей программе JCG . Смотрите оригинальную статью здесь: Введение в Errai Framework

Мнения, высказанные участниками Java Code Geeks, являются их собственными.