Szukaj…


Uwagi

Działa to z Liferay Portal do wersji 6.2.

Hak JSP

Haki JSP to specjalna wtyczka dożywotnia, która pozwala modyfikować główny portlet jsp-s, powiedzmy, że chcesz zmodyfikować portlet logowania, aby pokazać Welcome in my custom login! .

Minimalna struktura wtyczki haka jest następująca:

[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 to plik, który liferay-hook.xml haka, tutaj definiujesz wewnątrz tagu haka odpowiedni parametr dla haka, dla haka 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 znajduje się w Liferay w /docroot/html/portlet/login/login.jsp , aby go /docroot/html/portlet/login/login.jsp , musimy dodać plik jsp o tej samej nazwie i ścieżce w naszym folderze custom_jsps .

Po wdrożeniu haka Liferay poszuka w liferay-hook.xml custom-jsp-dir wartości liferay-hook.xml custom-jsp-dir i zastąpi wszystkie strony JSP portalu tymi liferay-hook.xml JSP portalu. Oryginalne <orginal name>.portal.jsp jsp są zapisywane z nazwą <orginal name>.portal.jsp nazwa <orginal name>.portal.jsp która ma zostać przywrócona w przypadku <orginal name>.portal.jsp haka.

Możemy nawet wywoływać oryginalne strony JSP w nowej zmodyfikowanej stronie JSP, jeśli chcemy zachować kod umożliwiający dostosowanie go do aktualizacji lub aktualizacji podstawowej wersji platformy Liferay. Aby to zrobić, w niestandardowym pliku JSP użyj następującego wzorca:

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

gdzie { JSP file's path } w tym przypadku będzie portlet/login/login.portal.jsp . Wykonanie tego nazywa się rozszerzaniem oryginalnego pliku jsp .

Następnie możemy dodać do niego treść za pomocą:

<%
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 %>

Haki Struts Action

Tego typu haka można użyć do zastąpienia podstawowego portalu (np. c/portal/login ) i akcji portlet struts (np. /login/forgot_password ), te akcje dla Liferay Portal są określone w pliku struts-config.xml w jego WEB-INF Folder WEB-INF Aby zastąpić akcję:

  1. w pliku liferay-hook.xml wtyczki hook w docroot/WEB-INF dodaj element struts-action elemencie hook.
  2. Wewnątrz elementu struts-action dodaj struts-action-path która określa ścieżkę akcji, którą zastępujesz, i struts-action-impl która określa niestandardową struts-action-impl akcji.
 <struts-action-path>/login/login</struts-action-path>
    <struts-action-impl>
    com.myhook.action.ExampleStrutsPortletAction
    </struts-action-impl>
</struts-action> 
  1. Utwórz klasę akcji portletu Struts, która rozszerza BaseStrutsPortletAction . Przykładem tej klasy jest:
 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);
    }
}

Wywołanie zastępowanej metody, takiej jak originalStrutsPortletAction.processAction , nie jest obowiązkowe, ale jest najlepszą praktyką, aby zachować zachowanie akcji przed zmianą w odniesieniu do portalu Liferay. Tego rodzaju hooka można również użyć do dodania nowych akcji Struts, jest to to samo, co modyfikacja istniejącej akcji, w tym przypadku liferay-hook.xml to:

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

Witam użytkownika „Nazwa” z haczykami

Ten przykład pokaże, jak zrobić proste „Hello User [nazwa]” po zalogowaniu. Przykład opiera się na wykonaniu niestandardowej akcji przy użyciu haka

Z terminala wiersza poleceń przejdź do folderu hooków pakietu SDK wtyczek. Aby utworzyć projekt przechwytujący, musisz wykonać skrypt tworzenia. Oto format do wykonania podczas wykonywania skryptu:

create. [sh | bat] [nazwa projektu] „[Hook Display Name]”

W systemach Linux i Mac OS X należy wprowadzić polecenie podobne do polecenia z tego przykładu:

./create.sh Hello-user „Hello User”

W systemie Windows wpisz polecenie podobne do polecenia z tego przykładu:

create.bat Hello-user „My Hook”

Kreator nowego projektu Liferay IDE i skrypty tworzenia generują projekty przechwytujące w folderze przechwytującym wtyczki SDK. Zestaw wtyczek SDK automatycznie dołącza „-hook” do nazwy twojego projektu.

Niezależnie od tego, czy utworzyłeś swój projekt haka z Liferay IDE, czy z wiersza poleceń, kończysz z tą samą strukturą projektu (patrz wcześniej).

  • Określ zdarzenie, w którym chcesz uruchomić niestandardową akcję. Przejrzyj dokumentację portal.properties, aby znaleźć pasującą właściwość zdarzenia. Wskazówka: właściwości zdarzenia mają w nazwie nazwę .event. Właściwości sesji, uruchamiania, zamykania i portalu znajdują się w następujących sekcjach dokumentacji portalu.properties : Sesja - Zdarzenia uruchamiania - Zdarzenia zamknięcia - Zdarzenia portalu
  • W swoim projekcie hook utwórz klasę Java, która rozszerza klasę com.liferay.portal.kernel.events.Action. Zastąp metodę 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());
           }
       }

