Поиск…


замечания

Это работает с Liferay Portal до версии 6.2.

JSP Hook

JSP-крючки - это специальный плагин liferay, позволяющий модифицировать портлет jsp-s основного ядра, скажем, вы хотите изменить портлет входа, чтобы показать « Welcome in my custom login! ,

Минимальная структура для плагина Hook выглядит следующим образом:

[project-name]-hook/
 └── docroot/
     ├── WEB-INF/
     │   ├── src/
     │   ├── lib/
     │   ├── liferay-hook.xml
     │   ├── liferay-plugin-package.properties
     │   └── web.xml
     └── META-INF/
         ├── custom_jsps/
         └── MANIFEST.MF

liferay-hook.xml - это файл, который определяет тип используемого вами крючка, здесь вы определяете внутри метки крючка правильный параметр для крючка для JSP-крючка:

<?xml version="1.0"?>
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.2.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_2_0.dtd">

<hook>
    <custom-jsp-dir>/custom_jsps</custom-jsp-dir>
</hook>

login.jsp находится в Liferay в /docroot/html/portlet/login/login.jsp , чтобы сделать его крючком, нам нужно добавить jsp с тем же именем и путем в нашей папке custom_jsps .

Когда крючок развернут, Liferay будет выглядеть в liferay-hook.xml для значения custom-jsp-dir и заменит все JSP liferay-hook.xml на найденные в этом каталоге. Исходные jsp сохраняются с именем <orginal name>.portal.jsp для восстановления в случае перехвата перехвата.

Мы даже можем вызывать оригинальные JSP в новом модифицированном JSP, если мы хотим сохранить код, адаптирующийся к обновлениям или обновлениям базовой версии платформы Liferay. Для этого в вашем пользовательском JSP используйте следующий шаблон:

<liferay-util:buffer var="contentHtml">
    <liferay-util:include page="/html/{ JSP file’s path }" />
</liferay-util:buffer>

