Escolar Documentos
Profissional Documentos
Cultura Documentos
Apache Pluto
Criando portlets em ambiente OpenSource
Conheça a especificação e aprenda como criar, empacotar e instalar portlets
no ambiente referência da especificação
Para compreender melhor a relação entre esses três componentes, vamos ver como é o
fluxo de requisição de uma página de portal (Figura 2).
Quando é feita a requisição de uma página, o servidor de portal a encaminha para o portlet
container, que tem a lista de portlets necessários para atender a requisição; essa lista são os
portlets que formam a página do portal, geralmente configurada por um administrador. Em
seguida, cada portlet processa a requisição e gera a resposta na forma de markup1,
devolvendo-a ao container que encaminha o conteúdo gerado ao portal para exibição ao
cliente, como ilustrado na Figura 2.
É importante frisar que os portlets não são como os servlets, apesar de terem algumas
semelhanças, como pode ser visto na Tabela 1.
Quanto à padronização
Em 2003, membros do Java Community Process resolveram estabelecer um padrão para o
desenvolvimento de portlets, e criaram uma especificação, a JSR 168. Esta, estabelecia uma
série de conceitos e padronizações tanto no próprio desenvolvimento dos portlets, quanto
na arquitetura envolvida (segurança, caching, interface gráfica e etc).
O tempo passou e a tecnologia amadureceu muito com os inúmeros produtos no mercado,
levando então a necessidade de uma atualização. Na data de escrita desse artigo, temos em
andamento a JSR 286, que é a versão 2.0 da primeira especificação, onde a proposta inclui
muitas correções da primeira versão e outros componentes como filtros, melhoramentos em
caching, gerenciamento, implementação de portlets remotos, etc.
Para atender ao ciclo de vida dos portlets, a interface Portlet possui os seguintes métodos:
• init(PortletConfig config): Chamado apenas uma vez. Utilizado para tarefas de
inicialização de recursos e recebe as configurações do portlet, que são meta-
informações como parâmetros de inicialização, nome, informações sobre o contexto do
portlet container e um arquivo de propriedades para internacionalização (Resource
bundle);
• processAction(ActionRequest request, ActionResponse response): Executado a cada
requisição de um cliente. Neste método são executadas as regras de negócio do portlet;
• render(RenderRequest request, RenderResponse response): Executado logo após o
processAction. É onde o markup será montado, sendo a camada de apresentação do
portlet. Geralmente utiliza as informações processadas no método processAction();
• destroy(): Método executado logo antes do portlet ser coletado pelo Garbage Collector.
Deve ser utilizado para liberar os recursos adquiridos nos métodos anteriores. Marca o
fim do ciclo de vida dos portlets.
A Figura 3 exibe a sequência dos métodos invocados pelo portlet container no ciclo de
vida do portlet.
Portlet Taglibs
Algumas taglibs foram definidas para auxílio no desenvolvimento das páginas JSP, a
Tabela 2 descreve cada uma delas:
Um novo diretório, abaixo do diretório onde foi executado o comando, será criado com o
nome “CadastroUsuario” com a estrutura, arquivos e bibliotecas necessárias. Na raiz do
diretório haverá o arquivo pom.xml, onde estão as definições do Maven para assembly do
projeto, que por default é no ambiente do Jetspeed (Projeto de portal da Apache). Devemos
alterá-lo incluindo as definições para o Pluto. Para isso, insira o código da Listagem 1 no
arquivo.
<plugin>
<groupId>org.apache.pluto</groupId>
<artifactId>maven-pluto-plugin</artifactId>
<version>1.1.4</version>
<executions>
<execution>
<phase>generate-resources</phase>
<goals>
<goal>assemble</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
...
</profiles>
Via Eclipse, importe o projeto com o Wizard “Importar projeto existente” e apontando
para o diretório do portlet criado.
Temos então todo o ambiente para desenvolvimento criado, com a estrutura apresentada
na Figura 4.
E vamos as classes que implementam a interface Portlet. A API nos fornece uma
implementação básica da interface javax.portlet.Portlet, a classe GenericPortlet, do mesmo
pacote. Essa classe provê também alguns métodos para tratamento dos modos dos portlets
como o doView() (modo de visualização), doEdit() (modo de edição) e doHelp() (modo de
ajuda). Crie as classes CadastroPortlet e DetalhePortlet no pacote cadusu.portlet, com os
códigos da listagem 3 e 4 respectivamente, essas classes representam os portlets de
cadastramento e detalhamento dos usuários:
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.portlet.*;
import cadusu.dados.Usuario;
if ("salvar".equalsIgnoreCase(acao)) {
if (listaUsuarios == null) {
listaUsuarios = new ArrayList();
session.setAttribute("usuarios", listaUsuarios);
}
import java.io.IOException;
import javax.portlet.*;
<portlet:defineObjects/>
<%-- A tag <portlet:actionURL/> cria uma URL para execução da ação do portlet
(processAction()) --%>
<form method="post" action="<portlet:actionURL/>" name="<portlet:namespace/>frmDetalhar">
<input type="hidden" name="acao" value="detalhar">
<input type="hidden" name="codigo">
<portlet:defineObjects/>
<%
//Adiciona o objeto em pageContext para acesso via EL
pageContext.setAttribute("usuario",
renderRequest.getPortletSession().getAttribute("usuario",
javax.portlet.PortletSession.APPLICATION_SCOPE));
//Limpa o objeto da sessão após consumí-lo
renderRequest.getPortletSession().setAttribute("usuario", null,
javax.portlet.PortletSession.APPLICATION_SCOPE);
%>
Com os arquivos criados, precisamos agora informar ao portlet container que nosso
projeto possui 2 portlets e referenciar suas respectivas classes. O arquivo responsável por
isso é o portlet.xml, no diretório WEB-INF. Esse arquivo especifica cada portlet disponível
no projeto, assim como o arquivo web.xml especifica os servlets em um servlet container. A
tag <portlet> representa um portlet no projeto, para mais detalhes sobre cada tag no
documento, vide a especificação de portlets, para acessá-la veja a seção de links no final do
artigo. O arquivo portlet.xml do projeto deve ficar igual ao exibido na listagem 7.
<portlet-app
xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
version="1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd
http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd">
<portlet>
<description>Formulário de cadastramento de usuários no sistema</description>
<portlet-name>CadastroPortlet</portlet-name>
<display-name>Cadastro Portlet</display-name>
<portlet-class>cadusu.portlet.CadastroPortlet</portlet-class>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>VIEW</portlet-mode>
</supports>
<supported-locale>en</supported-locale>
<portlet-info>
<title>Cadastro de Usuarios</title>
<short-title>Cadastro de Usuarios</short-title>
<keywords>cadastro usuario</keywords>
</portlet-info>
</portlet>
<portlet>
<description>Portlet para exibição dos detalhes do usuário</description>
<portlet-name>DetalhePortlet</portlet-name>
<display-name>Detalhe Portlet</display-name>
<portlet-class>cadusu.portlet.DetalhePortlet</portlet-class>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>VIEW</portlet-mode>
</supports>
<supported-locale>en</supported-locale>
<portlet-info>
<title>Detalhamento de Usuarios</title>
<short-title>Detalhamento de Usuarios</short-title>
<keywords>detalhe usuario</keywords>
</portlet-info>
</portlet>
</portlet-app>
Unix/Linux:
<diretório onde o arquivo foi descompactado>/pluto-{versão}/bin/startup.sh
Com isso, o Tomcat será iniciado (certifique-se de já não ter outra aplicação utilizando a
porta 8080). Agora, acesse o Pluto Portal pela URL http://localhost:8080/pluto/portal, a tela
de login será exibida, conforme ilustrado na figura 5. Por padrão, o usuário é pluto e a
senha também.
Feito o deploy vamos adicionar os portlets em uma página do Pluto Portal. No portlet
Pluto Page Administration, adicione uma nova página chamada “Minha Página” e em
Portlet Applications, adicione os dois portlets que criamos nela, como na figura 6.
Note que após criada a página “Minha Página”, um link para ela foi criado no menu
superior. Ao adicionar portlets nas páginas do Pluto Portal, eles automaticamente são
arranjados, conforme exibido na figura 7. A maioria dos portais comerciais como o IBM
Websphere Portal ou JBOSS Portal permitem a configuração da disposição dos portlets na
página, como a intenção do Pluto Portal é apenas permitir testes essa funcionalidade não foi
implementada.
Figura 7. Página do Pluto com os portlets criados
Conclusão
A especificação padronizada de portlets ainda está em sua primeira versão, ao contrário da
evolução das API proprietárias, como da IBM, BEA, Oracle, que são implementadas desde
2002. Muita coisa ainda precisa ser definida e já está em andamento a JSR 286 (segunda
versão da especificação) que promete muita coisa nova, adicionando maturidade ao
framework.
Dentro desta evolução a API já permite adicionar outros frameworks de desenvolvimento,
como JavaServer Faces e Struts, assim a migração de aplicações com esta arquitetura pode
ser devidamente realizadas em um container de portlet.
O desenvolvimento orientado a portlets é uma realidade nas grandes corporações no Brasil
e no mundo, portanto, leve em consideração os benefícios desta arquitetura em seus futuros
projetos.
Links
http://portals.apache.org/pluto/install.html
Site com download e documentação do Apache Pluto
http://www-
128.ibm.com/developerworks/websphere/library/techarticles/0403_hepper/0403_hepper.html
Best pratices de desenvolvimento de portlets
http://jcp.org/aboutJava/communityprocess/final/jsr168/
Especificação JSR168 para portlets
http://maven.apache.org/
Site com download e documentação do Maven
http://www.ibm.com/developerworks/websphere/library/tutorials/0606_coqueiro/0606_coquei
ro.html
Desenvolvendo portlet com ferramenta gráfica
http://www.ibm.com/developerworks/websphere/zones/portal/
Portal especializado em conteúdo destinado a portlets
Gustavo Concon (gconcon@br.ibm.com) é desenvolvedor Java/Java EE especialista
em tecnologias para desenvolvimento em portal e web. Tem as certificações SCJP,
SCWCD, SCBCD.