Suche…


Einführung

Dieses Handbuch enthält die verschiedenen Möglichkeiten, mit denen Portlets koordinieren oder miteinander kommunizieren können, sowie die verschiedenen Szenarien, für die ein bestimmter Ansatz verwendet wird.

Bemerkungen

Verweise:

  1. Öffentliches Renderparameter
  2. JSR 286
  3. Portlet-Sitzung

Public-Render-Parameter verwenden

Dieser Ansatz wurde in JSR 286 eingeführt.

In JSR 168 waren die in processAction eines Portlets festgelegten Render-Parameter nur in diesem Portlet verfügbar. Mit der Funktion Public Render Parameters stehen die in der processAction eines Portlets festgelegten Render-Parameter auch für das Rendern anderer Portlets zur Verfügung Dies gilt für alle Portlets, die dies unterstützen:

Fügen Sie <supported-public-render-parameter> Tag <supported-public-render-parameter> , kurz bevor das Portlet-Tag in portlet.xml endet

<security-role-ref>
    <role-name>user</role-name>
</security-role-ref>
<supported-public-render-parameter>{param-name}</supported-public-render-parameter>
</portlet>

Fügen Sie das Tag <public-render-parameter> unmittelbar vor dem Ende des Tags <portlet-app>

  <public-render-parameter>
    <identifier>{param-name}</identifier>
    <qname xmlns:x="localhost">x:{param-name}</qname>
  </public-render-parameter>
</portlet-app>

In der processAction Methode muss der Parameterwert in der Antwort festgelegt werden

res.setRenderParameter({param-name},{param-value});

Nachdem wir die Konfiguration für alle erforderlichen Portlets konfiguriert haben, ist der Parameter nach Ausführung der Aktionsphase des betreffenden Portlets in der Renderphase für alle unterstützenden Portlets auf der Seite verfügbar, unabhängig davon, ob sie Teil derselben oder einer anderen Anwendung sind (war ).

Portlet-Sitzung verwenden

Dies ist ein Ansatz, den es seit JSR 168 gibt. Es ermöglicht uns, Attribute mithilfe der Portlet-Sitzung gemeinsam zu nutzen. Eine Portlet-Sitzung kann verschiedene Arten von Bereichen haben:

  1. Portletbereich (Attribute nur innerhalb des Portlets verfügbar)
  2. Anwendungsumfang (Attribute in der gesamten Anwendung verfügbar)

Um diesen Ansatz verwenden zu können, müssen wir keine Einträge in der Portlet-Konfiguration vornehmen, da die Portlet-Sitzung in der Portlet-Anforderung sofort verfügbar ist:

PortletSession session = renderRequest.getPortletSession();
session.setAttribute("attribute-name","attribute-value", PortletSession.APPLICATION_SCOPE);

oder

PortletSession session = renderRequest.getPortletSession();
session.setAttribute("attribute-name","attribute-value", PortletSession.PORTLET_SCOPE);

Das Attribut kann nur aus dem jeweiligen Gültigkeitsbereich abgerufen werden. Wie für das im Portlet-Gültigkeitsbereich festgelegte Attribut müssen wir es mit abrufen

PortletSession session = renderRequest.getPortletSession();
String attributeValue = (String) session.getAttribute("attribute-name", PortletSession.PORTLET_SCOPE);

Die größte Einschränkung dieses Ansatzes ist das Fehlen einer gemeinsamen Nutzung zwischen anderen Portlets außerhalb des Anwendungsbereichs. Um dies zu umgehen, gibt es einen liferay-spezifischen Ansatz, um <private-session-attributes > zu 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 alle Portlets, bei denen die Attribute festgelegt und abgerufen werden.

Eventing-Funktion verwenden

Der Eventing-Mechanismus ist eine erweiterte Version des öffentlichen Render-Parameters mit zusätzlichen Funktionen, um benutzerdefinierte Objekte an andere Portlets zu übergeben, jedoch mit einem Overhead der Ereignisphase.

Um dies zu erreichen, besteht dieser Mechanismus aus

  1. Publisher-Portlet
  2. Prozessor- (Verbraucher-) Portlet, wobei beide Teil verschiedener Portlet-Anwendungen sein können.

Beginnen mit,

Fügen Sie dem Publisher-Portlet in der portlet.xml Tag " <supported-publishing-event> 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>

Fügen Sie dem Prozessor-Portlet in portlet.xml Tag " <supported-processing-event> 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>

Fügen Sie den beiden Portlets das Tag <event-definition> Definieren Sie portlet.xml und geben Sie 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>

Als Nächstes müssen wir eine Klasse für den Ereignistyp erstellen (im Fall eines benutzerdefinierten Typs).

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

}

Jetzt muss das Ereignis im Publisher-Portlet in der Aktionsphase veröffentlicht werden

    QName qname = new QName("http:sun.com/events" , "Employee");
    Employee emp = new Employee();
    emp.setName("Rahul");
    emp.setUserId(4567);
    res.setEvent(qname, emp);

Nachdem wir das Ereignis veröffentlicht haben, muss es in der Ereignisphase vom Herausgeberportlet verarbeitet werden.

Die Ereignisphase wurde in JSR 286 eingeführt und wird gegebenenfalls vor der Renderphase des Portlets ausgeführt

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

}

Diese können dann über die Render-Anforderung aus dem Render-Parameter abgerufen werden.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow