Exercício 1.4: Comparando Diferenças do Descritor de Implementação

Antes de começar, você deve concluir o Exercício 1.3: Comparando Diferenças da Classe Java.

Neste exercício, você aprenderá as diferenças entre os descritores de implementação para as duas APIs de portlet. Examine as duas versões do descritor de implementação de portlet (portlet.xml). As diferenças básicas ilustradas nas amostras são mostradas a seguir. Para editar o descritor de implementação de portlet, utilize o editor do descritor de implementação de portlet.

Regras de Tags para o portlet.xml

As regras de tags para a API de portlet IBM são definidas por um DTD; a API de portlet JSR 168 é definida por um esquema XML. Isso requer diferentes instruções de definição XML no topo do descritor de implementação de portlet.

API do portlet IBM
<!DOCTYPE portlet-app-def PUBLIC "-//IBM//DTD Portlet Application 1.1//EN"
          "portlet_1.1.dtd ">
API do portlet JSR 168
<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"
             xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
             id="bookmark_03_jsr.1">

O Atributo ID no Elemento <portlet-app>

As duas APIs utilizam nomes diferentes para o atributo id no elemento <portlet-app>. A API de portlet IBM utiliza uid, enquanto a API de portlet JSR 168 utiliza id.

API do portlet IBM
<portlet-app uid="com.ibm.etools.portal.portletexamples.bookmark.legacy"
API do portlet JSR 168
<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 "
             xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
             id="bookmark_03_jsr.1">

O Atributo href no Elemento <portlet>

Utilizando a API de portlet IBM, o atributo href do elemento <portlet> deve apontar para o id correspondente do elemento <servlet> no descritor de implementação da Web (web.xml); utilizando a API de portlet JSR 168, o atributo id no elemento <portlet-app> identifica exclusivamente o portlet para o servidor. Portlets JSR 168 não são servlets e não precisam de referência ao web.xml.

API do portlet IBM
portlet.xml: <portlet id="Bookmark" href="WEB-INF/web.xml#Servlet_1086938566718"
web.xml:     <servlet id="Servlet_1086938566718">
API do portlet JSR 168
<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 "
             xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
             id="bookmark_03_jsr.1">

Versões do Portlet

Para a API de portlet IBM, utilize os atributos major-version e minor-version dos elementos <portlet-app> e <portlet>; para a API de portlet JSR 168, utilize o atributo version do elemento <portlet-app>.

API do portlet IBM
<portlet-app uid="com.ibm.etools.portal.portletexamples.bookmark.legacy"
             major-version="1" minor-version="0">
<portlet id="Bookmark" href="WEB-INF/web.xml#Servlet_1086938566718"
             major-version="1" minor-version="0">
API do portlet JSR 168
<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 "
             xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
             id="bookmark_03_jsr.1">

Tipos de Marcação Suportados

No descritor de implementação do portlet, a API de portlet IBM declara tipos de marcação suportados, enquanto a API de portlet JSR 168 declara tipos MIME suportados. A IBM fornece uma extensão, o parâmetro de inicialização wps.markup, que permite definir os tipos de marcação suportados para os portlets JSR 168. Isso é utilizado para diferenciar entre os tipos de marcação, como HTML e cHTML, que utilizam o mesmo tipo MIME.

API do portlet IBM
<supports>
   <markup name="html">
      <view />
      <edit />
   </markup>
   <markup name="chtml">
      <view />
   </markup>
</supports>
API do portlet JSR 168
<init-param>
   <name>wps.markup</name>
   <value>html,chtml</value>
</init-param>

<supports>
   <mime-type>text/html</mime-type>
   <portlet-mode>VISUALIZAR</portlet-mode>
   <portlet-mode>EDITAR</portlet-mode>
</supports>

Modos Suportados

Os modos suportados devem ser definidos no descritor de implementação de portlet para ambas as APIs, embora a sintaxe seja um pouco diferente. Ambas as APIs suportam os modos editar, visualizar e ajuda. A API de portlet IBM também suporta um modo config. A API de portlet JSR 168 suporta nós personalizados, como sobre, visualizar, imprimir, editar padrões e config. Para ambas as APIs, o modo de visualização é necessário; todos os outros modos são opcionais.

API do portlet IBM
<supports>
   <markup name="html">
      <view />
      <edit />
   </markup>
</supports>
API do portlet JSR 168
<supports>
   <portlet-mode>VISUALIZAR</portlet-mode>
   <portlet-mode>EDITAR</portlet-mode>
</supports>

Estados da Janela Permitidos

O estado normal é automaticamente fornecido para ambas as APIs. Com a API de portlet IBM, outros estados, como sozinho, devem ser explicitamente declarados. Com a API de portlet JSR 168, os estados maximizado e minimizado também são automaticamente fornecidos; os estados personalizados devem ser explicitamente declarados.

API do portlet IBM
<allows>
   <maximized/>
   <minimized/>
</allows>
API do portlet JSR 168
Nenhum estado personalizado é mostrado na amostra, mas o elemento <custom-window-state> seria utilizado

Localização

Algumas cadeias localizadas que definem um portlet são definidas no descritor de implementação de portlet. O portlet.xml da API de portlet IBM define os valores localizados para o título, título abreviado, descrição e palavras-chave. A API da IBM também possui uma definição para o código do idioma padrão. A API de portlet JSR 168 define valores localizados para a descrição do portlet e o nome de exibição no portlet.xml. Os valores para o título, título abreviado e palavras-chave estão localizados em um pacote de recursos do portlet. Conforme mostrado a seguir, o pacote de recursos do portlet, Portlet.properties, está localizado no diretório nls da amostra. A API JSR 168 possui configurações para definir o pacote de recursos e os códigos dos idiomas suportados.
API do portlet IBM
<default-locale>en</default-locale>
<language locale="en">
   <title>Portlet de Favoritos (IBM)</title>
   <title-short>Favoritos</title-short>
   <keywords>Favoritos</keywords>
</language>
<language locale="de">
   <title>Portlet Lesezeichen (IBM)</title>
   <title-short>Lesezeichen</title-short>
   <keywords>Lesezeichen, Favoritos</keywords>
</language>
API do portlet JSR 168
<resource-bundle>nls.Portlet</resource-bundle>
<supported-locale>en</supported-locale>
<supported-locale>de</supported-locale>
<description xml:lang="EN">Descrição em inglês</description>
<display-name xml:lang="EN">Nome de exibição em inglês</display>-name>
<description xml:lang="DE">Descrição em alemão</description>
<display-name xml:lang="DE">Nome de exibição em alemão</display>-name>

Pacote de recursos do portlet de amostra, Portlet.properties:
javax.portlet.title = Portlet de Favoritos
javax.portlet.short-title = Favoritos
javax.portlet.keywords = Favoritos

Expiração de Cache

Na API de portlet IBM, os portlets podem invalidar explicitamente o cache (armazenamento em cache de invalidação) utilizando método invalidateCache() do objeto PortletRequest. O escopo e e a expiração de cache padrão são definidos no descritor de implementação de portlet. O valor do elemento <expires> pode ser 0 (sempre expira), -1 (nunca expira) ou o número de segundos antes da expiração. O valor do elemento <shared> de no significa que o cache não está compartilhado entre as instâncias do portlet.

A API de portlet JSR utiliza o armazenamento em cache baseado em expiração, em que o tempo de expiração de cache é definido no descritor de implementação, mas os portlets podem reconfigurar o valor utilizando o valor EXPIRATION_CACHE com o método setAttribute() do objeto RenderResponse. O elemento <expiration-cache> utiliza os mesmos valores que a API de portlet IBM utiliza para o elemento <expires>.

API do portlet IBM
<cache>
   <expires>-1</expires>
   <shared>no</shared>
</cache>
API do portlet JSR 168
<expiration-cache>0</expiration-cache>

Agora você está pronto para começar o Exercício 1.5: Comparando Diferenças da Codificação do Arquivo JSP.

Feedback
(C) Copyright IBM Corporation 2000, 2005. Todos os Direitos Reservados.