Liferay. Часть 2: Пишем первый портлет
Эфир чист. Помех не наблюдается. Приемники настроены на VR-частоту. Снова вещает Kastor. Всем доброго времени!
Log in В первой части мы с тобой познакомились с таким средством построения корпоративных порталов как Liferay. Рассмотрели его достоинства и недостатки, возможности применения, а так же запустили сам сервер и настроили среду разработки. Надеюсь, у тебя было время поэкспериментировать с порталом, поиграть стандартными портлетами и настройками сервера. Если нет, но тебе жутко интересно, то не переживай. В одной из следующих частей мы рассмотрим стандартные возможности портала. Создадим несколько групп, ролей, назначим им права доступа и посмотрим, как это все скажется, например, на работе стандартного форума. Но сегодня у нас стоит другая задача. Мы научимся расширять функционал портала за счет портлетов. И, невзирая на тему данной статьи, портлетов будет два.
Что за портлеты и как их писать? Все очень просто. Как я уже говорил, портлет, это небольшое веб-приложение, размещаемое на странице портала. Он выполняет свою задачу и может взаимодействовать с другими портлетами, обмениваясь с ними данными. Возможность обмениваться сообщениями позволяет создать необходимое количество портлетов, выполняющих маленькие задачи, но в совокупности, представляющие собой единый механизм. Вот такой небольшой механизм мы сегодня и создадим.
У тебя уже должна быть установлена среда разработки Eclipse вместе с плагином для создания Liferay приложений. Есть несколько способов создания портлетов, но для наших целей отлично подойдет веб-фреймворк под названием Vaadin. Он представляет из себя открытый набор библиотек, который мы можем использовать для создания своего приложения. Большим плюсом является хорошая документация, а так же сайт, где можно ознакомиться с примерами работы каждого компонента. Как всегда, ссылки на все важные и полезные ресурсы я приведу в конце статьи. Самый прикол Vaadin в том, что приложения мы будем писать полностью на Java. Библиотека сама будет решать, каким образом нам выводить интерфейс, а так же выбирать на сервере или на стороне клиента нужно выполнять определенный код. Вводные получили, так что запускай сервер баз данных (на котором у тебя создана база lportal), портал и саму среду разработки. Мы начинаем!
First step Для работы с Vaadin нам нужно подготовить наш портал. Для этого телепортируемся по ссылке ]]> https://vaadin.com/directory#addon/vaadin-control-panel-for-liferay ]]> и забираем оттуда архив, в котором лежит нужный нам файл «vaadin-controlpanel-for-liferay.war». Для скачивания тебе придется зарегистрироваться. Данный файл необходимо скопировать в папку \liferay-portal-6.1.1-ce-ga2\deploy\. Это специальная папка, куда мы будем в дальнейшем копировать наши портлеты для деплоя их на сервер. Через несколько секунд файл должен исчезнуть из директории. Это нормально. Он задеплоился. В качестве результата мы получим возможность обновлять библиотеку Vaadin на сервере, а так же компилировать необходимые для работы виджеты. Заходим на наш сервер по адресу localhost:8080, логинимся под админом и идем в Control Panel.
В разделе настроек Portal у тебя должен появиться подраздел Vaadin. Не появился? Подожди пару секунд и обнови страницу. Отлично! Здесь мы видим, что нам предлагают обновить библиотеку Vaadin, а так же скачать необходимые для ее работы библиотеки и зависимости. Сделаем это.
В Output Console будет выводиться результат обновления. Это займет немного времени, но и его мы терять не будем. Для создания того или иного функционала нам часто придется прибегать к возможностям уже реализованных компонентов. Сегодня как раз тот самый день. Мы сделаем два портлета, которые будут обмениваться сообщениями. Эта возможность реализована в компоненте vaadin-ipc-for-liferay, который можно забрать с того же сайта ]]> https://vaadin.com/directory#addon/vaadin-ipc-for-liferay ]]> К этому времени уже должен обновиться Vaadin. Об этом в консоли будут сигнализировать строки, последняя из которых гласит «Don’t forget to compile widgetset». Окей, спасибо. Не забудем. Только что бы лишний раз не делать эту компиляцию сначала закинем из только что скачанного архива наш компонент vaadin-ipc-for-liferay-1.0.0.jar в директорию \liferay-portal-6.1.1-ce-ga2\tomcat-7.0.27\webapps\ROOT\WEB-INF\lib\. Следует запомнить этот путь, так как туда складываются все необходимые для работы новые add-on’ы. После копирования нажми в Control Panel кнопку re-scan. Должен появиться наш компонент, который следует выделить галочкой и нажать кнопку Compile Widget Set.
Придется немного подождать. Советую сходить на кухню за чашечкой кофе. Скоро будем кодить.
Let’s go Радуемся надписи «Compilation succeeded» в консоли и идем в Eclipse. Наконец создадим с тобой наш первый Liferay Project.
Появится окно, где мы должны ввести название проекта, проверить правильность выбранного Liferay Plugins SDK и сервера, а так же в качестве типа проекта выбрать Portlet.
Как видишь, мы можем создавать не только портлеты, но и хуки, лайауты и темы. На данном этапе нам эти вещи не нужны. Возможно, мы рассмотрим их в будущем, но сейчас сосредоточимся на портлетах. Жми Next. Нам предложат выбрать способ разработки портлета.
Если ты со мной, то выбирай Vaadin и финишируй. В окне Project Explorer Eclipse отобразит наш проект.
По подчеркнутому пути лежит java файл, в котором мы будем кодить функционал нашего портлета. Давай взглянем на первоначальный код, который там находится.
Спойлер package EnterDataPortlet;
//импортируются необходимые библиотеки для нашего приложения import com.vaadin.Application; import com.vaadin.ui.Label; import com.vaadin.ui.Window;
@SuppressWarnings("serial") public class EnterDataPortletApplication extends Application
>Надеюсь, мои комментарии помогут разобраться в коде. Давай пока ничего не будем менять и задеплоим то, что есть на сервер. Для этого правой клавишей вызови контекстное меню для нашего проекта и выбери Run As -> Run on Server.
Появится окно, в котором просто нужно выбрать сервер, куда деплоить портлет. Он у нас пока один, поэтому жми Next. Появится второе окно с двумя списками. В первом будут находиться портлеты, которые еще не деплоятся на сервер, а во втором будут портлеты, которые нужно задеплоить. Вот сейчас у тебя во втором списке будет один твой портлет. Жмем финишь и ждем. В следующий раз можно так не заморачиваться и просто перетаскивать мышкой наш проект на сервер, который отображается в Eclipse в окошке Servers. Результат деплоя отображается в консоли, куда обычно выводится большое количество информации. Так сразу и не поймешь, что там происходит, но со временем ты научишься различать ошибки, варнинги и просто системную информацию друг от друга. Во время деплоя наш проект превратился в war файл и скопировался в уже известную нам папку \liferay-portal-6.1.1-ce-ga2\deploy\. Помнишь, мы копировали в нее vaadin-control-panel.war? Так вот тоже самое сейчас произошло с нашим портлетом автоматически. Мы могли бы сделать экспорт нашего портлета в war файл и скопировать в директорию deploy. Это было бы так же справедливо.
Давай взглянем, что же у нас получилось. Портлет задеплоен, пора отобразить его на странице нашего портала. Шагаем в браузере на localhost:8080 и в верхнем левом углу жмем на кнопочку Add -> Page. Так мы создадим новую страницу на портале, на которой мы будем тестить свои поделки. Вводи название страницы и жми Enter. Теперь снова жми Add -> More. Появится окошко с портлетами, которые поделены на группы. Наш лежит в разделе Sample. Позже мы научимся создавать новые разделы и ложить туда свои портлеты, но пока не до этого. Находим наш портлет и жмем кнопочку Add (или просто перетаскиваем его мышкой на страницу).
После добавления обновляем страницу и видим результат.
Да, это наш первый портлет с единственным лейблом. Впечатлен? Я тоже нет. Поэтому идем на кухню за второй чашечкой кофе, усаживаемся удобнее и открываем Eclipse. Сейчас мы немного изменим функционал нашего портлета. Поступим следующим образом. Я приведу исходный код, который ты должен будешь вписать в java файл своего портлета. Код постараюсь подробно прокомментировать, что бы ты мог в нем разобраться. А после, расскажу вкратце, что же мы с тобой сделали. Поехали! Спойлер package EnterDataPortlet;
//импортируются необходимые библиотеки для нашего приложения import com.vaadin.Application; import com.vaadin.addon.ipcforliferay.LiferayIPC; import com.vaadin.ui.Button; import com.vaadin.ui.TextField; import com.vaadin.ui.Window; import com.vaadin.ui.Button.ClickEvent;
@SuppressWarnings("serial") public class EnterDataPortletApplication extends Application
>); >//функция для отправки введенного в текстовое поле значения private void sendValue() < //проверяем, содержит ли что нибудь текстовое поле if (textField.getValue() != null) < //если содержит и это не пустая строка, то if (textField.getValue().toString().equals("") != true) < //получаем значение из текстового поля в переменную value String value = textField.getValue().toString();
//отправляем сообщение "ADD_VALUE", в котором передаем наше введенное значение liferayIpc.sendEvent(MESSAGE_NAME, value);
После того, как перепишешь этот код, не спеши проверять результат. Давай посмотрим, что мы сделали. Мы создали три компонента: 1) TextField – обычное текстовое поле с заголовком, куда мы будем вводить наши данные. 2) Button – стандартная кнопка, предназначенная для выполнения какого либо действия. 3) LiferayIPC - компонент, предназначенный для отправки и приема сообщений. Первые два компонента стандартные, поэтому с ними проблем нет. А вот последний мы скачивали и устанавливали отдельно. Теперь, что бы его использовать, нужно не просто импортировать его в коде, но и указать путь, где нужно искать эту библиотеку. Для этого в нашем проекте идем в папку docroot->WEB-INF и открываем файл liferay-plugin-package.properties. Здесь нам нужно добавить путь к нашему файлу vaadin-ipc-for-liferay.jar, который мы скачивали ранее и добавляли в директорию \liferay-portal-6.1.1-ce-ga2\tomcat-7.0.27\webapps\ROOT\WEB-INF\lib\.
После этого мы можем в коде делать импорт для LiferayIPC и создавать его объекты. Так, с подключаемыми компонентами разобрались. Надеюсь, что исходный код портлета так же ясен. По нажатию на кнопку, мы проверяем, введено ли что-нибудь в текстовое поле. Если да, то отправляем его в сообщении с названием «ADD_VALUE». После сохранения исходника, портлет должен сам передеплоиться. Если нет, то сделай деплой, как мы это делали раньше. Идем на сервер, обновляем страницу и видим наш портлет.
Отлично! Дело осталось за малым. Нам нужен второй портлет, который будет принимать сообщения, и отображать принятые значения у себя в списке. План действий такой: 1) Создавай новый портлет, как мы это делали ранее. 2) Сразу подключи библиотеку LiferayIPC через файл liferay-plugin-package.properties, как я только что показал на примере первого портлета. 3) Постарайся вникнуть в прокомментированный исходный код второго портлета и перепиши его себе. Спойлер package ReceivedDataPortlet;
import com.vaadin.Application; import com.vaadin.addon.ipcforliferay.LiferayIPC; import com.vaadin.addon.ipcforliferay.event.LiferayIPCEvent; import com.vaadin.addon.ipcforliferay.event.LiferayIPCEventListener; import com.vaadin.ui.ListSelect; import com.vaadin.ui.Window;
@SuppressWarnings("serial") public class ReceivedDataPortletApplication extends Application
); >Второй портлет не сложнее первого. Создается обычный список, для отображения принятых значений. А так же создается слушатель на прибытие сообщения с названием «ADD_VALUE». Из этого сообщения мы получаем строковое значение, которое и выводим в список. Все! Деплоим второй портлет на сервер, добавляем на страницу и смотрим результат.
Log out Сегодня мы научились создавать свои собственные портлеты и деплоить их на портал. А заодно и освоили передачу сообщений между портлетами. Сразу должен предупредить, что обмен сообщениями между портлетами при помощи LiferayIPC работает, только если портлеты находятся на одной странице. То есть если мы расположим наш портлет на другой странице, а в первом отправим введенный текст, то во втором ничего не отобразится. Не стоит из-за этого переживать. Есть механизм и для отправки сообщений не только на одну страницу, а и на весь портал в целом. Еще ты можешь возразить, что так передавать данные между портлетами не очень правильно, учитывая, что передавать можно только строковые значения. И ты будешь прав, но есть два но. Во-первых, LiferayIPC может передавать не только строковые значения, но и целые объекты. Возможно, в дальнейшем мы коснемся этой темы. Во-вторых, сегодняшний пример передачи сообщений представлен просто в ознакомительных целях. В следующий раз мы усовершенствуем наши портлеты. Первый будет добавлять записи в созданную нами таблицу в базе данных, а второй будет выводить у себя содержимое таблицы из БД. И вот когда первый портлет добавит запись, он отправит сообщение второму портлету, что бы тот обновил содержимое. Вот такое использование сообщений более правильное.
Мой дорогой читатель, на сегодня все! Пора нам опустошить организм после двух чашек кофе, что мы пили на протяжении урока, а потом и проветрить мозги на свежем воздухе. Следующий урок будет еще интереснее. До встречи!