где { JSP file's path } в этом случае будет portlet/login/login.portal.jsp . Это называется расширением исходного jsp .

Затем мы можем добавить к нему контент:

<%
contentHtml = StringUtil.add("Stuff I'm adding BEFORE the original content", contentHtml,"\n");    
contentHtml = StringUtil.add(contentHtml,"Stuff I'm adding AFTER the original content","\n");
%>
<%= contentHtml %>

Зажимы

Этот тип Hook может использоваться для переопределения основных /login/forgot_password портала (например, c/portal/login ) и действий с помощью портлетов (например, /login/forgot_password ), эти действия для Liferay Portal указаны в файле /login/forgot_password struts-config.xml в его WEB-INF Чтобы переопределить действие:

  1. в liferay-hook.xml вашего плагина-крючка под docroot/WEB-INF , добавьте элемент struts-action docroot/WEB-INF элемент hook.
  2. Внутри элемента struts-action добавьте struts-action-path который указывает путь действия, который вы переопределяете, и struts-action-impl который указывает ваш пользовательский struts-action-impl действий. Это выглядит так:
 <struts-action-path>/login/login</struts-action-path>
    <struts-action-impl>
    com.myhook.action.ExampleStrutsPortletAction
    </struts-action-impl>
</struts-action> 
  1. Создайте класс действия портлета Struts, который расширяет BaseStrutsPortletAction . Примером этого класса является:
 public class ExampleStrutsPortletAction extends BaseStrutsPortletAction {

        public void processAction(StrutsPortletAction originalStrutsPortletAction,
                PortletConfig portletConfig, ActionRequest actionRequest,
                ActionResponse actionResponse) throws Exception {

            System.out.println("Custom Struts Action");

            originalStrutsPortletAction.processAction(originalStrutsPortletAction,
                    portletConfig, actionRequest, actionResponse);
        }

    public String render(StrutsPortletAction originalStrutsPortletAction,
            PortletConfig portletConfig, RenderRequest renderRequest,
            RenderResponse renderResponse) throws Exception {

        System.out.println("Custom Struts Action");

        return originalStrutsPortletAction.render(null, portletConfig,
                renderRequest, renderResponse);
    }
}

Вызов переопределенного метода, такого как originalStrutsPortletAction.processAction , не является обязательным, но является лучшей практикой для сохранения поведения в действии без изменений в отношении Liferay Portal. Этот тип крюка можно также использовать для добавления новых действий Struts, это то же самое, что и модификация существующего действия, в этом случае liferay-hook.xml будет:

<struts-action>
    <struts-action-path>/my/custom/path</struts-action-path>
    <struts-action-impl>
    com.myhook.action.ExampleStrutsAction
    </struts-action-impl>
</struts-action>

Привет, пользователь «Имя» с помощью крючков

В этом примере будет показано, как сделать простой «Hello User [name]» после входа в систему. Пример основан на выполнении пользовательского действия с использованием крючка

С вашего терминала командной строки перейдите в папку «Перехватчики» плагинов SDK. Чтобы создать проект hook, вы должны выполнить скрипт create. Ниже приведен формат для выполнения скрипта:

create. [sh | bat] [имя-проекта] "[Отображаемое имя крюка]"

В Linux и Mac OS X вы должны ввести команду, аналогичную той, которая приведена в этом примере:

./create.sh Привет-пользователь «Привет, пользователь»

В Windows вы должны ввести команду, аналогичную команде в этом примере:

create.bat Привет-пользователь «Мой крюк»

Мастер нового проекта Liferay IDE и сценарии создания генерируют проекты крюков в папке «Перехватчики» плагинов SDK. SDK плагинов автоматически добавляет «-hook» к вашему имени проекта.

Независимо от того, создан ли ваш проект крюка из среды Liferay или из командной строки, вы получаете ту же структуру проекта (см. Выше).

  • Определите событие, на котором вы хотите активировать свое действие. Просмотрите документацию portal.properties, чтобы найти подходящее свойство события. Подсказка: свойства события имеют .event на свое имя. В следующих разделах документации portal.properties есть сеанс, запуск, завершение работы и свойства событий портала: сеанс - события запуска - события выключения - события портала
  • В своем проекте hook создайте класс Java, который расширяет класс com.liferay.portal.kernel.events.Action. Переопределите метод Action.run (HttpServletRequest, HttpServletResponse) .
       import com.liferay.portal.kernel.events.Action;
       import javax.servlet.http.HttpServletRequest;
       import javax.servlet.http.HttpServletResponse;
       import com.liferay.portal.model.User;
       import com.liferay.portal.util.PortalUtil;

       public class HelloUser extends Action {
           public void run(HttpServletRequest req, HttpServletResponse res) {
               User user = PortalUtil.getUser(req);
               System.out.println("Hello User "+user.getScreenName());
           }
       }

Важно: если ваше действие разрешает объект HttpServletRequest, расширьте com.liferay.portal.kernel.events.Action; в противном случае расширьте com.liferay.portal.struts.SimpleAction.

  • Создайте файл свойств, portal.properties , в папке docroot / WEB-INF / src вашего проекта. Затем добавьте имя свойства события портала, соответствующее событию, на котором вы хотите выполнить свое действие. Укажите полное имя класса действия в качестве значения свойства.

    `login.events.post=HelloUser`
    

    Например, чтобы выполнить действие класса непосредственно перед входом в портал для пользователя, вы должны указать свойство login.events.pre со своим классом действий в качестве его значения. Он может выглядеть так, как это свойство.

Важно. Поскольку свойства портала, такие как login.events.pre, принимают несколько значений, вы должны добавить свои значения к существующим значениям. Вы можете многократно изменять свойства из дополнительных крючков.

Измените только свойство портала, которое принимает одно значение из одного плагина. Если вы изменяете значение свойства из нескольких плагинов, Liferay не будет знать, какое значение использовать.

  • Измените файл docroot / WEB-INF / liferay-hook.xml и добавьте
    имя файла портала портала hook как значение для
    Элемент <portal-properties>...</portal-properties> в вашем
    hook <hook>...</hook> . Например, если имя файла свойств вашего крючка является portal.properties , вы должны указать этот элемент:
<portal-properties>portal.properties</portal-properties>
  • Разверните свой крючок, перейдите на свой крюковый путь и введите ant clean deploy вы увидите .war в папке dist.

Теперь, если вы войдете в систему liferay, вы увидите в журнале сервера сообщение типа «Hello user Admin».

Крючок приемника модели

Фон

Ключ Lister List - это тип плагина Liferay, который прослушивает события, принятые на модели, и выполняет код в ответ. Перехватчики List Lister аналогичны методам Custom Struts Action, поскольку они реагируют на действие, предпринятое в портале. Однако, в то время как действия Struts реагируют на действие, предпринятое пользователем, Model Listener отвечает (до или после) событие с использованием модели Liferay.


Различия

Вот несколько примеров действий Struts Actions v. Listeners для сравнения.

  • Действие Struts
    • Логин пользователя
    • Создание аккаунта
    • Расширить сеанс
    • Переместить папку
  • Приемник модели
    • После создания папки
    • Когда информация пользователя обновляется
    • После удаления закладки
    • Прежде чем будет создана ассоциация ролей

Лучшим ресурсом для изучения архитектуры Liferay является исходный код. Все исходные файлы находятся на GitHub и просматривают их JavaDocs. Вы можете увидеть все основные модели портала на JavaDocs и все действия Struts на GitHub.


пример

В этом уроке мы собираемся разработать Model Listener, который отправляет электронное письмо пользователю после создания учетной записи. Для этого мы собираемся написать класс UserModelListener, который расширит базу BaseModelListener Liferay. Мы кратко перейдем к созданию крючка и рассмотрим необходимые изменения в следующих конфигурационных файлах

  • portal.properties

  • Liferay-hook.xml

Начиная

Чтобы начать разработку своего крючка для прослушивания модели, вы должны сначала запустить приложение Liferay IDE или Liferay Developer Studio.

И Liferay IDE, и Liferay Developer Studio - это настраиваемые среды разработки Eclipse . Они поразительно похожи, и один набор направлений должен быть достаточным для обеих сред.

Внутри среды разработки выполните следующие шаги.

  1. В верхнем левом углу нажмите « Файл»
  2. Наведите указатель мыши на New
  3. Нажмите « Проект плагина Liferay»

Вы откроете это окно.

введите описание изображения здесь

Пожалуйста, введите информацию, как показано выше.

  • Название проекта: User-Model-Listener
  • Выберите Использовать местоположение по умолчанию
  • Тип сборки: Ant
  • Тип плагина: Крючок

Удостоверьтесь, что ваш проект находится внутри вашего каталога HKK Hook Plugins . Вам необходимо будет выбрать свой SDK и ваше время выполнения .

В представлении « Проводник пакетов» вы увидите следующую структуру каталогов.

введите описание изображения здесь


Развитие Слушатель

Теперь, когда вы создали свой крючок, вам нужно создать свой собственный класс UserModelListener . Этот класс расширит класс BaseModelListener Liferay.

Класс BaseModelListener Liferay является абстрактным классом, который реализует интерфейс ModelListener. Вы не хотите реализовывать интерфейс ModelListener напрямую, так как вам потребуется переопределить все его методы.

Следующие методы предоставляются вам интерфейсом ModelListener через абстрактный класс BaseModelListener .

  • onAfterAddAssociation
  • onAfterCreate
  • onAfterRemove
  • onAfterRemoveAssociation
  • onAfterUpdate
  • onBeforeAddAssociation
  • onBeforeCreate
  • onBeforeRemove
  • onBeforeRemoveAssociation
  • onBeforeUpdate

Создайте свой класс UserModelListener в следующем каталоге. Чтобы создать класс через GUI, просто выполните следующие команды:

  • Нажмите « Файл» в верхнем левом углу
  • Наведите указатель мыши на New
  • Нажмите « Класс»
docroot/
     WEB-INF/
           src/

Введите информацию, указанную ниже

введите описание изображения здесь

Внутри класса UserModelListener вставьте следующий код

package com.example.hook;

import com.liferay.mail.service.MailServiceUtil;
import com.liferay.portal.ModelListenerException;
import com.liferay.portal.kernel.mail.MailMessage;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.model.BaseModelListener;
import com.liferay.portal.model.User;


import javax.mail.internet.InternetAddress;

public class UserModelListener extends BaseModelListener<User> {
    private User user = null;

    @Override
    public void onAfterCreate(User user) throws ModelListenerException {
    this.user = user;
    
    if(isValidEmail()) {
        sendEmail("[email protected]", user.getEmailAddress(), "Welcome!", "Your account is created!");
    } 
    }

    private boolean isValidEmail() {
    return Validator.isNotNull(user.getEmailAddress()) && Validator.isAddress(user.getEmailAddress());
    }
    
    private void sendEmail(String from, String to, String subject, String body) {
    try {
        MailServiceUtil.sendEmail(new MailMessage(new InternetAddress(from), new InternetAddress(to), subject, body, false));
    } catch (Exception e) {
        System.err.print("E-Mail spawned by User Model Listener failed to " + user.getFullName() + " with message " + e.getMessage());
    }
    }
}

Конфигурация свойств

Чтобы настроить связь между нашим пользовательским прослушивателем и нашей моделью, нам нужно сделать несколько окончательных настроек. Во-первых, создайте новый файл portal.properties в следующем каталоге.

docroot/
     WEB-INF/
           src/
            + portal.properties

В файл нужно добавить только одну строку.

value.object.listener.com.liferay.portal.model.User = com.example.hook.UserModelListener

Мы можем обобщить это, сказав, что для любого приемника модели мы создаем связанные свойства, значение должно быть в форме

value.object.listener.fully.qualified.model.name = fully.qualified.listener.name

Другими словами, если бы мы написали класс CustomerDLFolderModelListener , упакованный внутри com.example.code , для модели DLFolder мы имели бы следующее свойство

value.object.listener.com.liferay.portal.model.DLFolder = com.example.code.CustomerDLFolderModelListener 

Наконец, найдите файл liferay-hook.xml. В представлении « Источник» напишите следующее.

<?xml version="1.0"?>
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.2.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_2_0.dtd">

<hook>
    <portal-properties>portal.properties</portal-properties>
</hook>

объяснение

  1. Строка 1 - необязательный пролог, который указывает версию документа и (в некоторых случаях) набор символов.
  2. Строка 2 - формальное определение DocType (DTD), которое явно определяет, какие элементы и атрибуты действительны
  3. Строки 3 и 5 состоят из родительского элемента Hook (одного из допустимых элементов, поддерживаемого этим DTD)
  4. Строка 4 отменяет и расширяет файл portal.properties в $ {liferay.home}

Чтобы узнать, какие другие элементы можно использовать в этом XML-файле, вы можете ссылаться на URL-адрес в определении DocType . Это стандарт для всех файлов XML и SGML с DTD . Другим примером XML- файла Liferay с DTD является service.xml (реализация ORM Liferay на основе Hibernate ).


Создание и развертывание

Создание и развертывание крючков - это простой процесс. Разработка Liferay Plugin поддерживает автоматизацию построения и зависимостей с помощью

  • Муравей
  • плющ
  • специалист
  • Gradle

В нашем примере мы использовали Ant для автоматизации сборки. Файл build.xml содержит команды сборки (известные как цели в Ant ). Чтобы создать свой крючок, просто выполните следующие команды.

  1. Расположите файл build.xml
  2. В вашей среде IDE перетащите файл build.xml в перспективу Ant
  3. Разверните файл и запустите всю цель

введите описание изображения здесь

В вашем представлении консоли вы увидите нечто похожее на следующее:

Buildfile: C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\build.xml
all:
clean:
   [delete] Deleting directory C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
clean-portal-dependencies:
compile:
merge:
compile-import-shared:
    [mkdir] Created dir: C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
     [copy] Copying 5 files to C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\lib
compile-java:
     [copy] Copied 3 empty directories to 3 empty directories under C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
    [javac] Compiling 1 source file to C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
merge:
war:
clean-portal-dependencies:
      [zip] Building zip: C:\liferay-plugins-sdk-6.2-ee-sp11\dist\User-Listener-Hook-hook-6.2.10.1.war
deploy:
     [copy] Copying 1 file to C:\liferay-portal-6.2-ee-sp11\deploy
BUILD SUCCESSFUL
Total time: 7 seconds

С успешным построением Hook теперь пришло время запустить ваш портал и развернуть его. Чтобы запустить сервер и разверните узел Hook, найдите перспективу сервера .

  1. Щелкните правой кнопкой мыши на своем сервере и нажмите « Добавить или удалить».
  2. Найдите « User-Listener-Hook» в разделе « Доступный выбор»
  3. После выделения нажмите кнопку « Добавить» и нажмите « ОК».
  4. Нажмите кнопку « Воспроизвести» в окне « Сервер»

введите описание изображения здесь



Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы, комментарии, проблемы и т. Д. Вся конструктивная обратная связь очень ценится!





Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow