liferay
Communicatie tussen portlets
Zoeken…
Invoering
Opmerkingen
Referenties:
De parameter Public render gebruiken
Deze benadering werd geïntroduceerd in JSR 286.
In JSR 168 waren renderparameters die zijn ingesteld in processAction van een portlet alleen beschikbaar in die portlet. Met de functie Public Render Parameters zijn de renderparameters die zijn ingesteld in de processAction van één portlet ook beschikbaar voor het renderen van andere portlets. dit voor alle portlets die dit ondersteunen:
Voeg de tag <supported-public-render-parameter> , net voordat de tag portlet eindigt in portlet.xml
<security-role-ref>
<role-name>user</role-name>
</security-role-ref>
<supported-public-render-parameter>{param-name}</supported-public-render-parameter>
</portlet>
Voeg de tag <public-render-parameter> net voordat de tag <portlet-app> eindigt
<public-render-parameter>
<identifier>{param-name}</identifier>
<qname xmlns:x="localhost">x:{param-name}</qname>
</public-render-parameter>
</portlet-app>
In de processAction methode moet de parameterwaarde worden ingesteld in het antwoord
res.setRenderParameter({param-name},{param-value});
Nu zijn we klaar met het configureren van dit voor alle vereiste portlet, na het uitvoeren van de actiefase van de betreffende portlet, moet de param beschikbaar zijn in de renderfase voor alle ondersteunende portlets op de pagina, ongeacht of deze deel uitmaken van dezelfde of een andere toepassing (oorlog ).
Portletsessie gebruiken
Dit is een benadering die er al is sinds JSR 168. Hiermee kunnen we attributen delen met behulp van een portletsessie. Een portletsessie kan verschillende soorten scopes hebben:
- Portletbereik (kenmerken alleen beschikbaar binnen portlet)
- Toepassingsbereik (attributen beschikbaar binnen hele applicatie [oorlog])
Om deze aanpak te gebruiken, hoeven we geen gegevens in portletconfiguratie in te voeren, omdat portletsessie direct beschikbaar is in portletaanvraag:
PortletSession session = renderRequest.getPortletSession();
session.setAttribute("attribute-name","attribute-value", PortletSession.APPLICATION_SCOPE);
of
PortletSession session = renderRequest.getPortletSession();
session.setAttribute("attribute-name","attribute-value", PortletSession.PORTLET_SCOPE);
Het attribuut kan alleen worden opgehaald uit het respectieve bereik. Net zoals voor het kenmerk dat is ingesteld in het portletbereik, moeten we het ophalen met
PortletSession session = renderRequest.getPortletSession();
String attributeValue = (String) session.getAttribute("attribute-name", PortletSession.PORTLET_SCOPE);
De belangrijkste beperking van deze benadering is het gebrek aan delen met andere portlets, buiten het toepassingsgebied. Om dit te verhelpen, is er een liferay-specifieke benadering om <private-session-attributes > toe te liferay-portlet.xml aan liferay-portlet.xml
<private-session-attributes>false</private-session-attributes>
<header-portlet-css>/css/main.css</header-portlet-css>
<footer-portlet-javascript>/js/main.js</footer-portlet-javascript>
<css-class-wrapper>{portlet-name}</css-class-wrapper>
</portlet>
voor alle portlets, waar de attributen worden ingesteld en opgehaald.
Eventing-functie gebruiken
Het eventing-mechanisme is een uitgebreide versie van de openbare weergaveparameter, met een extra functie om aangepaste objecten door te geven aan andere portlets, maar met een overhead van de gebeurtenisfase.
Om dit te bereiken bestaat dit mechanisme uit
- Portlet voor uitgevers
- Portlet voor processor (consument), waarbij beide deel kunnen uitmaken van verschillende portlettoepassingen.
Om te beginnen met,
Voeg de tag <supported-publishing-event> aan de portlet van de uitgever in portlet.xml
<security-role-ref>
<role-name>user</role-name>
</security-role-ref>
<supported-publishing-event>
<qname xmlns:x="http:sun.com/events">x:Employee</qname>
</supported-publishing-event>
</portlet>
Voeg de tag <supported-processing-event> aan de processorportlet in portlet.xml
<security-role-ref>
<role-name>user</role-name>
</security-role-ref>
<supported-processing-event>
<qname xmlns:x="http:sun.com/events">x:Employee</qname>
</supported-processing-event>
</portlet>
Voeg de tag <event-definition> aan beide portlets, definieer de gebeurtenisnaam en typ portlet.xml
<event-definition>
<qname xmlns:x="http:sun.com/events">x:Employee</qname>
<value-type>com.sun.portal.portlet.users.Employee</value-type>
</event-definition>
</portlet-app>
Vervolgens moeten we klasse maken voor het gebeurtenistype (in het geval van een aangepast type)
public class Employee implements Serializable {
public Employee() {
}
private String name;
private int userId;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getUserId() {
return userId;
}
public void setUserId(int id)
{
this.userId = id;
}
}
Nu moet het evenement in de uitgeverportlet in de actiefase worden gepubliceerd
QName qname = new QName("http:sun.com/events" , "Employee");
Employee emp = new Employee();
emp.setName("Rahul");
emp.setUserId(4567);
res.setEvent(qname, emp);
Nadat we het evenement hebben gepubliceerd, moet het door de portlet van de uitgever in de evenementfase worden verwerkt.
De gebeurtenisfase werd geïntroduceerd in JSR 286 en wordt uitgevoerd vóór de renderfase van de portlet, indien van toepassing
@ProcessEvent(qname = "{http:sun.com/events}Employee")
public void processEvent(EventRequest request, EventResponse response) {
Event event = request.getEvent();
if(event.getName().equals("Employee")){
Employee payload = (Employee)event.getValue();
response.setRenderParameter("EmpName",
payload.getName());
}
}
die vervolgens via renderverzoek uit de renderparameter kan worden opgehaald.