Zoeken…


Opmerkingen

Dit werkt met Liferay Portal tot versie 6.2.

JSP Hook

JSP hooks zijn een speciale liferay-plug-in waarmee kernportlet jsp-s kan worden aangepast, laten we zeggen dat u de inlogportlet wilt wijzigen om Welcome in my custom login! .

De minimale structuur voor een Hook Plugin is als volgt:

[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 is het bestand dat het type hook onderscheidt dat u gebruikt, hier definieert u in de hook tag de juiste parameter voor de hook, voor JSP hook:

<?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 is te vinden in Liferay in /docroot/html/portlet/login/login.jsp , om er een haakje van te maken moeten we een jsp toevoegen met dezelfde naam en hetzelfde pad in onze map custom_jsps .

Wanneer de hook is geïmplementeerd, zoekt Liferay in liferay-hook.xml naar de waarde custom-jsp-dir en worden alle portal-JSP's vervangen door de JSP's in deze directory. De originele jsp's worden opgeslagen met de naam <orginal name>.portal.jsp om te worden hersteld in geval van niet- <orginal name>.portal.jsp van de hook.

We kunnen zelfs de originele JSP's in de nieuwe aangepaste JSP aanroepen als we de code willen behouden, zodat deze kan worden aangepast aan updates of upgrades van de onderliggende Liferay-platformversie. Gebruik hiervoor in uw aangepaste JSP het volgende patroon:

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

waarbij { JSP file's path } in dit geval portlet/login/login.portal.jsp . Dit wordt het uitbreiden van de oorspronkelijke jsp genoemd .

Dan kunnen we er inhoud aan toevoegen met:

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

Stutten Actie Haken

Dit type Hook kan worden gebruikt om de kernportal (bijv. c/portal/login ) en portlet struts-acties (bijv. /login/forgot_password ) te /login/forgot_password , deze acties voor Liferay Portal worden gespecificeerd in een struts-config.xml bestand in de WEB-INF map. Een actie overschrijven:

  1. liferay-hook.xml in liferay-hook.xml bestand van uw hook plugin onder docroot/WEB-INF een struts-action element toe binnen het hook element.
  2. Voeg binnen struts-action element struts-action-path dat het struts-action-impl dat je overschrijft en struts-action-impl dat je aangepaste struts-action-impl aangeeft. Dit ziet eruit als:
 <struts-action-path>/login/login</struts-action-path>
    <struts-action-impl>
    com.myhook.action.ExampleStrutsPortletAction
    </struts-action-impl>
</struts-action> 
  1. Maak een Struts-portletactieklasse die BaseStrutsPortletAction . Een voorbeeld van deze klasse is:
 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);
    }
}

De methode die wordt genegeerd noemen, zoals originalStrutsPortletAction.processAction , is niet verplicht, maar een best practice om het gedrag van de actie ongewijzigd te houden met betrekking tot Liferay Portal. Dit type haak kan ook worden gebruikt om nieuwe Struts-acties toe te voegen, het is hetzelfde als het wijzigen van een bestaande actie, in dit geval zou liferay-hook.xml zijn:

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

Hallo gebruiker "Naam" met haken

In dit voorbeeld wordt getoond hoe u na het inloggen een eenvoudige "Hallo gebruiker [naam]" kunt maken. Het voorbeeld is gebaseerd op het uitvoeren van een aangepaste actie met behulp van een haak

Navigeer vanaf uw opdrachtregelterminal naar de map hooks van uw Plug-ins SDK. Om een hook-project te maken, moet u het create-script uitvoeren. Hier is het formaat dat moet worden gevolgd bij het uitvoeren van het script:

create. [sh | bat] [projectnaam] "[Hook Display Name]"

Op Linux en Mac OS X voert u een opdracht in die lijkt op die in dit voorbeeld:

./create.sh Hallo-gebruiker "Hallo-gebruiker"

In Windows voert u een opdracht in die lijkt op die in dit voorbeeld:

create.bat Hallo-gebruiker "Mijn haak"

Liferay IDE's New Project-wizard en de create-scripts genereren hook-projecten in de map hooks van uw Plugin SDK. De plug-ins SDK voegt automatisch "-hook" toe aan uw projectnaam.

Of u nu uw hook-project hebt gemaakt vanuit de Liferay IDE of vanaf de opdrachtregel, u krijgt dezelfde projectstructuur (zie eerder).

  • Bepaal de gebeurtenis waarop u uw aangepaste actie wilt activeren. Kijk in de documentatie van portal.properties om de overeenkomende eigenschap van de gebeurtenis te vinden. Hint: de evenementeigenschappen hebben .event in hun naam. Er zijn sessie-, opstart-, afsluit- en portalgebeurteniseigenschappen in de volgende secties van de portal.properties- documentatie: Session - Startup Events - Shutdown Events - Portal Events
  • Maak in uw hook-project een Java-klasse die de com.liferay.portal.kernel.events.Action-klasse uitbreidt. De methode Action.run (HttpServletRequest, HttpServletResponse) overschrijven .
       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());
           }
       }

Belangrijk: als uw actie toegang heeft tot het HttpServletRequest-object, breidt u com.liferay.portal.kernel.events.Action uit; breid anders com.liferay.portal.struts uit. SimpleAction.

  • Maak een eigenschappenbestand, portal.properties , in de map docroot / WEB-INF / src van uw haakproject. Voeg vervolgens de naam toe van de eigenschap portal-gebeurtenis die overeenkomt met de gebeurtenis waarop u uw actie wilt uitvoeren. Geef de volledig gekwalificeerde naam van uw actieklasse op als de waarde van de eigenschap.

    `login.events.post=HelloUser`
    

    Als u bijvoorbeeld een actie van een klasse wilt uitvoeren vlak voordat de portal zich aanmeldt bij een gebruiker, geeft u de eigenschap login.events.pre op met uw actieklasse als waarde. Het kan eruit zien als deze eigenschapsinstelling.

Belangrijk: aangezien portal-eigenschappen zoals login.events.pre meerdere waarden accepteren, moet u uw waarden toevoegen aan de bestaande waarden. U kunt de eigenschappen van extra haken herhaaldelijk wijzigen.

Wijzig alleen een portaleigenschap die een enkele waarde van een enkele hook-plug-in accepteert. Als u de waarde van een eigenschap uit meerdere plug-ins wijzigt, weet Liferay niet welke waarde moet worden gebruikt.

  • Bewerk uw docroot / WEB-INF / liferay-hook.xml- bestand en voeg uw toe
    haakse portal eigenschappen bestandsnaam als de waarde voor de
    <portal-properties>...</portal-properties> -element in uw
    het element <hook>...</hook> . Als bijvoorbeeld de bestandsnaam van uw haak portal.properties is , geeft u dit element op:
<portal-properties>portal.properties</portal-properties>
  • Implementeer je hook, ga naar je hook path en voer ant clean deploy Je ziet de .war in de dist map.

Als u zich nu aanmeldt bij liferay, ziet u in de serverlog een bericht zoals "Hallo gebruiker Admin".

Model luisteraar haak

Achtergrond

Model Listener hook's zijn een type Liferay-plug-in die luistert naar gebeurtenissen die op een model zijn genomen en in reactie daarop code uitvoert. Model Listener hooks zijn vergelijkbaar met Custom Struts Action hooks in die zin dat ze reageren op een actie die wordt ondernomen in de portal. Hoewel Struts-acties reageren op een actie die door een gebruiker wordt ondernomen, reageert een Model-luisteraar (voor of na) een gebeurtenis met een Liferay-model.


verschillen

Hier zijn een paar voorbeelden van Struts Actions v. Model-luisteraars ter vergelijking.

  • Stutten Actie
    • Gebruiker login
    • Account aanmaken
    • Sessie uitbreiden
    • Map verplaatsen
  • Model luisteraar
    • Nadat de map is gemaakt
    • Wanneer gebruikersinformatie wordt bijgewerkt
    • Nadat de bladwijzer is verwijderd
    • Voordat een rolkoppeling wordt gemaakt

De beste bron voor het leren van de architectuur van Liferay is via hun broncode. Al hun bronbestanden bevinden zich op GitHub en door hun JavaDocs te bekijken. U kunt alle kernportalmodellen op de JavaDocs en alle Struts-acties op de GitHub zien.


Voorbeeld

In deze zelfstudie gaan we een model-luisteraar ontwikkelen die een e-mail naar een gebruiker verzendt nadat hun account voor het eerst is gemaakt. Om dit te doen gaan we een klasse schrijven met de naam UserModelListener die de BaseModelListener van Liferay zal uitbreiden. We gaan kort in op haakcreatie en behandelen de nodige wijzigingen in de volgende configuratiebestanden

  • portal.properties

  • liferay-hook.xml

Ermee beginnen

Om uw Model Listener-haak te ontwikkelen, moet u eerst uw Liferay IDE of Liferay Developer Studio-applicatie starten.

Zowel de Liferay IDE als de Liferay Developer Studio zijn aangepaste Eclipse- ontwikkelomgevingen. Ze lijken opvallend veel op elkaar en één reeks aanwijzingen zou voldoende moeten zijn voor beide omgevingen.

Voer in uw ontwikkelomgeving de volgende stappen uit.

  1. Klik in de linkerbovenhoek op Bestand
  2. Beweeg uw muis over Nieuw
  3. Klik op Liferay Plugin Project