Ważne: Jeśli twoja akcja uzyskuje dostęp do obiektu HttpServletRequest, rozszerz com.liferay.portal.kernel.events.Action; w przeciwnym razie należy rozszerzyć com.liferay.portal.struts.SimpleAction.

  • Utwórz plik właściwości portal.properties w folderze docroot / WEB-INF / src projektu haka. Następnie dodaj nazwę właściwości zdarzenia portalu, która odpowiada zdarzeniu, w którym chcesz wykonać akcję. Podaj w pełni kwalifikowaną nazwę swojej klasy akcji jako wartość właściwości.

    `login.events.post=HelloUser`
    

    Na przykład, aby wykonać akcję klasy tuż przed zalogowaniem użytkownika do portalu, należy określić właściwość login.events.pre wraz z klasą akcji jako jej wartością. Może to wyglądać jak to ustawienie właściwości.

Ważne: Ponieważ właściwości portalu, takie jak login.events.pre, akceptują wiele wartości, należy dołączyć swoje wartości do istniejących wartości. Możesz wielokrotnie modyfikować właściwości z dodatkowych zaczepów.

Zmodyfikuj tylko właściwość portalu, która przyjmuje pojedynczą wartość z pojedynczej wtyczki hook. Jeśli zmienisz wartość właściwości z wielu wtyczek, Liferay nie będzie wiedział, której wartości użyć.

  • Edytuj plik docroot / WEB-INF / liferay-hook.xml i dodaj swój
    Nazwa pliku właściwości portalu haka jako wartość dla
    <portal-properties>...</portal-properties> element w twoim
    element <hook>...</hook> hooka. Na przykład, jeśli nazwa pliku właściwości haka to portal.properties , należy określić ten element:
<portal-properties>portal.properties</portal-properties>
  • Wdróż hak, przejdź do ścieżki haka i wprowadź ant clean deploy , a zobaczysz .war w folderze dist.

Teraz, jeśli zalogujesz się do końca życia, na serwerze zobaczysz komunikat „Witaj administratorze użytkownika”.

Hak nasłuchiwania modelu

tło

Haki nasłuchiwania modelu są rodzajem wtyczki Liferay, która nasłuchuje zdarzeń podejmowanych w modelu i wykonuje kod w odpowiedzi. Haki nasłuchiwania modelu są podobne do haków akcji niestandardowej rozpórki, ponieważ reagują na akcję wykonaną w portalu. Jednak podczas gdy działania Struts reagują na działanie podjęte przez użytkownika, nasłuchiwacz modeli odpowiada (przed lub po) na zdarzenie obejmujące model Liferay.


Różnice

Oto kilka przykładów Struts Actions v. Model Listeners do porównania.

  • Struts Action
    • Login użytkownika
    • Tworzenie konta
    • Przedłuż sesję
    • Przenieś folder
  • Model nasłuchiwania
    • Po utworzeniu folderu
    • Gdy informacje o użytkowniku są aktualizowane
    • Po usunięciu zakładki
    • Przed utworzeniem powiązania roli

Najlepszym źródłem do nauki architektury Liferay jest ich kod źródłowy. Wszystkie ich pliki źródłowe znajdują się na GitHub i przeglądając ich JavaDocs. Możesz zobaczyć wszystkie podstawowe modele portalu na JavaDocs i wszystkie akcje Struts na GitHub.


Przykład

W tym samouczku opracujemy Model Listener, który wysyła wiadomość e-mail do użytkownika po pierwszym utworzeniu jego konta. Aby to zrobić, napiszemy klasę o nazwie UserModelListener, która rozszerzy BaseModelListener Liferay. Omówimy krótko tworzenie haka i omówimy niezbędne modyfikacje następujących plików konfiguracyjnych

  • portal.properties

  • liferay-hook.xml

Pierwsze kroki

Aby rozpocząć tworzenie haka Model Listener, musisz najpierw uruchomić aplikację Liferay IDE lub Liferay Developer Studio.

Zarówno Liferay IDE, jak i Liferay Developer Studio to dostosowane środowiska programistyczne Eclipse . Są uderzająco podobne i jeden zestaw wskazówek powinien wystarczyć dla obu środowisk.

W środowisku programistycznym wykonaj następujące kroki.

  1. W lewym górnym rogu kliknij Plik
  2. Najedź kursorem myszy na Nowy
  3. Kliknij Liferay Plugin Project

Pojawi się to okno.

wprowadź opis zdjęcia tutaj

Wprowadź informacje jak pokazano powyżej

  • Nazwa projektu: User-Model-Listener
  • Wybierz Użyj domyślnej lokalizacji
  • Typ kompilacji: Ant
  • Rodzaj wtyczki: hak

Upewnij się, że Twój projekt znajduje się w katalogu haka Liferays Plugins SDK . Musisz odpowiednio wybrać zestaw SDK i środowisko wykonawcze .

W perspektywie Eksploratora pakietów zobaczysz następującą strukturę katalogów.

wprowadź opis zdjęcia tutaj


Rozwój słuchacza

Po utworzeniu haka musisz utworzyć niestandardową klasę UserModelListener . Ta klasa rozszerzy klasę BaseModelListener Liferay.

Liferay's BaseModelListener to klasa abstrakcyjna, która implementuje interfejs ModelListener. Nie chcesz bezpośrednio implementować interfejsu ModelListener, ponieważ będzie on wymagał zastąpienia wszystkich jego metod.

Interfejs ModelListener udostępnia następujące metody za pośrednictwem klasy abstrakcyjnej BaseModelListener .

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

Utwórz klasę UserModelListener w następującym katalogu. Aby utworzyć klasę za pomocą GUI, wystarczy wykonać następujące polecenia

  • Kliknij opcję Plik w lewym górnym rogu
  • Najedź kursorem myszy na Nowy
  • Kliknij Klasa
docroot/
     WEB-INF/
           src/

Wprowadź informacje pokazane poniżej

wprowadź opis zdjęcia tutaj

Wewnątrz klasy UserModelListener wklej następujący kod

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());
    }
    }
}

Konfiguracja właściwości

Aby skonfigurować powiązanie między naszym niestandardowym odbiornikiem a naszym modelem, musimy wprowadzić kilka ostatecznych poprawek. Najpierw utwórz nowy plik portal.properties w następującym katalogu.

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

Do pliku należy dodać tylko jedną linię.

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

Możemy to uogólnić, mówiąc, że dla każdego nasłuchiwania modelu tworzymy powiązaną wartość właściwości, która musi mieć postać

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

Innymi słowy, gdybyśmy napisali klasę CustomerDLFolderModelListener , spakowaną w com.example.code , dla modelu DLFolder mielibyśmy następującą właściwość

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

Na koniec zlokalizuj plik liferay-hook.xml. W widoku Źródło napisz następujące.

<?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>

Wyjaśnienie

  1. Pierwszy wiersz jest opcjonalnym prologiem, który określa wersję dokumentu i (w niektórych przypadkach) zestaw znaków.
  2. Wiersz 2 jest formalną definicją DocType (DTD), która wyraźnie określa, które elementy i atrybuty są prawidłowe
  3. Wiersze 3 i 5 składają się z nadrzędnego elementu zaczepu (jeden z prawidłowych elementów obsługiwanych przez to DTD)
  4. Wiersz 4 zastępuje i rozszerza plik portal.properties w $ {liferay.home}

Aby zobaczyć, jakie inne elementy mogą być użyte w tym pliku XML, możesz odwoływać się do adresu URL w definicji DocType . Jest to standard dla wszystkich plików XML i SGML z DTD . Innym przykładem pliku Liferay XML z DTD jest service.xml (implementacja Liferay ORM oparta na Hibernacji ).


Kompiluj i wdrażaj

Budowanie i rozmieszczanie haków to prosty proces. Rozwój wtyczki Liferay obsługuje automatyzację kompilacji i zależności

  • Mrówka
  • Bluszcz
  • Maven
  • Gradle

W naszym przykładzie wykorzystaliśmy Anta do automatyzacji kompilacji. Plik build.xml zawiera polecenia kompilacji (znane jako cele w Ant ). Aby zbudować hak, po prostu wykonaj następujące polecenia.

  1. Zlokalizowano plik build.xml
  2. W swoim IDE przeciągnij plik build.xml do perspektywy Ant
  3. Rozwiń plik i uruchom cały cel

wprowadź opis zdjęcia tutaj

W widoku konsoli powinieneś zobaczyć coś podobnego do następującego

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

Po pomyślnym zbudowaniu haka nadszedł czas, aby uruchomić portal i wdrożyć go. Aby uruchomić serwer i wdrożyć hak, zlokalizuj perspektywę serwera .

  1. Kliknij prawym przyciskiem myszy na serwerze i kliknij Dodaj lub usuń
  2. Znajdź User-Listener-Hook w obszarze Dostępny wybór
  3. Po podświetleniu kliknij przycisk Dodaj i kliknij przycisk OK
  4. Kliknij przycisk Odtwórz w perspektywie serwera

wprowadź opis zdjęcia tutaj



Daj mi znać, jeśli masz jakieś pytania, uwagi, wątpliwości itp. Wszelkie konstruktywne opinie są bardzo mile widziane!





Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow