Статьи

Eclipse RAP с весенней загрузкой

вступление

Мне нравится Eclipse :-). Я использую это в течение многих лет. Я думаю, что IDE это здорово, и это бесплатно! Но Eclipse — это гораздо больше, чем просто IDE. Это больше похоже на экосистему приложений, плагинов и проектов. Любой может использовать Eclipse Framework для создания своего собственного приложения на основе Eclipse.

Он называется Eclipse RCP — Rich Client Application. Любой RCP основан на тех же принципах, что и Eclipse IDE: продукт включает в себя некоторые функции, любая функция включает некоторые плагины.

Eclipse RAP

Я слышал, что возможно включить плагин непосредственно в продукт, но это не рекомендуется.

Пользовательский интерфейс в Eclipse Framework основан на 2 вещах:

  • Модель приложения
  • SWT — Стандартный набор инструментов для виджетов

Модель приложения подобна большому «посреднику» (помните шаблон?), Который обрабатывает взаимодействия многих компонентов пользовательского интерфейса на высоком уровне. Он определен в XML-подобном формате. Он определяет окна, части, команды, обработчики, меню и т. Д.

SWT — это коллекция виджетов: кнопок, меток, диалогов. Эти виджеты используются для создания пользовательского интерфейса на более низком уровне, чем модель приложения. Например, пользовательский интерфейс внутри детали (класс MPart) создается с помощью SWT.

Eclipse Framework также можно использовать для создания веб-приложений. Он называется Eclipse RAP — Платформа удаленных приложений. Идея простая и впечатляющая одновременно. Пользовательский интерфейс создан в Java с виджетами SWT. Фактически пользовательский интерфейс создается с помощью виджетов SWT, адаптированных для RAP. Затем он отображается в браузере. Существует специальный сервлет, который выполняет рендеринг RWTServlet (RWT может обозначать Remote Widget Toolkit). Вот ссылка на Руководство разработчика для RAP.

И, наконец, к делу. Мы все знаем, что Spring Boot потрясающий :-))! Это должна быть доминирующая платформа для создания веб-приложений. Он предлагает несколько технологий для создания пользовательского интерфейса, таких как JSP или Thymeleaf. Но JSP немного стар, и Thymeleaf может быть немного менее интерактивным, чем RAP. Было бы здорово, чтобы оба работали вместе.

Приложение RAP с Spring Boot в файле WAR

Первый вариант — создать WAR-файл с Spring Boot и RAP и развернуть его в Tomcat. Эта опция описана в Руководстве разработчика. Вот ссылка. Я скопировал важные файлы.

Web.xml:

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
<?xml version="1.0" encoding="UTF-8"?>
  version="2.4">
 
  <context-param>
    <param-name>org.eclipse.rap.applicationConfiguration</param-name>
    <param-value>com.example.HelloWorldConfiguration</param-value>
  </context-param>
 
  <listener>
    <listener-class>org.eclipse.rap.rwt.engine.RWTServletContextListener</listener-class>
  </listener>
 
  <servlet>
    <servlet-name>rwtServlet</servlet-name>
    <servlet-class>org.eclipse.rap.rwt.engine.RWTServlet</servlet-class>
  </servlet>
 
  <servlet-mapping>
    <servlet-name>rwtServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

Конфигурация приложения:

1
2
3
4
5
public class HelloWorldConfiguration implements ApplicationConfiguration {
  public void configure( Application application ) {
    application.addEntryPoint( "/hello", HelloWorld.class, null );
  }
}

И класс:

1
2
3
4
5
6
public class HelloWorld extends AbstractEntryPoint {
  public void createContents( Composite parent ) {
    Label label = new Label( parent, SWT.NONE );
    label.setText( "Hello RAP World" );
  }
}

Чтобы заставить его работать с упаковкой Maven WAR, поместите файл web.xml в src / main / webapp / WEB-INF. Точка входа в конфигурации приложения должна быть настроена для rwtServlet в web.xml.

Для Spring Boot добавьте следующее:

1
2
3
4
5
6
@SpringBootApplication
public class SpringApp extends SpringBootServletInitializer {
  public SpringApplicationBuilder configure( SpringApplicationBuilder builder ) {
    return builder.web(WebApplicationType.NONE).sources(<configurations>);
  }
}

В pom.xml установите упаковку для войны.
<packaging>war</packaging>

Хотя есть одна важная проблема. Банки Eclipse недоступны в Maven Central. Возможно, можно как-то использовать репозиторий p2, но я этого не пробовал. Ведь нужна только одна банка. Я использовал последнюю доступную версию RAP 3.5. Баночка org.eclipse.rap.rwt_3.5.0.20180613-1038.jar.

Я установил его вручную в локальный репозиторий Maven и использовал зависимость в pom.

Этого было достаточно, чтобы построить WAR и использовать его в Tomcat 9. Никаких взломов не требуется.

Приложение RAP с Spring Boot в исполняемом фляге

Этот вариант выглядит более удобным. Было бы здорово использовать RWTServlet в Spring Boot. Тогда все функции, такие как исполняемый файл jar и встроенный Tomcat, будут работать из коробки.

Сначала верните основной класс Spring Boot в нормальное состояние:

1
2
3
4
5
6
@SpringBootApplication
public class SpringApp {
    public static void main(String[] args) {
        SpringApplication.run(SpringApp.class, args);
    }
}

Фактически Spring Boot может добавить сервлет с ServletRegistrationBean:

1
2
3
4
5
6
@Bean
public ServletRegistrationBean<RWTServlet> servletRegistrationBean() {
    ServletRegistrationBean<RWTServlet> rwt = new
ServletRegistrationBean<RWTServlet>(new RWTServlet(),"/hello", "/hello2");
    return rwt;
}

Но, к сожалению, этого недостаточно. Этот RWTServlet требует, чтобы специальный контекст был связан с ServletContext. Ранее в примере WAR RWTServletContextListener обрабатывал это :-(.

Но Spring Boot даже в этой отчаянной ситуации показал, стоило ли это :-). Это может связать пользовательских слушателей, объявляя их как бины! Функциональность по умолчанию RWTServletContextListener потребовала некоторой доработки, поскольку, как оказалось, привязка этого прослушивателя из Spring Boot имела некоторые ограничения. Вот чем я закончил:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
public class RWTSCLSimple extends RWTServletContextListener {
 
    private ApplicationRunner applicationRunner;
 
    @Override
    public void contextInitialized( ServletContextEvent event ) {
        ServletContext servletContext = event.getServletContext();
        ApplicationConfiguration configuration = new
HelloWorldConfiguration();
        applicationRunner = new ApplicationRunner( configuration,
servletContext );
        applicationRunner.start();
    }
 
    @Override
    public void contextDestroyed( ServletContextEvent event ) {
        applicationRunner.stop();
        applicationRunner = null;
    }
}

Этот класс упрощает начальную функциональность RWTServletContextListener и удаляет некоторые вызовы методов, которые были «неприемлемы для слушателя, не объявленного в web.xml» :-)). Это сообщение об ошибке было очень забавным.

Теперь этот класс должен быть объявлен как bean-компонент и все:

1
2
3
4
@Bean
public RWTSCLSimple rwtSCListener() {
    return new RWTSCLSimple();
}

Все функции Spring Boot работают «из коробки», даже server.servlet.context-path . Если читатель не возражает против небольшого обходного пути, этот вариант выглядит лучше, чем первый.

Опубликовано на Java Code Geeks с разрешения Вадима Коркина, партнера нашей программы JCG . Смотреть оригинальную статью здесь: Eclipse RAP с Spring Boot

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