Sök…


Introduktion

Den här handboken innehåller olika sätt på vilka portlet kan samordna eller kommunicera med varandra och de olika scenarierna för vilka ett visst tillvägagångssätt används.

Anmärkningar

referenser:

  1. Public render param
  2. JSR 286 specifikationer
  3. Portlet-session

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:

  1. Portlet-omfattning (attribut bara tillgängliga inom portlet)
  2. 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

  1. Utgivarportlet
  2. 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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow