Création d'un portlet simple

Pour créer un portlet simple, vous devez écrire le code du portlet, compiler la source Java, créer le fichier JAR, écrire les descripteurs du portlet, définir la structure de répertoire du fichier WAR et conditionner puis déployer les portlets.

Avant de commencer à développer des portlets, configurez un environnement qui facilite l'écriture, la compilation et le test des portlets. Rational® Application Developer inclut un environnement de test que vous pouvez utiliser pour exécuter et déboguer vos portlets sans avoir à les déployer manuellement sur le serveur. Vous pouvez configurer l'environnement d'exécution pour déboguer les portlets sur la machine de développement locale ou sur un serveur distant. Pour obtenir des instructions de configuration complètes, voir la documentation de Rational® Application Developer.

Rational® Application Developer fournit des assistants pour vous aider à construire, tester et déployer des portlets à l'aide de l'ensemble des API, des classes relatives et des interfaces disponibles dans l'environnement d'exécution du portlet. Vous pouvez également générer des portlets à l'aide de votre propre environnement de développement et de vos outils. Si vous n'utilisez pas d'assistants pour développer des portlets, les rubriques suivantes décrivent les mécanismes de génération d'un portlet simple.

Ecriture du code d'un portlet

Le portlet d'accueil Hello World vous aidera à écrire votre premier portlet. Le portlet est fourni avec la source dans le package HCL Portlet Samples, qui est disponible dans le catalogue de portlets et en effectuant une recherche sur navcode 1WP10017Z. Voir la rubrique Portlets modèles pour plus d'informations. Hello World fournit les méthodes minimales requises pour un portlet. Il utilise l'objet de réponse portlet pour écrire un résultat simple directement sur la page du portail.
Figure 1. Exemple : Source Java pour portlet Hello World (interface API de portlet standard)

package com.ibm.wps.samples.jsr;

import javax.portlet.*;
import java.io.*;

public class HelloWorld extends GenericPortlet {
	
   public void init (PortletConfig portletConfig) throws UnavailableException, PortletException
   {
      super.init(portletConfig);
   }

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

      // set return content type 
      response.setContentType("text/html");
      PrintWriter writer = response.getWriter();
      writer.println("<p class='wpsPortletText'>Hello Portal World!</p>");
    }

}

Compilation d'une source Java

Compilez vos fichiers source Java. Avant de compiler votre source Java, définissez le chemin de classe du compilateur de manière à ce qu'il trouve les fichiers JAR de tous les packages utilisés par votre portlet, en exécutant la commande suivante :
  • AIX® HP-UX Linux Solaris: ./setupcmdLine.sh
  • IBM® i: setupcmdLine.sh
  • Windows : setupcmdLine.bat
  • z/OS® : setupcmdLine.sh
Les fichiers JAR suivants doivent être définis dans le chemin de classe pour que les portlets puissent être compilés :
Portlets standard
Tableau 1. Description des fichiers JAR des portlets standard
fichier JAR Objectif
portletapi_20.jar Ce fichier respecte Java Portlet Specification version 2.0.
public_api.jar Utilisez ce fichier si vous recourez à des services du package Public API Javadoc.
public_api.jar + public_spi.jar Utilisez ce fichier si vous recourez à des services du package Public SP Javadoc.
Ces fichiers se trouvent dans le répertoire PortalServer_root/doc/compile.
Portlets HCL DX
Tableau 2. Description des fichiers JAR des portlets HCL DX
fichier JAR Objectif
wp.pe.api.legacy.jar API de portlet HCL
wp.portletservices.api.legacy.jar Services de portlet
wp.pe.rt.api.jar Les menus de portlet
Compilez ensuite le portlet en utilisant le chemin d'accès qualifié complet à la source Java du portlet.
   appserver\java\bin\javac -classpath %WAS_CLASSPATH%;path_to\portletapi_20.jar 
        com.ibm.wps.samples.jsr.HelloWorld.java  
   appserver\java\bin\javac -classpath %WAS_CLASSPATH%;path_to\portletapi_20.jar 
        com.ibm.wps.samples.v4.HelloWorld.java  
Chargement de classes pour des portlets

