Intercomunicación entre portlets.

1
23239

Intercomunicación entre portlets.

1. Introducción

La intercomunicación entre portlets es una funcionalidad que permite compartir o enviar información entre varios portlets desplegados en cualquier lugar del portal. Antiguamente con la versión 1 de la especificación JSR-168 la comunicación únicamente se realizaba a través de la Session del Portlet o utilizando la implementación que ofrecía el Gestor de Portales que se estuviera manejando. El uso de la solución propietaria impedía que dicho portlet pudiera ser exportado al resto de gestores de portales del mercado. Con la aparición de la versión 2 de la especificación JSR 286 se resolvió este problema. En esta versión se han definido dos nuevos métodos para intercambiar información entre los portlets desplegados en un portal: por eventos o por parámetros públicos de renderización.
Con este tutorial se mostrará el uso de las tres formas a través de un pequeño ejemplo. Se utilizará Liferay como gestor de portales y se tomará como punto de partida el tutorial «Utilización de arquetipos y plugins de LifeRay para Maven.» donde se explican los pasos para crear un portlet en LifeRay.

Este tutorial está relacionado con una charla de autentia que encontrarás aquí

2. Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Mac Book Pro (Core 2 Duo 2,8 Ghz, 4 GB RAM, 500 GB)
  • Sistema Operativo: Snow Leopard
  • Navegador: Mozilla Firefox 3.6.3
  • Maven: 2.2.1
  • Liferay:5.2.3 + SDK.

3. Ejemplo práctico:

Para ver el funcionamiento de cada método de comunicación se realizará un ejemplo muy sencillo. Se crearán dos proyectos maven, el primero llamado «localizador-portlet» que se encargará de obtener una dirección a través de un formulario, y el segundo llamado «visualizador-portlet» mostrará un mapa con la localización de esa dirección. En cada uno de ellos se harán tres versiones del mismo portlet, implementando cada tipo de comunicación.

Lo primero de todo es crear los dos proyectos utilizando el arquetipo «liferay-portlet-archetype» tal como se indica en el tutorial al que se ha hecho referencia anteriormente.

3.1 Intercomunicación entre Portlets utilizando la sesión.

La intercomunicación utilizando la sesión fue el primer método que se utilizó para este propósito. Su uso es bastante sencillo, se recupera la sesión del portlet y se establece el atributo que se desea compartir, indicando que dicho atributo va a ser visible por el resto de la aplicación (APPLICATION_SCOPE).

Empezamos con el portlet «localizador-portlet». Su función es presentar un formulario para que el usuario introduzca una dirección. Cuando éste lo envíe, la dirección se almacenará en la sesión para que el portlet «visualizador-portlet» lo recupere y pinte el mapa con la localización.

Creamos una clase llamada LocalizadorSessionPortlet que extienda de GenericPortlet.

Creamos la jsp view.jsp que será común a todos los portlet que se vayan a crear:

Se añade la definición del portlet al descriptor portlet.xml:

A continuación se añade la configuración específica del portlet para que funcione correctamente en liferay. En el descriptor liferay-portlet.xml se definen algunos parámetros específicos para el gestor de portales. Debemos hacer hincapié en el atributo private-session-attributes que hay que deshabilitar para que la compartición de atributos a través de la sesión funcione.

Y por último se añade al fichero liferay-display.xml la asociación del portlet con la categoría a la que pertenece. En nuestro caso a la categoría «Sample».

Ahora se tiene que desarrollar el portlet «visualizador-portlet», su función es recoger la dirección que haya depositado en la sesión «localizador-portlet» y utilizando el API de Google Maps mostrar el mapa con la localización.

Creamos la clase VisualizadorSessionPorlet:

Creamos la jsp view.jsp común a todas las versiones del portlet:

Creamos el fichero javascript.js que se usa para localizar la dirección en Google Maps (idéntico en todos los ejemplos).

Y por último se añade la configuración del portlet en los xml. Remarcar las etiquetas del fichero liferay-portlet.xml footer-portal-javascript y footer-portlet-javascript pues son el método que pone a disposición liferay para añadir recursos javascript con el fin de ser usados en el portlet.

Fichero portlet.xml

Fichero liferay-portlet.xml:

Fichero liferay-display.xml:

Después se despliegan los portlets en liferay; para ello se ejecuta el comando en cada uno de los proyectos maven generados:

Finalmente se accede al portal como administrador, se añaden los portlets a una página y se realiza una prueba enviando el formulario con una dirección.

3.2 Intercomunicación entre Portlets utilizando parámetros públicos.

La intercomunicación utilizando parámetros públicos es un método disponible a partir de la versión 2 (JSR 286); para poder utilizarlo únicamente se debe registrar el parámetro en el fichero portlet.xml con el atributo «supported-public-render-parameter». En ese momento, cuando en la url de invocación se encuentre dicho parámetro, aquellos portlets que hayan indicado su uso podrán acceder a su valor de la misma forma que se hace con cualquier otro parámetro.

En este ejemplo y en el siguiente sólo se van a incluir aquellos recursos relevantes para el mismo, ya que la información de los ficheros liferay-display.xml, liferay-portlet.xml es prácticamente idéntica a excepción del nombre del portlet.

Para comenzar crea la clase LocalizadorParameterPortlet:

Se añade la definición del portlet al descriptor portlet.xml, donde se establece el parámetro público de renderización:

Ahora creamos la versión del visualizador para que soporte parámetro públicos:

Y su configuración en el fichero portelt.xml:

Si desplegáis de nuevo los portlets añadiéndolos a una página, veréis que el comportamiento funcional del portlet es idéntico que el ejemplo anterior pero en este caso utilizando parámetros públicos que son compartidos por todos aquellos portlets que lo hayan registrado en su configuración.

3.3 Intercomunicación entre Portlets utilizando eventos.

La intercomunicación usando eventos se asemeja a la gestión de eventos de SWING. Existen productores de eventos y subscriptores que serán notificados cuando se lance el mismo. Los eventos sólo podrán ser lanzados en la fase de Action de un portlet utilizando el método setEvent de la clase ActionResponse. Una vez que se haya publicado un evento, el contenedor, antes de invocar a la renderización de los portlets, notificará a todos aquellos que se hubieran subscrito al evento. La configuración de productores (supported-publishing-event) y subscriptores, como os podéis imaginar, debe encontrarse en el fichero portlet.xml. A continuación se muestra la versión del ejemplo para que funcione con eventos.

Primero se crea la clase LocalizadorEventPortlet:

Se define el portlet en el fichero portlet.xml con el evento:

Ahora se crea la versión del visualizador: la clase VisualizadorEventPortlet.

Y la correspondiente configuración en el portlet.xml:

4. Conclusión

Como se ha podido ver, el procedimiento para intercomunicar portlets con la especificación JSR 286 es muy sencillo y sistemático. Únicamente se tendrá que optar por una de las tres opciones, teniendo en cuenta siempre la más adecuada para la situación que estemos desarrollando.

1 Comentario

Dejar respuesta

Please enter your comment!
Please enter your name here