Je zal dit venster spawnen.

voer hier de afbeeldingsbeschrijving in

Voer de informatie in zoals hierboven weergegeven

  • Projectnaam: Gebruiker-model-luisteraar
  • Selecteer Standaardlocatie gebruiken
  • Bouwtype: Ant
  • Type plug-in: haak

Zorg ervoor dat uw project zich in uw SDK Hook-directory van Liferays Plugins bevindt . U moet uw SDK en uw Runtime dienovereenkomstig selecteren.

In uw perspectief van Pakketverkenner ziet u de volgende mapstructuur.

voer hier de afbeeldingsbeschrijving in


Ontwikkeling van luisteraars

Nu je je hook hebt gemaakt, moet je je aangepaste klasse UserModelListener maken . Deze klasse zal de klasse BaseModelListener van Liferay uitbreiden.

De klasse BaseModelListener van Liferay is een abstracte klasse die de ModelListener-interface implementeert. U wilt de ModelListener-interface niet rechtstreeks implementeren, omdat u alle methoden moet overschrijven.

De volgende methoden worden u aangeboden door de ModelListener- interface via de abstracte klasse BaseModelListener .

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

Maak uw klasse UserModelListener in de volgende map. Voer de volgende opdrachten uit om de klasse via de GUI te maken

  • Klik op Bestand in de linkerbovenhoek
  • Beweeg uw muis over Nieuw
  • Klik op Klasse
docroot/
     WEB-INF/
           src/

Voer de onderstaande informatie in

voer hier de afbeeldingsbeschrijving in

Plak de volgende code in uw klasse 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());
    }
    }
}

Eigenschappen configuratie

Om de associatie tussen onze aangepaste luisteraar en ons model te configureren, moeten we een paar laatste aanpassingen maken. Maak eerst een nieuw portal.properties-bestand in de volgende map.

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

Er hoeft slechts één regel aan het bestand te worden toegevoegd.

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

We kunnen dit generaliseren door te zeggen dat voor elke Model Listener die we maken de bijbehorende eigenschappenwaarde de vorm van moet hebben

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

Met andere woorden, als we een klasse CustomerDLFolderModelListener schreven, verpakt in com.example.code , voor het DLFolder- model, zouden we de volgende eigenschap hebben

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

Zoek ten slotte uw liferay-hook.xml-bestand. In Bronweergave, schrijf het volgende.

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

Uitleg

  1. Regel één is een optionele proloog die de documentversie en (in sommige gevallen) de tekenset specificeert.
  2. Regel 2 is een formele DocType Definition (DTD) die expliciet definieert welke elementen en attributen geldig zijn
  3. Regel 3 en 5 bestaan uit het bovenliggende Hook-element (een van de geldige elementen die door deze DTD worden ondersteund)
  4. Regel 4 overschrijft en breidt het portal.properties- bestand uit in $ {liferay.home}

Om te zien welke andere elementen in dit XML-bestand kunnen worden gebruikt, kunt u naar de URL in de DocType-definitie verwijzen. Dit is standaard voor alle XML- en SGML- bestanden met een DTD . Een ander voorbeeld van een Liferay XML- bestand met een DTD is service.xml (Liferay's ORM- implementatie op basis van Hibernate ).


Bouwen en implementeren

Haken bouwen en inzetten is een eenvoudig proces. Liferay Plugin ontwikkeling ondersteunt build en afhankelijkheid automatisering met

  • Mier
  • Klimop
  • Maven
  • Gradle

In ons voorbeeld hebben we Ant gebruikt voor build-automatisering. De build.xml bestand bevat de build commando's (bekend als doelwit bij Ant). Om uw haak te bouwen, voert u eenvoudig de volgende opdrachten uit.

  1. Heeft uw build.xml- bestand gevonden
  2. Sleep het bestand build.xml in uw IDE naar het Ant- perspectief
  3. Vouw het bestand uit en voer het hele doel uit

voer hier de afbeeldingsbeschrijving in

In uw consoleweergave zou u iets moeten zien dat lijkt op het volgende

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

Nu uw Hook met succes is gebouwd, is het nu tijd om uw portal te starten en te implementeren. Om uw server te starten en implementeren van de Haak zoek de Server perspectief.

  1. Klik met de rechtermuisknop op uw server en klik op Toevoegen of Verwijderen
  2. Zoek User-Listener-Hook onder de Beschikbare selectie
  3. Eenmaal gemarkeerd, klik op de knop Toevoegen en klik op OK
  4. Klik op de knop Afspelen in het Server perspectief

voer hier de afbeeldingsbeschrijving in



Laat het me weten als u vragen, opmerkingen, opmerkingen, etc. heeft. Alle constructieve feedback wordt zeer op prijs gesteld!





Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow