Introdução à Tecnologia Portlet

Por Maykon Junio Vaz (maykonjv@gmail.com)

Para entender o que é um portlet, primeiro é necessário entender o que é um portal. Entende-se que um portal é uma aplicação web que oferece personalização e agregação de conteúdos de diferentes fontes, aglomerando e distribuindo estas informações de forma direcionada a um publico alvo.

As funcionalidades básicas de um portal se dividem em 3 partes principais:

1.       Portlet Container: semelhante ao servlet container, o portlet container é responsável por controlar o ciclo de vida de um portlet fornecendo informações necessárias sobre seu ambiente, inicializando e finalizando este, assim como também controlando as requisições do usuário e coletando as respostas.

2.       Agregador de Conteúdo: Conforme definido na especificação do Portlet, uma das principais tarefas de um portal é agregar conteúdo gerado por aplicações de diversos portlet.

3.       Serviços Comuns: Um dos principais pontos fortes de um servidor de portal é o conjunto de serviços comuns que ela proporciona. Os serviços não são parte da especificação do portlet, mas implementações comerciais de portal fornecem um conjunto rico de serviços para se diferenciar dos seus concorrentes. Alguns serviços comuns que você pode encontrar na maioria das implementações são:

  • logon único: Permite ter acesso a todas as outras aplicações uma vez que você entrar no servidor do portal, ou seja, você não tem que entrar em cada aplicativo separadamente. Por exemplo, quando eu entro no meu site da intranet, eu deveria ter acesso ao meu email, e outros aplicativos de intranet, sem ter que entrar em cada um desses aplicativos separadamente.

Um servidor de portal irá fornecer-lhe um armazenamento seguro de credenciais. O que você faz é entrar no aplicativo de email e especificar o seu nome de usuário e senha uma vez. Essas informações serão armazenadas de forma criptografada no controlador de acesso do sistema. A partir da próxima vez, quando você entrar no site da intranet, o servidor de portal vai ler as suas credenciais e entrar em seu servidor de email com seu nome. O mesmo vale para outras aplicações.

  • Personalização: A aplicação permite ao usuário personalizar sua página de duas formas. Primeiro, o usuário pode decidir quais as cores que ele quer para as barras de título e ícones que ele quer para os controles. Em segundo lugar, o usuário pode decidir quais portlets que ele quer em sua página. Por exemplo, se eu sou um grande fã de esportes, provavelmente iria substituir um portlet de noticias por um portlet que me permite acompanhar o meu time favorito.

Existem também algumas implementações comerciais avançadas de serviços de personalização, que permite que você decida quais aplicações devem ser exibidas ao usuário com base em critérios tais como a sua renda ou interesses.

Elementos do Portlet

Elementos do Portlet

Portal WebSphere utilizando portlet

Portal WebSphere utilizando portlet

JSR 168 – Portlet Specification
Com o surgimento de um número crescente de portais corporativos, vários fabricantes criaram diferentes APIs para componentes do portal, chamado de portlets. Esta variedade de interfaces incompatíveis geraram problemas para os fornecedores de aplicações, para os clientes do portal, e fornecedores de servidores do portal. Para solucionar estes problemas, foi criada a JSR (Java Specification Request) 168, uma especificação de Portlets, que nasceu para oferecer interoperabilidade entre portlets e portais.

A especificação de Portlets – JSR 168 – define como componentes baseados em Java para Web, gerenciado por um container de portlets, que processa os pedidos e gera conteúdo dinâmico.

O propósito da JSR 168 era:

  • Definir o ambiente de execução, ou portlet container, para portlets
  • Definir a API entre o portlet container e portlets
  • Fornecer mecanismos para armazenar dados temporários e persistentes para portlets
  • Fornecer um mecanismo que permite incluir servlets e JSP (JavaServer Pages) nos portlets
  • Definir um pacote de portlets para permitir uma implantação fácil
  • Permitir a portabilidade entre os portlets do portal
  • Executar portlets JSR 168 como portlets remotos usando o Web Services for Remote Portlets (WSRP) protocolo

Entre empresas envolvidas na JSR 168 podemos citar: Apache, ATG, a BEA, a Boeing, a Borland, Broadvision, Citrix, EDS, Fujitsu, Hitachi, IBM, Novell, Oracle, SAP, SAS Institute, Sun Microsystems, Sybase, TIBCO e Vignette. A lista de apoiadores oficiais é ainda maior.

Outras especificações JSR:

JSR 286 – Portlet Specification 2.0

JSR 301 – Portlet 1.0 Bridge for JavaServer Faces 1.2

JSR 329 – Portlet 2.0 Bridge for JavaServer Faces 1.2 Specification

Conceitos de Implementação de Portlets

Ciclo básico dos portlets:

  • Init: inicialização do portlet
  • Handle requests: diferentes tipos de processo como action-request e render-request;
  • Destroy: finalização do portlet

Para o desenvolvimento de cada portlet deve-se implementar a interface de portlet, ou estender uma classe que implementa essa interface. A interface de portlet é composta dos seguintes métodos:

  • init (PortletConfig config) : para inicializar o portlet. Este método é chamado apenas uma vez após instancia-lo. Este método pode ser usado para criar objetos / recursos utilizados por ele.
  • ProcessAction (ActionRequest request, ActionResponse response) : para notificar o portlet que o usuário tenha desencadeado uma ação sobre este portlet. Apenas uma ação por solicitação do cliente é disparado. Em uma ação, um portlet pode emitir um redirecionamento, alterar seu modo de portlet ou estado da janela, alterar o seu estado persistente, ou os parâmetros de render.
  • render (RenderRequest request, RenderResponse response) : para gerar a marcação. Para cada portlet na página atual, o método de renderização é chamado, e o portlet pode produzir marcação que pode depender do modo de portlet ou estado da janela, os parâmetros de renderização, atributos pedido, estado persistente, os dados da sessão, ou dados de back-end.
  • destroy () : para indicar o fim do ciclo de vida do portlet. Este método permite liberar recursos e atualizar os dados persistentes que pertence a este portlet.

A API do portlet possui a classe GenericPortlet que implementa a interface Portlet. É recomendado que esta classe seja utilizada nas implementações por meio de herança, conforme o exemplo abaixo:

public class HelloWorld extends GenericPortlet{

     protected void doView(RenderRequest request,  RenderResponse response) throws PortletException, IOException {

     response.setContentType("text/html");

    response.getWriter().println("Hello Portlet");

  }

}

Dentre as principais diferenças entre as aplicações web convencionais esta a configuração do arquivo portlet.xml. Neste arquivo são inseridas algumas configurações necessárias para a execução dos portlets contidos na aplicação. Para cada portlet deve conter um conjunto de configuração especifica entre as tags <portlet>…</portlet>, conforme o exemplo abaixo:

<portlet>

<description>HelloWorldDescription </description>

<portlet-name>HelloWorld</portlet-name>

<display-name>Hello World</display-name>

<portlet-class>com.test.HelloWorld</portlet-class>

<expiration-cache>-1</expiration-cache>

<supports>

<mime-type>text/html</mime-type>

<portlet-mode>VIEW</portlet-mode>

</supports>

<supported-locale>en</supported-locale>

<portlet-info>

<title>Hello World</title>

<short-title>Hello World</short-title>

<keywords>Hello </keywords>

</portlet-info>

</portlet>

A estrutura básica dos projetos portlets é muito parecida com as aplicações JSP/Servlet. Considerando o padrão MVC, normalmente a camada VIEW dos portlets é desenvolvida em JSP com uma pequena diferença nas execuções de URL’s e submits de formulários, considerando que os portlets são partes independentes e podem ser colocadas em qualquer pagina do portal, não tem como ser criado URL’s estáticas para eles assim como é usado em paginas JSP’s. Para resolver esta questão, toda request dos portlets são controladas pelo container da aplicação por meio de tags como:

<portlet:renderURL></portlet:renderURL>

<portlet:actionURL></portlet:actionURL>

<portlet:resourceURL></portlet:resourceURL>

Cada uma destas tags redireciona a requisição para um método especifico do portlet em execução. E isto somente é possível devido as configurações do arquivo portlet.xml no qual é definido a classe que controla o portlet (JSP).

Assim como as Servlets, as classes de controle dos portlets possuem alguns métodos específicos que recebem requisições especificas. Métodos como o  doView(RenderRequest request, RenderResponse response) respondem as requisições feitas pelo <portlet:renderURL/>, o método processAction(ActionRequest request, ActionResponse response) respondem as requisições feitas pelo <portlet:actionURL/> e o método serveResource(ResourceRequest request, ResourceResponse response)respondem as requisições AJAX feitas pelo

<portlet:resourceURL/>.

Outra tag muito importante é a <portlet:namespace> responsável por atribuir um código único para cada portlet. Esta tag é necessária para garantir a portabilidade dos portlets, impossibilitando que haja conflitos entre eles de identificadores de tags HTML, funções javascript, etc. Exemplo:

<script language="javascript">

function validaForm_<portlet:namespace/>() {

...

}

</script>

-----------------------------------------

<portlet:actionURL name="gravaURL" var="actionGravaURL">

</portlet:actionURL>

<form action="${actionGravaURL}" method="post" onsubmit="return validaForm_<portlet:namespace/>();" name="formConfig_<portlet:namespace/>" id="formConfig_<portlet:namespace/>">

...

...

</form>

Conclusão

A JSR 286 para Portlet 2.0, especifica um padrão para a criação de componente web reutilizáveis que podem ser utilizados em qualquer servidor compatível com a tecnologia de portal. Esta tecnologia pode ser utilizada para a construção de uma grande variedade de aplicações, como leitores de feeds, leitores de e-mail, editores de blogs, portais de integração de aplicativos empresarias, entre outros. Para se ter uma maior portabilidade de suas aplicações, muitas empresas estão migrando seus sistemas para esta tecnologia, aproveitando sua alta compatibilidade e a grande versatilidade que ela proporciona para o caso de futuras alterações estruturais das aplicações.

Referências:

HEPPER, Stefan – JavaTM Portlet Specification – Version 2.0, January 25, 2008

http://oreilly.com/pub/a/java/archive/what-is-a-portlet.html?page=2

http://jcp.org/en/jsr/detail?id=168

http://exo.sourceforge.net/faq.html

http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-portlet.html



Comentários

7 comentários em “Introdução à Tecnologia Portlet

  1. Excelente artigo sobre portlet, parabéns!

    Estou trabalhando com portlet há dois meses, mas ainda tenho muitas dúvidas, principalmente na questão de URL’s estáticas, que não funcionam em portlet. Vc poderia demostrar o funcionamentos de um portlet com mais de duas páginas distintas, navegando entre elas e passando parâmetros.

    Valeu, muito obrigado!

    Levy

  2. Estou na luta para escrever um portlet, porém estou com dúvida quando as telas, que são várias. Minha dúvida é se eu terei que criar uma classe portlet para cada tela ou somente um para todas as telas?

    Obrigado.