Errai — это среда, разработанная и поддерживаемая Red Hat в попытке объединить хорошие аспекты миров GWT и JEE. Согласно Red Hat , Errai — это основанная на GWT инфраструктура для создания многофункциональных веб-приложений с использованием веб-технологий следующего поколения. За этим простым утверждением стоит принципиально иной способ разработки с GWT, и в следующем посте мы увидим почему.
Как настроить проект:
Официальная документация предлагает два разных способа настройки проекта:
-
- Используя демонстрационный проект:
Хакерский способ начать новый проект состоит в том, чтобы клонировать обучающее руководство: git clone
[email protected]: errai / errai-tutorial.git и адаптируйте его к потребностям вашего проекта. На самом деле есть также архетип по адресу https://github.com/errai/archetypes, но на данный момент он устарел.
-
- Использование 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, являются их собственными. |