Nesta continuação da série sobre Portlets, aprenda a usar técnicas mais avançadas, e torna seus portlets mais seguros, interativos e personalizáveis
porem com layouts e cores completamente
diferentes.
Personalização
Um dos grandes diferenciais dos portais é a sua capacidade de personalização pelos usuários, que é feita em dois níveis básicos.
O primeiro nível se refere a peronalizações do portal como um todo; por exemplo, a definição do número de páginas e dos portlets que devem estar em cada página, esquemas de cores, estilo das páginas e outras opções gerais.
O segundo nível é interno a cada portlet. São personalizações definidas pelo desenvolvedor e geralmente acessíveis no modo de edição do portlet, controladas pelo portlet de forma independente do portal onde está sendo executado.
Para ilustrar a diferença entre esses niveis, considere a Figura 1, que ilustra a aparência do portal para dois usuários diferentes ambos estão visualizando os dois prtlets de exemplo deste artigo, porém com layouts e cores completamente diferentes.
Isso nos leva a uma prática importante: devemos disponibilizar personalizações apenas de conteúdo ou de comportamento do portlet, e evitar a criação de personalizações que fazem mais sentido para o portal como um todo. Por exemplo, para o portlet de lista de CDs mostrado, o usuário pode escolher as colunas de informação que quer visualizar, e também se um clique no título das colunas deve mudar a ordenação – ambas são personalizações do portlet.
Entretanto, note que são usadas cores diferentes para linhas pares e impares na listagem. Essas cores são uma definição geral do portal: quando o usuário mudar o esquema de cores, a aparência dos portlets irá refletir a alteração automaticamente; isso não aconteceria, é claro, se as cores fossem definidas internamente nos portlets.
A forma como é feito o gerenciamento de preferências no nível de portal é específica a cada produto. Já a definição e a manipulação de preferências em nível de portlets seguem um procedimento padrão definido pela especificação, o que garante a interoperabilidade entre portais. Os seguintes passos demonstram esse processo:
1. Definir as preferências no arquivo portlet.xml
O conjunto de preferências de um portlet é definido no arquivo portlet.xml (Listagem 1),
através da tag
Para o portlet de lista de CDs, são definidas as preferências Título, Artista, Preco e Ordenavel, que indicam quais colunas devem estar visíveis e se a tabela é ordenável ou não.
Listagem 1. portlet.xml: arquivo de configuração completo para os dois portlets
<?xml version-“
<portlet-app id-“loja” version-“1.0”>
<portlet id-“ListaProdutosPortlet”>
<portlet-name>ListaProdutosPortlet</portlet-name>
<portlet-class>jm.portlet.ListaProdutosPortlet</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>
<resource-bundle>jm.portlet.ListPortletResources</resource-bundle>
<portlet-preferences>
<preference>
<name>Titulo</name>
<value>true</value>
</preference>
<preference>
<name>Artista</name>
<value>true</value>
</preference>
<preference>
<name>Preco</name>
<value>true</value>
</ preference>
<preference>
<name>Ordenavel</name>
<value>true</value>
</preference>
<preferences-validator>
jm.portlet.ListaPreferencesValidator</preferences-validator>
</portlet-preferences>
</portlet>
<portlet id-“CarrinhoPortlet”>
<portlet-name>CarrinhoPortlet</portlet-name>
<display-name>Carrinho de Compras</display-name>
<description>Carrinho de Compras</description>
<portlet-class>jm.portlet.CarrinhoPortlet</portlet-cla5S>
<expiration-cache>0</expiration-cache>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>VIEW</portlet-mode>
</supports>
<resource-bundle>jm.portlet.CarrinhoPortletResources</resource-bundle>
<security-role-ref>
<role-name>customer</role-name>
<role-link>user</role-link>
</security-role-ref>
</portlet>
<user-attribute>
<name>user.home-info.online.email</name>
</user-attribute>
<user-attribute>
<name>user.name.given</name>
</user-attribute>
</portlet-app>
2. Carregar as preferência dentro do portlet
O código completo do portlet da lista de CDs pode ser visto na Listagem 2. Nele, o método lePreferencias() faz a carga das preferências no portlet. Primeiro uma referência às preferências é obtida com getPreferences(); em seguida cada valor de preferência é lido com getValue(), passando-se o nome da preferência e o valor a ser retornado caso ela não exista. (São usadas as classes Factory e CD, que não foram listadas por economia de espaço; porém são muito simples e estão disponíveis junto com os fantes no site da Java Magazine).
A Listagem 3 mostra a página JSP que gera a lista de CDs, usando recursos da JSTL e da taglib de portlets.
Listagem 2. ListPortlet.java:classe do portlet de lista de CDs
package jm.portlet;
import java.io.IOException;
import java.util.*;
import javax.portlet.*;
public class ListaCDsPortlet extends GenericPortlet {
private Comparator tituloComparator = new Comparator() {
public int compare(Object arg0, Object arg1) {
return ((CD) arg0).getTitulo().compareTo(((CD) arg1).
getTitulo());
}
};
private Comparator artistaComparator = new Comparator() {
public int compare(Object arg0, Object arg1) {
return ((CD) arg0).getArtista().compareTo(
((CD) arg1) .getArtista());
}
};
private Comparator precoComparator = new Comparator() {
public int compare(Object arg0, Object arg1) {
...