вступление
Мне нравится 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
|
@SpringBootApplicationpublic 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
|
@SpringBootApplicationpublic class SpringApp { public static void main(String[] args) { SpringApplication.run(SpringApp.class, args); }} |
Фактически Spring Boot может добавить сервлет с ServletRegistrationBean:
|
1
2
3
4
5
6
|
@Beanpublic ServletRegistrationBean<RWTServlet> servletRegistrationBean() { ServletRegistrationBean<RWTServlet> rwt = newServletRegistrationBean<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 = newHelloWorldConfiguration(); 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
|
@Beanpublic RWTSCLSimple rwtSCListener() { return new RWTSCLSimple();} |
Все функции Spring Boot работают «из коробки», даже server.servlet.context-path . Если читатель не возражает против небольшого обходного пути, этот вариант выглядит лучше, чем первый.
| Опубликовано на Java Code Geeks с разрешения Вадима Коркина, партнера нашей программы JCG . Смотреть оригинальную статью здесь: Eclipse RAP с Spring Boot
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |
