Ladrillitos de legoLos Portales Web son sitios que actúan como un punto único de acceso para una gran cantidad de información. En Java es posible crear componentes para extender la funcionalidad de estos portales. De esto se ocupa el API de Portlets.

En este artículo veremos una introducción a los Portales Web, un Portlet 2.0 de ejemplo y la anotamoía general de un Portlet.

Introducción a los Portales Web

Un Portal Web es un sitio web que actúa como un único punto de acceso para una gran variedad de información. Podemos pensar en algo como Yahoo. En Yahoo podemos leer noticias, comprar, leer emails, chatear, jugar, etc. También tenemos acceso a otra variedad de contenido y servicios provistos por Yahoo. Yahoo es un buen ejemplo de un Portal Web.

Los Portales Web pueden no ser accesibles por cualquiera. Pueden existir dentro de los confines de una organización, accesible sólo a personas que son parte de la organización como empleados, contratistas, socios, proveedores, etc. A estos portales se los conoce como Portales de Intranet. Los portales como Yahoo, que son abiertos, se llaman Portales de Internet.

Software de Portales Web

Aunque es posible construir un portal web como si fuera cualquier otro sitio (usando tecnologías como Servlet/JSP, ASP, PHP, etc.) hoy en día existe una gran variedad de software que facilita la construcción de portales web. Por ejemplo, si estamos desarrollando en .NET podríamos considerar el uso de Microsoft Office Sharepoint Server.

La ventaja de utilizar software de portales es que nos brinda gran parte de la funcionalidad común de todo portal. Todos los software de portales tienen alguna forma de administrar a los usuarios (gestión de usuarios), login/logout (autenticación), temas visuales (personalización), creación de múltiples perfiles de usuario (personalización), búsquedas, etc. La mayoría del software de portal además brinda otra funcionalidad, como feeds RSS y aplicaciones de email y calendarios. Entonces, el software de portal reduce la cantidad de código que se necesita escribir para crear un Portal funcional. Disminuye los diclos de diseño/codificación/prueba/debug y también permite tener un portal más simple de mantener y actualizar.

La desventaja de usar software de portal es que a veces no resulta tan flexible como quisieramos. Los portales son configurables sólo hasta cierto nivel. Si necesitamos algo que no está provisto, quizás nos vaya mejor escribiendo nuestra propia solución. Los portales suelen ser grandes, llenos de características y funcionalidad. Si estamos buscando algo simple, el tamaño y la complejidad de los portales podrían ser un problema.

Portlets de Java

Aunque todos los portales tienen mucha funcionalidad lista para usar, a veces es necesario escribir nuestro propio código para "extender" el portal. Los portales Java nos permiten hacer esto escribiendo componentes estandrizados llamados Portlets. Los Porlets Java, definidos en JSR 286, nos permiten escribir código propio y agregarlo a un servidor de portal. Así como podemos escribir un Servlet y desplegarlo en un contenedor web, también podemos escribir un portlet y desplegarlo en un contenedor de portal.

Hay muchos proveedores de Portales que soportan la especificación, como ser IBM, Sun, Jboss, Liferay, Apache, Exo.

Portlet Hola Mundo de ejemplo

Como vimos, un portlet ocupa sólo una parte de una página de portal. Esta es la principal diferencia entre un portlet y un servlet. Un portlet está diseñado para ocupar sólo una parte de toda una página web. Y una página web de un portal consiste de muchos y diferentes portlets.

Escribir un Portlet de Hola Mundo es muy simple. El API de Portlet define una interfaz llamada javax.portlet.Portlet. Todos los portlets que escribamos deberán implementar esta interfaz. Una forma fácil de hacer esto es extender de la clase javax.portlet.GenericPortlet. La clase GenericPortlet implementa la interfaz Portlet. Al crear nuestros propios portlets se recomienda siempre heredar de GenericPortlet.

El código de nuestro portlet queda:

 
public class HolaMundoPortlet extends GenericPortlet{
 
  public void render(RenderRequest request, RenderResponse response)
                                 throws PortletException, IOException{
 
      response.setContentType("text/html");
      response.getWriter().write("¡Hola Mundo Portlet 2.0!");
  }
}
 

Hemos sobreescrito sólo un método de la clase GenericPortlet llamado render. Cada vez que se deba "mostrar" nuestro portlet en una página del portal se va a invocar al método render.

Como los portlets son componentes extendidos de aplicaciones web comunes, podemos empaquetarlos junto a servlets y JSP en un archivo WAR. Debemos agregar un descriptor separdo junto al archivo web.xml para describir a los portlets que creemos. Este descriptor es el descriptor de portlets y el archivo se llama portlet.xml.

El archivo portlet.xml contiene entonces a nuestro HolaMundoPortlet:

 
<portlet-app xmlns=\"http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd\"
 xsi=\"http://www.w3.org/2001/XMLSchema-instance\" 
 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\">
   <portlet>
       <portlet-name>HolaMundoPortlet</portlet-name>
           <portlet-class>com.dosideas.portal.HolaMundoPortlet</portlet-class>
           <supports>
           <mime-type>text/html</mime-type>
           <portlet-mode>view</portlet-mode>
           <portlet-mode>edit</portlet-mode>
           <portlet-mode>help</portlet-mode>
           </supports>
           <portlet-info>
               <title>Hola Mundo Portlet</title>               
           </portlet-info>
       </portlet>
</portlet-app>

¡Y eso es todo! Hemos escrito nuestra primera aplicación de portlets. Podemos generar un archivo WAR, desplegarlo en un contenedor web, y luego agregar el portlets al portal que estemos usando.

Anatomía de un portlet

Cuando desplegamos un portlet en un contenedor veremos algo así:

Anatomía de un portlet

El portal crea un marco o ventana para nuestro portlet. Este marco se llama Ventana de Portlet. Cada portlet se ubica visualmente dentro de una ventana de portlet. Además del contenido propiamente dicho (el mensaje "Hola Mundo Portlet 2.0" que se escribe con el método render), la ventana también tiene el título del portlet (que se completa en el archivo portlet.xml) y algunos controles llamados decoraciones. Estas decoraciones nos permiten controlar los diferentes aspectos de un portlet - modos y estados de la ventana.

Modos de un portlet y estados de ventana

En cualquier momento, cualquier portlet puede ser definido en términos de dos características únicas: lo que está haciendo el portlet en ese momento, y cuánto espacio ocupa en la página. El Modo del portlet define lo que está haciendo el portlet. El Estado de la ventana del portlet indica cuánto espacio ocupa en portlet en una página en particular.

Por ejemplo, podemos escribir un mensaje de ayuda para el Portlet Hola Mundo y mostrarlo cuando el usuario haga click en el botón de Ayuda (la decoración con el símbolo "?"). En este caso, el portlet pasará al modo "Ayuda" (Help). De manera similar podemos escribir distintos mensajes de "Hola Mundo" basándonos en cuánto espacio ocupa el portlet en la página. Esto es posible porque en cada caso, el portlet estará asociado a diferentes estados de ventana.

Basado en Portlet tutorial - Hello Portlet 2.0 World

Inspiración.

"Si tú tienes una manzana y yo tengo una manzana e intercambiamos las manzanas, entonces tanto tú como yo seguiremos teniendo una manzana cada uno. Pero si tú tienes una idea y yo tengo una idea, e intercambiamos las ideas, entonces ambos tendremos dos ideas"

Bernard Shaw