liferay
Haken in Liferay
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:
-
liferay-hook.xmlinliferay-hook.xmlbestand van uw hook plugin onderdocroot/WEB-INFeenstruts-actionelement toe binnen het hook element. - Voeg binnen
struts-actionelementstruts-action-pathdat hetstruts-action-impldat je overschrijft enstruts-action-impldat je aangepastestruts-action-implaangeeft. Dit ziet eruit als:
<struts-action-path>/login/login</struts-action-path>
<struts-action-impl>
com.myhook.action.ExampleStrutsPortletAction
</struts-action-impl>
</struts-action>
- 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 deployJe 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.
- Klik in de linkerbovenhoek op Bestand
- Beweeg uw muis over Nieuw
- Klik op Liferay Plugin Project
Je zal dit venster spawnen.
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.
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
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
- Regel één is een optionele proloog die de documentversie en (in sommige gevallen) de tekenset specificeert.
- Regel 2 is een formele DocType Definition (DTD) die expliciet definieert welke elementen en attributen geldig zijn
- Regel 3 en 5 bestaan uit het bovenliggende Hook-element (een van de geldige elementen die door deze DTD worden ondersteund)
- 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.
- Heeft uw build.xml- bestand gevonden
- Sleep het bestand build.xml in uw IDE naar het Ant- perspectief
- Vouw het bestand uit en voer het hele doel uit
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.
- Klik met de rechtermuisknop op uw server en klik op Toevoegen of Verwijderen
- Zoek User-Listener-Hook onder de Beschikbare selectie
- Eenmaal gemarkeerd, klik op de knop Toevoegen en klik op OK
- Klik op de knop Afspelen in het Server perspectief
Laat het me weten als u vragen, opmerkingen, opmerkingen, etc. heeft. Alle constructieve feedback wordt zeer op prijs gesteld!