Le processus de chargement de classes HCL DX respecte la hiérarchie de WebSphere® Application Server en ce qui concerne les chemins d'accès aux classes et les demandes de recherche. Vous pouvez faire référence à une classe si le chargeur de classe parent ou votre propre chargeur de classe le permet. Vous ne pouvez pas faire référence à une classe si un chargeur de classe enfant y fait référence. La figure montre l'emplacement d'HCL DX et des applications de portlet dans la hiérarchie de chargement des classes.

Dans l'image suivante, les correctifs du chemin de classe d'exécution (RCP) se trouvent au sommet de la hiérarchie. Le chemin de classe d'exécution (RP) part des correctifs de chemin de classe d'exécution. Les extensions d'exécution (RE) partent du chemin de classe d'exécution et les extensions d'application (AEX) partent des extensions d'exécution. Les chargeurs de classe d'application AC1, AC2 et AC3 sont des applications de portlet qui partent des extensions d'application.


chemins de classe du portail

Comme vous le voyez, HCL DX est une extension d'application (AEX) dans WebSphere® Application Server. Les classes principales d'HCL DX se trouvent dans le chemin de classe PortalServer_root/shared/app. Si une application de portlet installée comporte un chargeur de classe, il s'agit d'un chargeur de classe d'application (ACx) dans HCL DX.

En cas d'incident lié au chargement des classes, assurez-vous que les classes requises sont dans les bons chemins de classe, selon la hiérarchie du chargement des classes.

Création du fichier JAR

Ensuite, le portlet doit être mis en forme dans le format de fichier JAR. Pour créer un fichier JAR du nom de HelloWorld.jar, entrez la commande suivante :


   jar -cf HelloWorld.jar HelloWorld.class

Pour plus d'informations sur la commande JAR, reportez-vous à la documentation de JDK.

Ecriture des descripteurs d'un portlet

Les modèles suivants peuvent être mis en forme avec le portlet Hello World.

Descripteur de déploiement d'application Web pour les portlets standard
Selon Java Portlet Specification, seules les ressources Web qui ne sont pas des portlets doivent être déclarées dans web.xml. Toutefois, les propriétés suivantes doivent être définies pour correspondre au descripteur de portlet :
  • <description/>

    décrit l'application de portlet.

  • <display-name/>

    indique le nom de l'application de portlet.

  • <security-role/>

    indique la correspondance de rôle de sécurité de l'application de portlet. Omettez cette balise si le portlet n'utilise pas cette fonction.

Figure 2. Exemple : Descripteur de déploiement d'application Web pour Hello World (portlets standard)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
                         "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp">
	<display-name>Hello World (JSR)</display-name>
	<description>Basic JSR 168 portlet</description>
</web-app>
Descripteur de déploiement de portlet standard :
L'exemple suivant montre les éléments minimum requis pour le descripteur de déploiement de portlet standard.
Figure 3. Exemple : Descripteur de déploiement de portlet pour Hello World (standard)

<?xml version="1.0" encoding="UTF-8"?>
<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" version="2.0" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd 
                                 http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd">
   <portlet>
      <portlet-name>HelloWorld portlet name</portlet-name>
      <display-name>Hello World portlet (JSR)</display-name>
      <display-name xml:lang="fr-fr">Hello World portlet (JSR)</display-name>
      <portlet-class>com.ibm.wps.samples.jsr.jsrHelloWorld</portlet-class>
      <supports>
         <mime-type>text/html</mime-type>
         <portlet-mode>view</portlet-mode>
      </supports>
      <supported-locale>en</supported-locale>
      <portlet-info>
         <title>Hello World (JSR)</title>
      </portlet-info>
   </portlet>
</portlet-app>

Le descripteur de portlet standard est défini par un schéma XML et ne nécessite pas de DTD.

Configuration de l'arborescence de fichiers WAR

Avant de mettre en forme le portlet, les fichiers de classes et les ressources doivent être organisés dans l'arborescence du fichier WAR décrite ci-dessous. Une application de portlet existe en tant que hiérarchie structurée de répertoires.

Remarque : Ne mettez pas en forme les fichiers .tld pour les bibliothèques de balises fournies par le portail ou le serveur d'applications avec le fichier WAR de l'application de portlet. Cela inclut les balises de portlets JSR 168 et 286 et la bibliothèque JSTL (Java Standard Tag Library).
/
Répertoire racine de la structure des fichiers du portlet.
/images
Emplacement de toutes les images requises par le portlet.
/WEB-INF
Emplacement de toutes les ressources protégées. Le répertoire /WEB-INF contient le document du descripteur de portlet ainsi que toutes les classes et fichiers JAR exécutables nécessaires au portlet mis en forme.

Le répertoire contenant les informations sur le portlet ne fait pas partie de l'arborescence de documents publics de l'application. Les fichiers qui se trouvent dans /WEB-INF ne sont pas directement présentés au client.

/WEB-INF/lib
Emplacement de stockage des fichiers JAR du portlet.
/WEB-INF/jsp
Emplacement des fichiers JSP. Il s'agit d'un nom de chemin d'accès suggéré. Vos fichiers JSP peuvent être insérés à n'importe quel endroit. Ceux inclus dans le marquage du portlet doivent être placés dans le répertoire /WEB-INF. Placez-les en dehors du répertoire /WEB-INF si vous créez directement des liens à ces fichiers.
/WEB-INF/classes
Emplacement des fichiers de classe du portlet. Chaque fichier de classe doit être stocké au sein de /WEB-INF/classes, dans une arborescence qui reflète le module de la classe. Par exemple, la classe HelloWorld.class, de l'ensemble com.ibm.wps.samples, serait stockée dans /WEB-INF/classes/com/ibm/wps/samples/HelloWorld.class.
/META-INF
Emplacement du fichier manifeste manifest.mf et du fichier de sécurité Java 2 was.policy (si présent). Le fichier manifeste est au format JAR standard, défini par la spécification Java 1.3. Le fichier de règle de sécurité Java 2 est utilisé pour autoriser un portlet à exécuter des opérations qui peuvent être restreintes si la sécurité Java 2 est activée. Le contenu du répertoire /META-INF n'est pas accessible aux clients.
Remarque : Le serveur d'applications recherche les fichiers de règle de sécurité à l'emplacement de l'archive d'application d'entreprise plutôt qu'à l'emplacement de l'archive d'application Web. Ainsi, le serveur de portail copie was.policy depuis le répertoire appname.war/META-INF vers le répertoire appname.ear/META-INF généré lors du déploiement d'un fichier WAR de portlet.

Mise en forme et déploiement de portlets

Pour être déployé et exécuté sur le serveur, un portlet doit se présenter sous forme d'un fichier Web application ARchive ou WAR. Le format du fichier WAR contient les classes et les ressources Java qui constituent un ou plusieurs portlets dans une application de portlet. Les ressources peuvent être des images, des fichiers JSP, l'écriture de descriptions de portlets, et des fichiers de propriétés contenant un texte de message traduit. Le regroupement des informations descriptives, des ressources et des classes du portlet dans un fichier unique facilite la distribution et le déploiement des portlets.
HCL DX contient un portlet d'administration qui permet d'installer, de désinstaller et de mettre à jour les portlets. Les portlets qui figurent dans les fichiers WAR ont l'avantage d'être téléchargés et installés dynamiquement. L'administrateur de portail peut télécharger un fichier WAR depuis Internet et utiliser l'interface d'administration du portail pour installer le portlet sur HCL DX. A la fin de l'installation, le portlet est prêt à l'emploi et ne nécessite pas le redémarrage du serveur. Pour assembler votre portlet dans un fichier WAR, vous pouvez utiliser l'utilitaire du fichier JAR pour assembler le portlet dans un fichier WAR.
Remarque : Windows limitant la longueur maximale du chemin d'accès à 260 caractères, le nom du fichier WAR doit comporter moins de 25 caractères. Sur un serveur de portail s'exécutant sous Windows, l'installation d'un fichier WAR dont le nom comporte plus de 25 caractères entraîne une erreur.
Conseil : Vous pouvez également exécuter les tâches build-war-file ou build-ear-file pour créer les fichiers .war et .ear. Consultez le lien "Création de fichiers .ear et .war" dans la section Tâches associées pour plus d'informations.
Regroupement d'un portlet et de ressources dans un fichier WAR

N'importe quel utilitaire de fichier JAR peut être utilisé pour créer un fichier WAR. Vous trouverez ci-dessous des exemples d'utilisation de l'utilitaire de fichier JAR fourni par WebSphere® Application Server.

  • Pour créer un fichier WAR nommé HelloWorld.war et inclure tous les fichiers dans les répertoires /WEB-INF et /images, procédez de la façon suivante :
       jar -cf HelloWorld.war images WEB-INF
    
  • Pour mettre à jour le fichier WAR HelloWorld.war avec un descripteur de portlet révisé :
       jar -uf HelloWorld.war WEB-INF/portlet.xml
    
  • Pour extraire le descripteur de portlet du fichier WAR, HelloWorld.war :
       jar -xf HelloWorld.war WEB-INF/portlet.xml
    
  • Pour extraire tous les fichiers d'un fichier WAR existant, HelloWorld.war :
       jar -xf HelloWorld.war
    

Une fois le fichier WAR créé, vous pouvez l'installer dans HCL DX, comme décrit dans Portlets d'administration de portail

Préparation de l'application de portlet pour l'installation

Pour faciliter le déploiement des applications de portlets et des portlets complexes, vous pouvez fournir un fichier de configuration de portlet pouvant être appelé par l'interface de configuration XML (XMLAccess). L'interface de configuration XML permet au développeur de portlet de spécifier les emplacements, pages, thèmes, habillages, balises et clients pris en charge, ainsi que d'autres paramètres pour une application de portlet. C'est particulièrement utile pour les portlets qui utilisent la messagerie car ces portlets doivent être placés sur la même page. Pour plus de détails, voir Interface de configuration XML.

Lors de la construction de scripts XMLAccess destinés à l'installation de portlets standard, utilisez les valeurs suivantes :
  • Attribut uid pour l'élément <web-app> :

    Utilisez l'attribut uid du sous-élément <portlet-app/> avec un suffixe .webmod. Comme décrit ultérieurement dans cette rubrique, l'attribut uid du sous-élément <portlet-app/> dépend de la présence de l'attribut id de l'élément <portlet-app/> du fichier portlet.xml.

  • attribut uid pour l'élément <portlet-app> :

    Utilisez l'attribut id de l'élément <portlet-app/> du fichier portlet.xml. Si cette valeur n'a pas été spécifiée, indiquez le nom du fichier WAR de l'application de portlet à sa place. Pour les mises à jour de portlet, le nom du fichier WAR doit être le nom original du fichier WAR utilisé pour installer l'application de portlet. Cela revient à dire que le fichier WAR peut être renommé, mais que l'uid doit indiquer l'uid original utilisé durant l'installation du portlet.

  • Attribut name pour l'élément <portlet> :

    Utilisez le contenu de l'élément <portlet-name/> à partir de portlet.xml.

  • attribut referenceid de l'élément <servlet> :

    Utilisez le contenu de l'élément <portlet-name/> depuis le fichier portlet.xml complété par le suffixe .servlet.

Par exemple, une application de portlet peut utiliser un descripteur de portlet :
Figure 4. Exemple d'élément <portlet-app/> dans le descripteur de portlet
<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>
        <portlet-name>Banner Ad</portlet-name>
        ...

Dans cet exemple, aucun attribut ID n'est fourni sur l'élément <portlet-app/>. Par conséquent, l'élément <portlet-app/> du script XMLAccess doit utiliser le nom du fichier WAR :

Figure 5. Exemple d'élément <web-app/> dans XMLAccess
 <web-app action="update" active="true" uid="com.ibm.wps.banner">
     <url>file:///$server_root$/bp/wp.bp.bannerad/installableApps/bannerad.war</url>
     <servlet action="update" 
              active="true" 
              referenceid="Banner Ad.servlet"/>
     <portlet-app action="update" active="true" uid="com.ibm.wps.banner">
         <portlet action="update" active="true" name="Banner Ad">
     </portlet-app>
 </web-app>