FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana">Parte 2: Personalização, Sessões e Segurança

 

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

 

No primeiro artigo desta série, foi apresentada uma introdução sobre a especificação de Portlets (JSR-168) e o ciclo de vida básico de um portlet. Neste artigo serão mostrados conceitos avançados, como personalização, configurações de segurança e o uso de sessões.

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.

 

 

 

 Figura 1. O portal na visão do usuário padrão do uPOrtal, “demo” (à esq.) e “student”

 

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 , que fica dentro da tag . Cada preferência é definida numa tag <preference>, cujas “subtags” e especificam o nome da preferência e o seu valor default. Todas as preferências de portlets devem ser do tipo String.

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-“1.0” encoding=”UTF-8”?>

<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) {

...

Quer ler esse conteúdo completo? Tenha acesso completo