вступление
Мне нравится Eclipse :-). Я использую это в течение многих лет. Я думаю, что IDE это здорово, и это бесплатно! Но Eclipse — это гораздо больше, чем просто IDE. Это больше похоже на экосистему приложений, плагинов и проектов. Любой может использовать Eclipse Framework для создания своего собственного приложения на основе Eclipse.
Он называется Eclipse RCP — Rich Client Application. Любой RCP основан на тех же принципах, что и Eclipse IDE: продукт включает в себя некоторые функции, любая функция включает некоторые плагины.
Я слышал, что возможно включить плагин непосредственно в продукт, но это не рекомендуется.
Пользовательский интерфейс в 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" ?> xsi:schemaLocation = "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 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, являются их собственными. |