Thursday, March 26, 2015

 Liferay 6.2

Interportlet Communication(Portlet to Portlet Communication)

 

Interportlet communication is the concept of making communication between two portlets and sharing data with each other using IPC mechanism.
This concept is supported in JSR-286/Porlet 2.0 specification.

There are three ways to share data between two portlets:
1. Portlet session
2. IPC Mechanism
   i>Public Render Parameters
   ii>Event
   iii>Client-side IPC
3. Cookies


*In all three no. 2(IPC Mechanism) is the standard way of interacting/sharing data between portlets as
it is defined by JSR-286 specification.


i>PUBLIC RENDER PARAMETER.


1>Create one portlet project with any name, in my case it is InterportletCommunication
2>Inside that project create two portlets with any name of your choice, in my case portets are i>Sender ii>Receiver

3>In portlet.xml define public render parameter after portlets definition and before </portlet-app> tag.

<public-render-parameter>
    <identifier>TestParamter</identifier>
    <qname xmlns:x="http://liferay.com">x:TestParamter</qname>
</public-render-parameter>

*Here in public render parameter definition we are defining one identifier, by using this identifier portlets are sharing data.
In our case identifier is  "TestParamter"

4> In portlet.xml define which will support this public render parameter before </portlet> tag of both portlets sender and receiver using

<supported-public-render-parameter>
    TestParamter
</supported-public-render-parameter>



For our reference below is complete portlet.xml.
-----------------------------------------------
<?xml version="1.0"?>

<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" version="2.0">
   
    <portlet>
        <portlet-name>sender</portlet-name>
        <display-name>Sender</display-name>
        <portlet-class>com.test.Sender</portlet-class>
        <init-param>
            <name>view-template</name>
            <value>/html/sender/view.jsp</value>
        </init-param>
        <expiration-cache>0</expiration-cache>
        <supports>
            <mime-type>text/html</mime-type>
            <portlet-mode>view</portlet-mode>
        </supports>
        <portlet-info>
            <title>Sender</title>
            <short-title>Sender</short-title>
            <keywords></keywords>
        </portlet-info>
        <security-role-ref>
            <role-name>administrator</role-name>
        </security-role-ref>
        <security-role-ref>
            <role-name>guest</role-name>
        </security-role-ref>
        <security-role-ref>
            <role-name>power-user</role-name>
        </security-role-ref>
        <security-role-ref>
            <role-name>user</role-name>
        </security-role-ref>
        <supported-public-render-parameter>
          TestParamter
       </supported-public-render-parameter>
    </portlet>
    <portlet>
        <portlet-name>receiver</portlet-name>
        <display-name>Receiver</display-name>
        <portlet-class>com.test.Receiver</portlet-class>
        <init-param>
            <name>view-template</name>
            <value>/html/receiver/view.jsp</value>
        </init-param>
        <expiration-cache>0</expiration-cache>
        <supports>
            <mime-type>text/html</mime-type>
            <portlet-mode>view</portlet-mode>
        </supports>
        <portlet-info>
            <title>Receiver</title>
            <short-title>Receiver</short-title>
            <keywords></keywords>
        </portlet-info>
        <security-role-ref>
            <role-name>administrator</role-name>
        </security-role-ref>
        <security-role-ref>
            <role-name>guest</role-name>
        </security-role-ref>
        <security-role-ref>
            <role-name>power-user</role-name>
        </security-role-ref>
        <security-role-ref>
            <role-name>user</role-name>
        </security-role-ref>
        <supported-public-render-parameter>
          TestParamter
       </supported-public-render-parameter>
    </portlet>
   
<public-render-parameter>
    <identifier>TestParamter</identifier>
    <qname xmlns:x="http://liferay.com">x:TestParamter</qname>
</public-render-parameter>

</portlet-app>



5> For setting value for the render parameter, In sender portlet view.jsp use below code.

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %>
<portlet:defineObjects />

<p style="color: green; border: 1px solid green;">This is Sender portlet, this will send/share parameter value with Receiver Portlet.</p>


<portlet:actionURL var="actionURL" name="setRenderParameter"/>

<aui:form action="<%=actionURL.toString() %>" method="post">
    <aui:input name="name" value=""/>
    <aui:button type="submit" value="Set"/>
</aui:form>

6> In sender portlet java class, Sender.java paste below code.

package com.test;

import java.io.IOException;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;

import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.util.bridges.mvc.MVCPortlet;

/**
 * Portlet implementation class Sender
 */
public class Sender extends MVCPortlet {

   
    public void processAction(ActionRequest actionRequest,
            ActionResponse actionResponse) throws IOException, PortletException {
   
         String sendingParameter = ParamUtil.getString(actionRequest, "sendingParameter");
            /**
             * sendingParameter is same as like normal parameter. But it is configured
             * as public portlet.xml file
             * Any other portlet can read this parameter
             *
             * To read this parameter in your portlet you
             * should tell your portlet that you are going to
             * use public render parameter. That configuration is done again in
             * portlet.xml
             */
            actionResponse.setRenderParameter("TestParamter", sendingParameter);
    }

}

7>For reading public render parameter, In receiver portlet view.jsp paste below code.

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@page import="com.liferay.portal.kernel.util.ParamUtil"%>
<portlet:defineObjects />

<p style="color: green; border: 1px solid green;">This is Receiver Portlet, this will receive parameter value send/share by sender portlet.</p>


<%
String receivedParameter = ParamUtil.getString(request, "TestParamter");
%>

<p style="color:green;">Public parameter received is 'TestParamter'</p>
Its value is
<%=receivedParameter %>








8> i. For testing public render parameter between two portlets, portlets placed on same page.

    
   



   ii>For testing public render parameter between two portlets, portlets placed on different pages.

      *For different pages we have to use below property in portal-ext.properties with given value.
    
      portlet.public.render.parameter.distribution=layout-set
      layout.default.p_l_reset=false

Sender Screen







Receiver Screen





Location: Bengaluru, Karnataka, India

0 comments:

Post a Comment