Статьи

Взгляд изнутри Эксадель Фламинго — Flex и шов JBoss

<br /> <meta name="GENERATOR" content="OpenOffice.org 2.4 (Linux)"/> </p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Большинство предприятий сегодня планируют или уже поставляют многофункциональные интернет-приложения. </font><font style="vertical-align: inherit;">Полное обновление страниц — это история. </font><font style="vertical-align: inherit;">Сегодня клиенты хотят иметь быстрые, интерактивные и многофункциональные веб-приложения, которые выглядят и выглядят как настольные приложения.<br /> </font></font><!--break--><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">В то время как богатые интернет-приложения явно являются будущим, технологии или стек технологий, которые можно использовать для них, не всегда понятны.</font></font></p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Многие ИТ-менеджеры сталкиваются с вопросом: «Какую технологию пользовательского интерфейса использовать?». </font><font style="vertical-align: inherit;">Другой, не менее важный вопрос: «Какие бэкэнд-технологии использовать?» </font><font style="vertical-align: inherit;">Выбор интерфейса пользователя в изобилии (Flex, Silverlight, Ajax, JavaFX). </font><font style="vertical-align: inherit;">Однако цель этой статьи не в том, чтобы сравнить их все. </font><font style="vertical-align: inherit;">Вместо этого мы сосредоточимся на проверенной и все более популярной технологии Flex для пользовательского интерфейса. </font><font style="vertical-align: inherit;">На сервере мы будем использовать JBoss Seam. </font><font style="vertical-align: inherit;">Seam значительно упрощает разработку, объединяя такие технологии, как JSF, с EJB3, JPA и Hibernate.</font></font></p> <p style="margin-bottom: 0in"> </p> <h2><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> сгибать </font></font></h2> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Flex-приложения запускаются внутри высокопроизводительного Flash-плеера от Adobe. </font><font style="vertical-align: inherit;">Flash player (версия 9) — это вездесущая легковесная виртуальная машина, которая устанавливается в виде плагина внутри браузера и запускает приложения Flex. </font><font style="vertical-align: inherit;">Сегодня Flash Player установлен практически на любой машине. </font><font style="vertical-align: inherit;">Поскольку приложения Flex компилируются и запускаются на виртуальной машине (проигрывателе Flash), пользователь может получить более богатый пользовательский интерфейс, в отличие от стандартного сценария веб-браузера, в котором интерпретируются разметка (HTML) и JavaScript.</font></font></p> <p style="margin-bottom: 0in"> </p> <h2><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> JBoss Seam</font></font></h2> <p style="margin-bottom: 0in"> <meta http-equiv="CONTENT-TYPE" content="text/html; charset=UTF-8"/></p> <p/><title/><br /> <meta name="GENERATOR" content="OpenOffice.org 2.4 (Linux)"/> </p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Seam — это облегченный фреймворк, цель которого — упростить разработку Java EE. </font><font style="vertical-align: inherit;">Точнее говоря, это значительно упрощает разработку, объединяя JSF и JBoss RichFaces с EJB3, JPA или Hibernate. </font><font style="vertical-align: inherit;">Из коробки Seam работает с JSF. </font><font style="vertical-align: inherit;">Чтобы сделать еще один шаг вперед, он работает с RichFaces, компонентами JSF с поддержкой AJAX и возможностью создания скинов, для создания многофункциональных интернет-приложений внутри браузера без дополнительных плагинов.</font></font></p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Браузер является отличной платформой для создания многофункциональных интернет-приложений, но браузер как богатая платформа имеет ограничения. </font><font style="vertical-align: inherit;">Чтобы ускорить процесс, как сказал бы Emeril Lagasse, пользовательский интерфейс на основе Flex, работающий внутри Flash-плеера (виртуальной машины), может использоваться внутри браузеров для предоставления еще более богатых приложений.</font></font></p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Теперь вопрос в том, как использовать Flex и JBoss Seam вместе? </font><font style="vertical-align: inherit;">Мы только меняем пользовательский интерфейс, поэтому бэкэнд остается прежним. </font><font style="vertical-align: inherit;">Ответ Эксадель Фламинго. </font><font style="vertical-align: inherit;">Flamingo позволяет создавать пользовательские интерфейсы на основе Flex и легко подключаться к серверной части Seam.</font></font></p> <p style="margin-bottom: 0in"> </p> <h2><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Exadel Flamingo — Согните и соедините вместе</font></font></h2> <p style="margin-bottom: 0in"> <meta http-equiv="CONTENT-TYPE" content="text/html; charset=UTF-8"/></p> <p/><title/><br /> <meta name="GENERATOR" content="OpenOffice.org 2.4 (Linux)"/> </p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Exadel Flamingo — это инструмент для быстрой загрузки Flex с бэкэндом Seam. </font><font style="vertical-align: inherit;">Фактически, он также поддерживает JavaFX для пользовательского интерфейса и Spring на бэкэнде. </font><font style="vertical-align: inherit;">Так же, как JSF и RichFaces естественным образом работают с Seam, Flamingo делает Flex таким же естественным образом, как и Seam. </font><font style="vertical-align: inherit;">Фламинго имеет три основных особенности:</font></font></p> <p style="margin-bottom: 0in"> </p> <h3 style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">инструменты</font></font></h3> <p style="margin-bottom: 0in"> <meta http-equiv="CONTENT-TYPE" content="text/html; charset=UTF-8"/></p> <p/><title/><br /> <meta name="GENERATOR" content="OpenOffice.org 2.4 (Linux)"/> </p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Flamingo предоставляет возможность быстро генерировать приложение типа CRUD с сущностями, базой данных и пользовательским интерфейсом. </font><font style="vertical-align: inherit;">Создание веб-проекта Java EE стало довольно сложной задачей. </font><font style="vertical-align: inherit;">Существует так много разных способов настройки проекта и множество зависимостей для разрешения. </font><font style="vertical-align: inherit;">С помощью инструментов Flamingo вы можете не только быстро создавать новый проект, но и создавать фрагменты приложения по запросу в течение цикла разработки. </font><font style="vertical-align: inherit;">Если вы когда-либо использовали инструмент seam-gen для создания проекта Seam, то Flamingo предоставляет аналогичные инструменты.</font></font></p> <p style="margin-bottom: 0in"> </p> <h3 style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Интеграционная библиотека</font></font></h3> <p style="margin-bottom: 0in"> <meta http-equiv="CONTENT-TYPE" content="text/html; charset=UTF-8"/></p> <p/><title/><br /> <meta name="GENERATOR" content="OpenOffice.org 2.4 (Linux)"/> </p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Он служит связующим звеном между клиентом Flex и кодом сервера Seam, работающим за кулисами, поэтому разработчики могут сосредоточиться на бизнес-задачах вместо написания «простого» кода. </font><font style="vertical-align: inherit;">Кроме того, связь между Flex и Seam осуществляется через двоичные протоколы.<br /> </font><font style="vertical-align: inherit;">(Они самые эффективные.)</font></font><meta http-equiv="CONTENT-TYPE" content="text/html; charset=UTF-8"/></p> <p/><title/><br /> <meta name="GENERATOR" content="OpenOffice.org 2.4 (Linux)"/> </p> <p><font style="vertical-align: inherit;"/></p> <p style="margin-bottom: 0in"> </p> <h3 style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Клиентские компоненты</font></font></h3> <p style="margin-bottom: 0in"> <meta http-equiv="CONTENT-TYPE" content="text/html; charset=UTF-8"/></p> <p/><title/><br /> <meta name="GENERATOR" content="OpenOffice.org 2.4 (Linux)"/> </p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Это невизуальные компоненты, которые облегчают разработку, обеспечивая проверку, привязку и возможность объединять несколько запросов в один. Одной из ключевых особенностей Flamingo являются динамические постоянные методы. Эти методы позволяют выполнять интуитивные запросы в базе данных на английском языке вместо использования SQL (SQL фактически создается Flamingo на лету.) Или создания объектов DAO (что иногда создает ненужную сложность). Только эта особенность предлагает резкое увеличение производительности. Flaming поддерживает Dynamic Finders и Dynamic Updaters. Вот пример методов динамического поиска:</font></font></p> <p style="margin-bottom: 0in"> </p> <pre class="java">@Entity<br/>public class Person implements Serializable {<br/> private String name;<br/> public String getName() {<br/> return name;<br/> }<br/> public void setName(String name) {<br/> this.name = name;<br/> } <br/>} <br/></pre> <p style="margin-bottom: 0in"> </p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> и используя динамические методы:</font></font></p> <p style="margin-bottom: 0in"> </p> <pre class="java"><mx:RemoteObject id="person" destination="Person" result="resultHandler(event)"/><br/>...<br/>private function resultHandler(event:ResultEvent):void<br/>{<br/> entities = event.result as ArrayCollection;<br/>}<br/>...<br/>person.findAll();<br/>person.findByNameLike("John%");<br/>person.findByNameNotEqual("John Smith");<br/></pre> <p style="margin-bottom: 0in"> </p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> Методы поиска findAll, findByNameLike, findByNameNotEquals автоматически доступны без необходимости их записи.</font></font></p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Хватит болтать! </font><font style="vertical-align: inherit;">Сначала мы рассмотрим быстрый пример, демонстрирующий прозрачность использования Flex с Seam, а затем пройдем пошаговое руководство, в котором будет показано, как создать приложение Flex-Seam.</font></font></p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Сначала мы начнем с компонента Seam. </font><font style="vertical-align: inherit;">Если вы ранее использовали Seam, это должно выглядеть очень знакомо:</font></font></p> <p/> <pre class="java">@Scope(ScopeType.STATELESS)<br/>@Name("helloAction")<br/>public class HelloAction {<br/> public String hello(String name) {<br/> return "Hello, " + name;<br/> }<br/>}<br/></pre> <pre class="java"> </pre> <pre class="java"> </pre> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Далее, давайте посмотрим на клиент Flex:</font></font></p> <p style="margin-bottom: 0in"> </p> <p/> <pre class="xml"><mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:word="*"><br/> <mx:RemoteObject id="service" destination="helloAction"/><br/> <mx:Panel title="Flamingo AMF Hello World Sample" paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10"><br/> <mx:HBox><br/> <mx:Label text='Whom do you want to say "Hello" to?'/> <br/> <mx:TextInput id="who"/><br/> <mx:Button label="Say Hello" click="service.hello(who.text)"/><br/> </mx:HBox><br/> <mx:Label text='The server said: "{service.hello.lastResult}"'/><br/> </mx:Panel><br/></mx:Application><br/><br/></pre> <p style="margin-bottom: 0in"> </p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">В этом примере показано, как метод hello компонента Seam сервера helloAction может быть вызван с помощью RemoteObject при нажатии на кнопку «Say Hello».</font></font></p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Наконец, вот файл services-config.xml:</font></font></p> <p style="margin-bottom: 0in"> </p> <pre class="xml"><?xml version="1.0" encoding="UTF-8"?><br/><services-config><br/><services><br/><service<br/> id="hello-service"<br/> class="flex.messaging.services.RemotingService"<br/> messageTypes="flex.messaging.messages.RemotingMessage"><br/> <destination id="helloAction"><br/> <channels><br/> <channel ref="seam-amf"/><br/> </channels><br/> </destination><br/></service><br/></services><br/><channels><br/> <channel-definition id="seam-amf" class="mx.messaging.channels.AMFChannel"><br/> <endpoint<br/> uri="http://{server.name}:{server.port}/helloworld/seam/resource/amf"<br/> class="flex.messaging.endpoints.AMFEndpoint"/><br/> </channel-definition><br/></channels><br/></services-config></pre> <p style="margin-bottom: 0in"> </p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">В этом примере показан канал seam-amf с заданным URL-адресом для доступа к серверу, который применяется для использования целевого helloAction:</font></font></p> <ol> <li> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">«{server.name}: {server.port}» — это имя сервера: порт сервера, на котором запущено ваше существующее приложение JBoss Seam;</font></font></p> </li> <li> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">«helloworld» — это название вашего существующего приложения;</font></font></p> </li> <li> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">«helloAction» — это имя компонента, указанного в файле «HelloAction.java» (см. аннотацию @Name («helloAction»))</font></font></p> </li> </ol> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Надеюсь, это даст вам представление о том, как легко подключить пользовательский интерфейс Flex с бэкэндом Seam. </font><font style="vertical-align: inherit;">Теперь перейдем к нашему примеру.</font></font></p> <p style="margin-bottom: 0in"> </p> <h2><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Давайте что-то строить</font></font></h2> <p style="margin-bottom: 0in"> <meta http-equiv="CONTENT-TYPE" content="text/html; charset=UTF-8"/></p> <p/><title/><br /> <meta name="GENERATOR" content="OpenOffice.org 2.4 (Linux)"/> </p> <p style="margin-bottom: 0in"> <meta http-equiv="CONTENT-TYPE" content="text/html; charset=UTF-8"/></p> <p/><title/><br /> <meta name="GENERATOR" content="OpenOffice.org 2.4 (Linux)"/> </p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Далее мы будем использовать Maven для создания готового к использованию приложения в стиле CRUD с пользовательским интерфейсом Flex, подключенным к серверной части Seam. </font><font style="vertical-align: inherit;">Хотя приложение будет довольно простым, оно даст вам представление о том, как просто использовать и создавать интерфейсы на основе Flex с Seam. </font><font style="vertical-align: inherit;">Для базы данных мы будем использовать HSQLDB.</font></font></p> <p style="margin-bottom: 0in"> </p> <h2 style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Сборка начальных частей</font></font></h2> <p style="margin-bottom: 0in"> <meta http-equiv="CONTENT-TYPE" content="text/html; charset=UTF-8"/></p> <p/><title/><br /> <meta name="GENERATOR" content="OpenOffice.org 2.4 (Linux)"/> </p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Но сначала нужно сделать несколько вещей, прежде чем мы сможем создать наш первый проект Flex-Seam.</font></font></p> <p style="margin-bottom: 0in"> </p> <h3 class="western"/> <h3><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> Adobe Flex</font></font></h3> <ol> <li> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Загрузите Adobe Flex SDK 3 по адресу: http://opensource.adobe.com/wiki/display/flexsdk/Flex+SDK. </font></font></p> </li> <li> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Распакуйте загруженный файл</font></font></p> </li> <li> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Создайте переменную среды FLEX_HOME и укажите ее в корне установки Adobe Flex SDK</font></font></p> </li> </ol> <h3 class="western"> </h3> <h3> </h3> <h3><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Maven 2</font></font></h3> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Мы будем использовать Maven для создания нашего приложения CRUD</font></font></p> <ol> <li> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Загрузите Maven 2 с: http://maven.apache.org/download.html </font></font></p> </li> <li> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Распакуйте загруженный файл</font></font></p> </li> <li> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Создайте переменную окружения M2_HOME и укажите ее в директории установки Maven, </font></font></p> </li> <li> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Добавьте M2_HOME / bin в вашу PATH </font></font></p> </li> </ol> <h3 class="western"> </h3> <h3> </h3> <h3><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Сервер приложений</font></font></h3> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Мы создадим проект Seam с компонентом EJB3, создадим файл EAR и развернем его на сервере приложений JBoss.</font></font></p> <ol> <li> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Загрузите сервер приложений JBoss по адресу: http://www.jboss.org/jbossas/downloads/</font></font></p> </li> <li> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Распакуйте загруженный файл</font></font></p> </li> </ol> <h3 class="western"> </h3> <h3> </h3> <h3><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Эксадель Фламинго</font></font></h3> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Наконец, вам необходимо скачать последнюю версию Exadel Flamingo. </font></font></p> <ol> <li> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Скачать Exadel Flamingo с: http://flamingo.exadel.com</font></font></p> </li> <li> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Распакуйте загруженный файл</font></font></p> </li> <li> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Перейдите в каталог <flamingo-1.6.0> / bin и запустите файл installflamingo. </font></font></p> </li> <li> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">При желании вы можете добавить каталог <flamingo-1.6.0 / bin> в </font><font style="vertical-align: inherit;">переменную </font></font><i><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">path</font></font></i><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> . </font><font style="vertical-align: inherit;">Это позволит вам запускать команды фламинго из любого места</font></font></p> </li> </ol> <p style="margin-bottom: 0in"> </p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Теперь, когда мы загрузили и настроили все части, мы готовы создать проект. </font></font></p> <h1 style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Генерация нового проекта</font></font></h1> <p style="margin-bottom: 0in"> <meta http-equiv="CONTENT-TYPE" content="text/html; charset=UTF-8"/></p> <p/><title/><br /> <meta name="GENERATOR" content="OpenOffice.org 2.4 (Linux)"/> </p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Чтобы начать генерацию проекта, перейдите в <flamingo-1.6.0> / bin (или, если вы изменили путь для включения этого каталога, вы можете запустить его из любого места) и введите: </font></font></p> <pre>flamingo create project<br/></pre> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Вам будет задан ряд вопросов о проекте. </font><font style="vertical-align: inherit;">В большинстве случаев будут работать значения по умолчанию, но в любом случае рекомендуется явно указывать их явно. </font><font style="vertical-align: inherit;">Значения по умолчанию указаны в скобках [].</font></font></p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Затем ответьте на следующие вопросы с указанными ответами:</font></font></p> <p style="margin-bottom: 0in"> <meta http-equiv="CONTENT-TYPE" content="text/html; charset=UTF-8"/></p> <p/><title/><br /> <meta name="GENERATOR" content="OpenOffice.org 2.4 (Linux)"/> </p> <p style="margin-bottom: 0in"> <table border="1" bordercolor="#000000" cellpadding="4" cellspacing="0" width="667"> <colgroup> <col width="324"/> </colgroup> <colgroup> <col width="325"/> </colgroup> <tbody> <tr valign="top"> <td width="324"> <p><b><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Вопрос</font></font></b></p> </td> <td width="325"> <p><b><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Ваш ответ</font></font></b></p> </td> </tr> <tr valign="top"> <td width="324"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Пожалуйста, выберите тип приложения для создания [фламинго-весна, фламинго-шов]</font></font></p> </td> <td width="325"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">фламингоа шов</font></font></p> </td> </tr> <tr valign="top"> <td width="324"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Пожалуйста, введите местоположение, в котором будет создано ваше новое приложение (например, c: / java / development):</font></font></p> </td> <td width="325"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Введите место, где вы хотите создать проект. </font><font style="vertical-align: inherit;">(Для этого вопроса можно принять значение по умолчанию.)</font></font></p> </td> </tr> <tr valign="top"> <td width="324"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Введите название проекта (например, myproject): </font></font></p> </td> <td width="325"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">гибкий шов</font></font></p> </td> </tr> <tr valign="top"> <td width="324"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Пожалуйста, введите имя корневого пакета для вашего проекта (например, com.mydomain.myproject):</font></font></p> </td> <td width="325"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">com.yourcompany.flexseam</font></font></p> </td> </tr> <tr valign="top"> <td width="324"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Развернут ли этот проект как EAR (с компонентами EJB) или как WAR (без поддержки EJB)? </font><font style="vertical-align: inherit;">[ухо, война]:</font></font></p> </td> <td width="325"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">ухо</font></font></p> </td> </tr> <tr valign="top"> <td width="324"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Будет ли этот проект иметь пользовательский интерфейс Flex или JavaFX? </font><font style="vertical-align: inherit;">[flex, javafx]:</font></font></p> </td> <td width="325"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">сгибать</font></font></p> </td> </tr> <tr valign="top"> <td width="324"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Будет ли этот проект использовать протокол Гессена или AMF? </font><font style="vertical-align: inherit;">[amf, гессиан]:</font></font></p> </td> <td width="325"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">амф</font></font></p> </td> </tr> <tr valign="top"> <td width="324"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Будут ли в этом проекте использоваться сервлеты Seam Remoting или Flamingo? </font><font style="vertical-align: inherit;">[сервлеты, удаленные, оба]:</font></font></p> </td> <td width="325"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Remoting</font></font></p> </td> </tr> <tr valign="top"> <td width="324"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Какую базу данных вы используете? </font><font style="vertical-align: inherit;">[hsql, mysql, oracle, postgres, mssql, db2, sybase, нет]:</font></font></p> </td> <td width="325"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">HSQL</font></font></p> </td> </tr> <tr valign="top"> <td width="324"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Введите URL JDBC для вашей базы данных (например, jdbc: hsqldb :.):</font></font></p> </td> <td width="325"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">jdbc.hsqldb :.</font></font></p> </td> </tr> <tr valign="top"> <td width="324"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Введите имя пользователя базы данных:</font></font></p> </td> <td width="325"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">са</font></font></p> </td> </tr> <tr valign="top"> <td width="324"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Введите пароль базы данных: </font></font></p> </td> <td width="325"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Оставьте пустым, нажмите Enter</font></font></p> </td> </tr> <tr valign="top"> <td width="324"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Хотите ли вы обновлять схему базы данных каждый раз при развертывании? </font><font style="vertical-align: inherit;">[у, п]:</font></font></p> </td> <td width="325"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Y</font></font></p> </td> </tr> <tr valign="top"> <td width="324"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Введите имя класса сущности (также будут созданы исходные файлы Flex для просмотра и изменения сущностей):</font></font></p> </td> <td width="325"> <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Человек</font></font></p> </td> </tr> </tbody> </table> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Чтобы увидеть, что было создано, перейдите в каталог, который вы выбрали для создания проекта.</font></font></p> <p style="margin-bottom: 0in"> </p> <h2 class="western"/> <h2 style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Сборка развертываемого файла</font></font></h2> <p style="margin-bottom: 0in"> <meta http-equiv="CONTENT-TYPE" content="text/html; charset=UTF-8"/></p> <p/><title/><br /> <meta name="GENERATOR" content="OpenOffice.org 2.4 (Linux)"/> </p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Далее нам нужно создать файл EAR, который мы будем развертывать. </font></font></p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Перейдите в корневой каталог проекта и введите эту команду:</font></font></p> <pre>mvn package<br/></pre> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">После завершения сборки перейдите к flex-seam / ear / target. </font><font style="vertical-align: inherit;">Там вы должны увидеть файл EAR flex-seam. </font><font style="vertical-align: inherit;">Это файл, который мы сейчас собираемся развернуть на сервере приложений JBoss.</font></font></p> <p style="margin-bottom: 0in"> </p> <h2 class="western"/> <h2 style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Развертывание и запуск</font></font></h2> <p style="margin-bottom: 0in"> <meta http-equiv="CONTENT-TYPE" content="text/html; charset=UTF-8"/></p> <p/><title/><br /> <meta name="GENERATOR" content="OpenOffice.org 2.4 (Linux)"/> </p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Проще всего скопировать файл EAR в каталог развертывания сервера приложений. </font><font style="vertical-align: inherit;">Скопируйте файл в:</font></font></p> <pre><jbossas>/server/default/deploy<br/></pre> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> Теперь осталось только запустить сервер:</font></font></p> <pre><jbossas>/bin/run</pre> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> После запуска сервера введите этот URL в веб-браузер:</font></font></p> <pre>http://localhost:8080/flex-seam<br/></pre> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> и вы увидите похожую картинку:</font></font></p> <p style="margin-bottom: 0in"> </p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">[Img_assist | NID = 4111 | название = | убывание = | ссылка = нет | выравнивание не = средняя | ширина = 790 | Высота = 547] </font></font></p> <p style="margin-bottom: 0in"> </p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Как видите, создание самого проекта заняло всего несколько минут, и у нас есть довольно простое, но, тем не менее, полностью работающее приложение Flex-Seam.</font></font></p> <p style="margin-bottom: 0in"> </p> <h2><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Вывод</font></font></h2> <p> <meta http-equiv="CONTENT-TYPE" content="text/html; charset=UTF-8"/></p> <p/><title/><br /> <meta name="GENERATOR" content="OpenOffice.org 2.4 (Linux)"/> </p> <p style="margin-bottom: 0in"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Flash player — это мощная виртуальная машина для предоставления многофункциональных интернет-приложений на основе Flex. </font><font style="vertical-align: inherit;">В то же время, Seam значительно упрощает разработку Java EE. </font><font style="vertical-align: inherit;">Создание приложений на основе Flex-Seam сегодня является чрезвычайно привлекательным решением для многих ИТ-менеджеров. </font><font style="vertical-align: inherit;">Одна вещь, которая до сих пор отсутствовала — это простая интеграция между Flex и Seam. </font><font style="vertical-align: inherit;">Вы могли бы сделать это самостоятельно, но вы потратили бы значительное количество времени на написание «правильного» кода, который не имеет ничего общего с бизнес-логикой приложения. </font><font style="vertical-align: inherit;">Exadel Flmaningo делает именно это; </font><font style="vertical-align: inherit;">он упрощает разработку Flex-Seam, предоставляя интеграцию, клиентские компоненты и инструменты быстрой разработки, такие как мгновенное создание проекта.</font></font></p> <p> </p> </div> <div class="content-html" dz-code-container="" ng-cloak=""> <a ng-href="{{articles[0].pdf}}"></p> <p> </a></p> <div class="pub-content content-html" ng-bind-html="article.shortDesc"/> </div> </div> <style class="advgb-styles-renderer"> &lt;!-- @page { size: 8.5in 11in; margin: 0.79in } P { margin-bottom: 0.08in } --&gt;</p> <p> &lt;!-- @page { size: 8.5in 11in; margin: 0.79in } P { margin-bottom: 0.08in } --&gt;</p> <p> &lt;!-- @page { size: 8.5in 11in; margin: 0.79in } P { margin-bottom: 0.08in } --&gt;</p> <p> &lt;!-- @page { size: 8.5in 11in; margin: 0.79in } P { margin-bottom: 0.08in } --&gt;</p> <p> &lt;!-- @page { size: 8.5in 11in; margin: 0.79in } P { margin-bottom: 0.08in } --&gt;</p> <p> &lt;!-- @page { size: 8.5in 11in; margin: 0.79in } P { margin-bottom: 0.08in } --&gt; &lt;!-- @page { size: 8.5in 11in; margin: 0.79in } P { margin-bottom: 0.08in } --&gt;</p> <p> &lt;!-- @page { size: 8.5in 11in; margin: 0.79in } P { margin-bottom: 0.08in } --&gt;</p> <p> &lt;!-- @page { size: 8.5in 11in; margin: 0.79in } P { margin-bottom: 0.08in } --&gt;</p> <p> &lt;!-- @page { size: 8.5in 11in; margin: 0.79in } P { margin-bottom: 0.08in } H3 { margin-bottom: 0.08in } H3.western { font-family: "Nimbus Sans L", "Arial", sans-serif; font-size: 12pt; font-style: italic; font-weight: medium } H3.cjk { font-family: "DejaVu Sans", sans-serif; font-size: 12pt; font-style: italic; font-weight: medium } H3.ctl { font-family: "DejaVu Sans", sans-serif } --&gt;</p> <p> &lt;!-- @page { size: 8.5in 11in; margin: 0.79in } P { margin-bottom: 0.08in } --&gt;</p> <p> &lt;!-- @page { size: 8.5in 11in; margin: 0.79in } P { margin-bottom: 0.08in } H2 { margin-bottom: 0.08in } H2.western { font-family: "Nimbus Sans L", "Arial", sans-serif; font-size: 15pt } H2.cjk { font-family: "DejaVu Sans", sans-serif; font-size: 15pt } H2.ctl { font-family: "DejaVu Sans", sans-serif; font-size: 14pt; font-style: italic } TD P { margin-bottom: 0in } --&gt;</p> <p> &lt;!-- @page { size: 8.5in 11in; margin: 0.79in } P { margin-bottom: 0.08in } H2 { margin-bottom: 0.08in } H2.western { font-family: "Nimbus Sans L", "Arial", sans-serif; font-size: 15pt } H2.cjk { font-family: "DejaVu Sans", sans-serif; font-size: 15pt } H2.ctl { font-family: "DejaVu Sans", sans-serif; font-size: 14pt; font-style: italic } --&gt;</p> <p> &lt;!-- @page { size: 8.5in 11in; margin: 0.79in } P { margin-bottom: 0.08in } --&gt; &lt;!-- @page { size: 8.5in 11in; margin: 0.79in } P { margin-bottom: 0.08in } --&gt; &lt;!-- @page { size: 8.5in 11in; margin: 0.79in } P { margin-bottom: 0.08in } --&gt; </style> </div><!-- .entry-content --> <div class="saxon-social-share-fixed sidebar-position-right"> <div class="post-social-wrapper"> <div class="post-social-title">Share:</div> <div class="post-social"> <a title="Share with VKontakte" href="https://coderlessons.com/articles/java/vzgliad-iznutri-eksadel-flamingo-flex-i-shov-jboss" data-type="vk" data-title="Взгляд изнутри Эксадель Фламинго — Flex и шов JBoss" data-image="" class="vk-share"> <i class="fa fa-vk"></i></a><a title="Share to Telegram" href="tg://msg?text=%D0%92%D0%B7%D0%B3%D0%BB%D1%8F%D0%B4+%D0%B8%D0%B7%D0%BD%D1%83%D1%82%D1%80%D0%B8+%D0%AD%D0%BA%D1%81%D0%B0%D0%B4%D0%B5%D0%BB%D1%8C+%D0%A4%D0%BB%D0%B0%D0%BC%D0%B8%D0%BD%D0%B3%D0%BE+%26%238212%3B+Flex+%D0%B8+%D1%88%D0%BE%D0%B2+JBoss: https://coderlessons.com/articles/java/vzgliad-iznutri-eksadel-flamingo-flex-i-shov-jboss" data-type="link" class="telegram-share"> <i class="fa fa-telegram"></i></a><a title="Share by Email" href="mailto:?subject=Взгляд⠀изнутри⠀Эксадель⠀Фламинго⠀—⠀Flex⠀и⠀шов⠀JBoss&body=https://coderlessons.com/articles/java/vzgliad-iznutri-eksadel-flamingo-flex-i-shov-jboss" data-type="link" class="email-share"> <i class="fa fa-envelope-o"></i></a> </div> <div class="clear"></div> </div> </div> </div> </div> </article> <div class="saxon-post saxon-post-bottom"> <div class="post-details-bottom"> <div class="post-info-tags"> </div> <div class="post-info-wrapper"> <div class="post-info-views"><i class="fa fa-eye" aria-hidden="true"></i>30</div> </div> <div class="post-info-share"> <div class="post-social-wrapper"> <div class="post-social-title">Share:</div> <div class="post-social"> <a title="Share with VKontakte" href="https://coderlessons.com/articles/java/vzgliad-iznutri-eksadel-flamingo-flex-i-shov-jboss" data-type="vk" data-title="Взгляд изнутри Эксадель Фламинго — Flex и шов JBoss" data-image="" class="vk-share"> <i class="fa fa-vk"></i></a><a title="Share to Telegram" href="tg://msg?text=%D0%92%D0%B7%D0%B3%D0%BB%D1%8F%D0%B4+%D0%B8%D0%B7%D0%BD%D1%83%D1%82%D1%80%D0%B8+%D0%AD%D0%BA%D1%81%D0%B0%D0%B4%D0%B5%D0%BB%D1%8C+%D0%A4%D0%BB%D0%B0%D0%BC%D0%B8%D0%BD%D0%B3%D0%BE+%26%238212%3B+Flex+%D0%B8+%D1%88%D0%BE%D0%B2+JBoss: https://coderlessons.com/articles/java/vzgliad-iznutri-eksadel-flamingo-flex-i-shov-jboss" data-type="link" class="telegram-share"> <i class="fa fa-telegram"></i></a><a title="Share by Email" href="mailto:?subject=Взгляд⠀изнутри⠀Эксадель⠀Фламинго⠀—⠀Flex⠀и⠀шов⠀JBoss&body=https://coderlessons.com/articles/java/vzgliad-iznutri-eksadel-flamingo-flex-i-shov-jboss" data-type="link" class="email-share"> <i class="fa fa-envelope-o"></i></a> </div> <div class="clear"></div> </div> </div> </div> </div> </div> <nav id="nav-below" class="navigation-post"> <div class="container-fluid"> <div class="row"> <div class="col-md-6 nav-post-prev saxon-post no-image"> <a href="https://coderlessons.com/articles/java/delai-eto-korotko-no-delai-eto-pravilno" class="nav-post-title-link"><div class="nav-post-title">Назад</div><div class="nav-post-name">Делай это коротко, но делай это правильно!</div></a> </div> <div class="col-md-6 nav-post-next saxon-post no-image"> <a href="https://coderlessons.com/articles/java/uchebnik-po-spring-data-solr-dobavlenie-polzovatelskikh-metodov-vo-vse-repozitorii" class="nav-post-title-link"><div class="nav-post-title">Далее</div><div class="nav-post-name">Учебник по Spring Data Solr: добавление пользовательских методов во все репозитории</div></a> </div> </div> </div> </nav> </div> <div class="col-md-4 post-sidebar sidebar sidebar-right" role="complementary"> <ul id="post-sidebar"> <li id="saxon-categories-3" class="widget widget_saxon_categories"><h2 class="widgettitle">Категории</h2> <div class="post-categories"> <a href="https://coderlessons.com/articles/veb-razrabotka-articles" data-style="">Веб разработка<span class="post-categories-counter">11825</span></a><a href="https://coderlessons.com/articles/java" data-style="">Java<span class="post-categories-counter">7473</span></a><a href="https://coderlessons.com/articles/programmirovanie" data-style="">Программирование<span class="post-categories-counter">3465</span></a><a href="https://coderlessons.com/articles/mobilnaia-razrabotka-articles" data-style="">Мобильная разработка<span class="post-categories-counter">2983</span></a><a href="https://coderlessons.com/articles/predprinimatelstvo" data-style="">Предпринимательство<span class="post-categories-counter">2337</span></a><a href="https://coderlessons.com/articles/devops-articles" data-style="">DevOps<span class="post-categories-counter">1817</span></a><a href="https://coderlessons.com/articles/wordpress" data-style="">Wordpress<span class="post-categories-counter">1583</span></a><a href="https://coderlessons.com/articles/dizain" data-style="">Дизайн<span class="post-categories-counter">1256</span></a><a href="https://coderlessons.com/articles/php" data-style="">PHP<span class="post-categories-counter">1191</span></a><a href="https://coderlessons.com/articles/bazy-dannykh-articles" data-style="">Базы данных<span class="post-categories-counter">947</span></a><a href="https://coderlessons.com/articles/ruby" data-style="">Ruby<span class="post-categories-counter">692</span></a><a href="https://coderlessons.com/articles/upravlenie-proektami" data-style="">Управление проектами<span class="post-categories-counter">232</span></a><a href="https://coderlessons.com/articles/ai-ml" data-style="">AI/ML<span class="post-categories-counter">25</span></a><a href="https://coderlessons.com/articles/go" data-style="">Go<span class="post-categories-counter">10</span></a><a href="https://coderlessons.com/articles/node-js" data-style="">Node.js<span class="post-categories-counter">8</span></a><a href="https://coderlessons.com/articles/testirovanie" data-style="">Тестирование<span class="post-categories-counter">8</span></a><a href="https://coderlessons.com/articles/gamedev" data-style="">GameDev<span class="post-categories-counter">7</span></a> </div> </li> <li id="saxon-list-posts-14" class="widget widget_saxon_list_entries"> <h2 class="widgettitle">Последние статьи</h2> <ul> <li class="template-postsmasonry1-2"> <div class="saxon-postsmasonry1-post saxon-postsmasonry1_2-post saxon-post saxon-post-no-image format-"><div class="post-categories"><a href="https://coderlessons.com/articles" data-style="background-color: #81d742;">Статьи</a></div><div class="saxon-post-details"> <h3 class="post-title"><a href="https://coderlessons.com/articles/programmirovanie/refaktoring-hudson-god-class">Рефакторинг Hudson God Class</a></h3><div class="post-date">Июнь 3, 2019</div></div></div> </li> <li class="template-postsmasonry1-2"> <div class="saxon-postsmasonry1-post saxon-postsmasonry1_2-post saxon-post saxon-post-no-image format-"><div class="post-categories"><a href="https://coderlessons.com/articles" data-style="background-color: #81d742;">Статьи</a></div><div class="saxon-post-details"> <h3 class="post-title"><a href="https://coderlessons.com/articles/java/alternativy-sintaksisa-java-liambda">Альтернативы синтаксиса Java лямбда</a></h3><div class="post-date">Июнь 2, 2019</div></div></div> </li> <li class="template-postsmasonry1-2"> <div class="saxon-postsmasonry1-post saxon-postsmasonry1_2-post saxon-post saxon-post-no-image format-"><div class="post-categories"><a href="https://coderlessons.com/articles" data-style="background-color: #81d742;">Статьи</a></div><div class="saxon-post-details"> <h3 class="post-title"><a href="https://coderlessons.com/articles/java/morphia-i-mongodb-razvivaiushchiesia-struktury-dokumentov">Morphia и MongoDB: развивающиеся структуры документов</a></h3><div class="post-date">Май 29, 2019</div></div></div> </li> <li class="template-postsmasonry1-2"> <div class="saxon-postsmasonry1-post saxon-postsmasonry1_2-post saxon-post saxon-post-no-image format-"><div class="post-categories"><a href="https://coderlessons.com/articles" data-style="background-color: #81d742;">Статьи</a></div><div class="saxon-post-details"> <h3 class="post-title"><a href="https://coderlessons.com/articles/java/openshift-express-razvertyvanie-prilozheniia-java-ee-s-podderzhkoi-as7">OpenShift Express: развертывание приложения Java EE (с поддержкой AS7)</a></h3><div class="post-date">Май 29, 2019</div></div></div> </li> <li class="template-postsmasonry1-2"> <div class="saxon-postsmasonry1-post saxon-postsmasonry1_2-post saxon-post saxon-post-no-image format-"><div class="post-categories"><a href="https://coderlessons.com/articles" data-style="background-color: #81d742;">Статьи</a></div><div class="saxon-post-details"> <h3 class="post-title"><a href="https://coderlessons.com/articles/java/integratsiia-jqgrid-rest-ajax-i-spring-mvc">Интеграция jqGrid, REST, AJAX и Spring MVC</a></h3><div class="post-date">Май 29, 2019</div></div></div> </li> </ul> </li> <li id="custom_html-8" class="widget_text widget widget_custom_html"><div class="textwidget custom-html-widget"><div class="rl_cnt_bg" data-id="289286"></div></div></li> <li id="custom_html-9" class="widget_text widget widget_custom_html"><div class="textwidget custom-html-widget"><div class="rl_cnt_bg" data-id="289288"></div></div></li> <li id="custom_html-10" class="widget_text widget widget_custom_html"><div class="textwidget custom-html-widget"><div class="rl_cnt_bg" data-id="289289"></div></div></li> </ul> </div> </div> </div> </div> <a class="scroll-to-top btn alt" aria-label="Scroll to top" href="#top"></a> <div class="footer-wrapper"> <footer class="footer-black"> <div class="container"> <div class="row"> <div class="col-md-12 footer-menu" role="navigation"> </div> <div class="col-md-12 col-sm-12 footer-copyright"> <p>© Copyright 2024 <a href="https://coderlessons.com">CoderLessons.com</a></p> </div> </div> </div> </footer> </div> <script type='text/javascript'> "use strict";var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||!1,descriptor.configurable=!0,"value"in descriptor&&(descriptor.writable=!0),Object.defineProperty(target,descriptor.key,descriptor)}}return function(Constructor,protoProps,staticProps){return protoProps&&defineProperties(Constructor.prototype,protoProps),staticProps&&defineProperties(Constructor,staticProps),Constructor}}();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}var RocketBrowserCompatibilityChecker=function(){function RocketBrowserCompatibilityChecker(options){_classCallCheck(this,RocketBrowserCompatibilityChecker),this.passiveSupported=!1,this._checkPassiveOption(this),this.options=!!this.passiveSupported&&options}return _createClass(RocketBrowserCompatibilityChecker,[{key:"_checkPassiveOption",value:function(self){try{var options={get passive(){return!(self.passiveSupported=!0)}};window.addEventListener("test",null,options),window.removeEventListener("test",null,options)}catch(err){self.passiveSupported=!1}}},{key:"initRequestIdleCallback",value:function(){!1 in window&&(window.requestIdleCallback=function(cb){var start=Date.now();return setTimeout(function(){cb({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-start))}})},1)}),!1 in window&&(window.cancelIdleCallback=function(id){return clearTimeout(id)})}},{key:"isDataSaverModeOn",value:function(){return"connection"in navigator&&!0===navigator.connection.saveData}},{key:"supportsLinkPrefetch",value:function(){var elem=document.createElement("link");return elem.relList&&elem.relList.supports&&elem.relList.supports("prefetch")&&window.IntersectionObserver&&"isIntersecting"in IntersectionObserverEntry.prototype}},{key:"isSlowConnection",value:function(){return"connection"in navigator&&"effectiveType"in navigator.connection&&("2g"===navigator.connection.effectiveType||"slow-2g"===navigator.connection.effectiveType)}}]),RocketBrowserCompatibilityChecker}(); </script> <script type='text/javascript'> class RocketLazyLoadScripts{constructor(t,e){this.attrName="data-rocketlazyloadscript",this.browser=e,this.options=this.browser.options,this.triggerEvents=t,this.userEventListener=this.triggerListener.bind(this),window.addEventListener("touchstart",function(){})}init(){this._addEventListener(this)}reset(){this._removeEventListener(this)}_addEventListener(t){this.triggerEvents.forEach(e=>window.addEventListener(e,t.userEventListener,t.options))}_removeEventListener(t){this.triggerEvents.forEach(e=>window.removeEventListener(e,t.userEventListener,t.options))}_loadScriptSrc(){const t=document.querySelectorAll(`script[${this.attrName}]`);0!==t.length?(Array.prototype.slice.call(t).forEach(t=>{const e=t.getAttribute(this.attrName);t.setAttribute("src",e),t.removeAttribute(this.attrName)}),this.reset()):this.reset()}triggerListener(t){if(t&&t.target){if("A"==t.target.tagName)return;if("I"==t.target.tagName&&"fa fa-bars"==t.target.className)return}this._loadScriptSrc(),this._removeEventListener(this)}static run(){if(!RocketBrowserCompatibilityChecker)return;const t=new RocketBrowserCompatibilityChecker({passive:!0});new RocketLazyLoadScripts(["keydown","mouseover","touchmove","touchstart"],t).init()}}RocketLazyLoadScripts.run(); </script> <script type='text/javascript'> /* <![CDATA[ */ var RocketPreloadLinksConfig = {"excludeUris":"\/(.+\/)?feed\/?.+\/?|\/(?:.+\/)?embed\/|\/(index\\.php\/)?wp\\-json(\/.*|$)|\/wp-admin|\/logout|\/wp-login.php","usesTrailingSlash":"","imageExt":"jpg|jpeg|gif|png|tiff|bmp|webp|avif","fileExt":"jpg|jpeg|gif|png|tiff|bmp|webp|avif|php|pdf|html|htm","siteUrl":"https:\/\/coderlessons.com","onHoverDelay":"100","rateThrottle":"3"}; /* ]]> */ </script> <script type='text/javascript'> (function() { "use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e=function(){function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),e}}();function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var t=function(){function n(e,t){i(this,n),this.browser=e,this.config=t,this.options=this.browser.options,this.prefetched=new Set,this.eventTime=null,this.threshold=1111,this.numOnHover=0}return e(n,[{key:"init",value:function(){!this.browser.supportsLinkPrefetch()||this.browser.isDataSaverModeOn()||this.browser.isSlowConnection()||(this.regex={excludeUris:RegExp(this.config.excludeUris,"i"),images:RegExp(".("+this.config.imageExt+")$","i"),fileExt:RegExp(".("+this.config.fileExt+")$","i")},this._initListeners(this))}},{key:"_initListeners",value:function(e){-1<this.config.onHoverDelay&&document.addEventListener("mouseover",e.listener.bind(e),e.listenerOptions),document.addEventListener("mousedown",e.listener.bind(e),e.listenerOptions),document.addEventListener("touchstart",e.listener.bind(e),e.listenerOptions)}},{key:"listener",value:function(e){var t=e.target.closest("a"),n=this._prepareUrl(t);if(null!==n)switch(e.type){case"mousedown":case"touchstart":this._addPrefetchLink(n);break;case"mouseover":this._earlyPrefetch(t,n,"mouseout")}}},{key:"_earlyPrefetch",value:function(t,e,n){var i=this,r=setTimeout(function(){if(r=null,0===i.numOnHover)setTimeout(function(){return i.numOnHover=0},1e3);else if(i.numOnHover>i.config.rateThrottle)return;i.numOnHover++,i._addPrefetchLink(e)},this.config.onHoverDelay);t.addEventListener(n,function e(){t.removeEventListener(n,e,{passive:!0}),null!==r&&(clearTimeout(r),r=null)},{passive:!0})}},{key:"_addPrefetchLink",value:function(i){return this.prefetched.add(i.href),new Promise(function(e,t){var n=document.createElement("link");n.rel="prefetch",n.href=i.href,n.onload=e,n.onerror=t,document.head.appendChild(n)}).catch(function(){})}},{key:"_prepareUrl",value:function(e){if(null===e||"object"!==(void 0===e?"undefined":r(e))||!1 in e||-1===["http:","https:"].indexOf(e.protocol))return null;var t=e.href.substring(0,this.config.siteUrl.length),n=this._getPathname(e.href,t),i={original:e.href,protocol:e.protocol,origin:t,pathname:n,href:t+n};return this._isLinkOk(i)?i:null}},{key:"_getPathname",value:function(e,t){var n=t?e.substring(this.config.siteUrl.length):e;return n.startsWith("/")||(n="/"+n),this._shouldAddTrailingSlash(n)?n+"/":n}},{key:"_shouldAddTrailingSlash",value:function(e){return this.config.usesTrailingSlash&&!e.endsWith("/")&&!this.regex.fileExt.test(e)}},{key:"_isLinkOk",value:function(e){return null!==e&&"object"===(void 0===e?"undefined":r(e))&&(!this.prefetched.has(e.href)&&e.origin===this.config.siteUrl&&-1===e.href.indexOf("?")&&-1===e.href.indexOf("#")&&!this.regex.excludeUris.test(e.href)&&!this.regex.images.test(e.href))}}],[{key:"run",value:function(){"undefined"!=typeof RocketPreloadLinksConfig&&new n(new RocketBrowserCompatibilityChecker({capture:!0,passive:!0}),RocketPreloadLinksConfig).init()}}]),n}();t.run(); }()); </script> <script>window.lazyLoadOptions={elements_selector:"img[data-lazy-src],.rocket-lazyload",data_src:"lazy-src",data_srcset:"lazy-srcset",data_sizes:"lazy-sizes",class_loading:"lazyloading",class_loaded:"lazyloaded",threshold:300,callback_loaded:function(element){if(element.tagName==="IFRAME"&&element.dataset.rocketLazyload=="fitvidscompatible"){if(element.classList.contains("lazyloaded")){if(typeof window.jQuery!="undefined"){if(jQuery.fn.fitVids){jQuery(element).parent().fitVids()}}}}}};window.addEventListener('LazyLoad::Initialized',function(e){var lazyLoadInstance=e.detail.instance;if(window.MutationObserver){var observer=new MutationObserver(function(mutations){var image_count=0;var iframe_count=0;var rocketlazy_count=0;mutations.forEach(function(mutation){for(i=0;i<mutation.addedNodes.length;i++){if(typeof mutation.addedNodes[i].getElementsByTagName!=='function'){continue} if(typeof mutation.addedNodes[i].getElementsByClassName!=='function'){continue} images=mutation.addedNodes[i].getElementsByTagName('img');is_image=mutation.addedNodes[i].tagName=="IMG";iframes=mutation.addedNodes[i].getElementsByTagName('iframe');is_iframe=mutation.addedNodes[i].tagName=="IFRAME";rocket_lazy=mutation.addedNodes[i].getElementsByClassName('rocket-lazyload');image_count+=images.length;iframe_count+=iframes.length;rocketlazy_count+=rocket_lazy.length;if(is_image){image_count+=1} if(is_iframe){iframe_count+=1}}});if(image_count>0||iframe_count>0||rocketlazy_count>0){lazyLoadInstance.update()}});var b=document.getElementsByTagName("body")[0];var config={childList:!0,subtree:!0};observer.observe(b,config)}},!1)</script><script data-no-minify="1" async src="https://coderlessons.com/wp-content/plugins/wp-rocket/assets/js/lazyload/16.1/lazyload.min.js"></script><!-- Yandex.Metrika counter --> <noscript><div><img src="https://mc.yandex.ru/watch/54595627" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --> <script>"use strict";var wprRemoveCPCSS=function wprRemoveCPCSS(){var elem;document.querySelector('link[data-rocket-async="style"][rel="preload"]')?setTimeout(wprRemoveCPCSS,200):(elem=document.getElementById("rocket-critical-css"))&&"remove"in elem&&elem.remove()};window.addEventListener?window.addEventListener("load",wprRemoveCPCSS):window.attachEvent&&window.attachEvent("onload",wprRemoveCPCSS);</script><script src="https://coderlessons.com/wp-content/cache/min/1/e8d15a8dface5f60534f3314a58fab87.js" data-minify="1" defer></script><noscript><link rel="stylesheet" href="https://coderlessons.com/wp-content/cache/min/1/911fba3b9ba09a8cf07a113e4f0f6b6a.css" media="all" data-minify="1" /></noscript></body> </html> <!-- This website is like a Rocket, isn't it? Performance optimized by WP Rocket. Learn more: https://wp-rocket.me - Debug: cached@1712294566 -->