liferay
Inter portletkommunikation
Sök…
Introduktion
Anmärkningar
Med hjälp av Public render-parameter
Detta tillvägagångssätt infördes i JSR 286.
I JSR 168 var renderparametrar som är inställda i processAction av en portlet endast tillgängliga i den portleten. Med funktionen Public Render Parameters, kommer renderparametrarna som är inställda i processAction av en portlet att finnas tillgängliga i render av andra portlets också. För att konfigurera detta för alla portlets som stöder detta:
Lägg till <supported-public-render-parameter> -taggen, precis innan portlettaggen slutar i portlet.xml
<security-role-ref>
<role-name>user</role-name>
</security-role-ref>
<supported-public-render-parameter>{param-name}</supported-public-render-parameter>
</portlet>
Lägg till <public-render-parameter> -taggen precis innan <portlet-app> -taggen slutar
<public-render-parameter>
<identifier>{param-name}</identifier>
<qname xmlns:x="localhost">x:{param-name}</qname>
</public-render-parameter>
</portlet-app>
I processAction metoden måste parametervärdet ställas in i svaret
res.setRenderParameter({param-name},{param-value});
Inlägg vi är klara med att konfigurera detta för alla erforderliga portleter, efter att ha genomfört åtgärdsfasen för den berörda portleten, bör parametern vara tillgänglig i renderingsfas för alla stödda portlets på sidan, oavsett att vara en del av samma eller annan applikation (krig ).
Använd Portlet-session
Detta är en metod som har funnits sedan JSR 168.Det tillåter oss att dela attribut med portletsession.A portlet session kan ha olika typer av scopes:
- Portlet-omfattning (attribut bara tillgängliga inom portlet)
- Ansökningsomfång (attribut tillgängliga inom hela applikationen [krig])
För att använda detta tillvägagångssätt behöver vi inte göra några poster i portletkonfiguration, eftersom portletsession är lätt tillgänglig i portletbegäran:
PortletSession session = renderRequest.getPortletSession();
session.setAttribute("attribute-name","attribute-value", PortletSession.APPLICATION_SCOPE);
eller
PortletSession session = renderRequest.getPortletSession();
session.setAttribute("attribute-name","attribute-value", PortletSession.PORTLET_SCOPE);
Attributet kan bara hämtas från respektive tillämpningsområde. Liksom attribut som är uppsatt i portletomfång, måste vi hämta det med
PortletSession session = renderRequest.getPortletSession();
String attributeValue = (String) session.getAttribute("attribute-name", PortletSession.PORTLET_SCOPE);
Den huvudsakliga begränsningen av detta tillvägagångssätt är bristen på delning mellan andra portleter utanför tillämpningsområdet. För att övervinna detta finns det en livsspecifik metod att lägga till <private-session-attributes > till 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>
för alla portlets, där attributen ställs in och hämtas.
Med hjälp av händelsefunktion
Händelsemekanismen är en utökad version av public render-parametern, med tilläggsfunktion för att skicka anpassade objekt till andra portlets, men med en overhead av händelsefasen.
För att uppnå detta består denna mekanism av
- Utgivarportlet
- Processor (konsument) portlet, där båda kan ingå i olika portletapplikationer.
Till att börja med,
Lägg till <supported-publishing-event> -tagg till utgivarens portlet i 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>
Lägg till <supported-processing-event> -tagg till processorportletten i 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>
Lägg till <event-definition> -tagg till både portlets, definiera händelsens namn och typ i 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>
Nästa måste vi skapa klass för händelsetypen (i fall av anpassad typ)
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 i utgivarens portlet måste händelsen publiceras i åtgärdsfasen
QName qname = new QName("http:sun.com/events" , "Employee");
Employee emp = new Employee();
emp.setName("Rahul");
emp.setUserId(4567);
res.setEvent(qname, emp);
Inlägg vi har publicerat händelsen, det måste behandlas av utgivarens portlet i händelsefasen.
Händelsefasen introducerades i JSR 286 och körs före återgivningsfasen för portleten, när det är tillämpligt
@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());
}
}
vilket sedan kan hämtas från renderparametern via render-begäran.