I. Introduction

I-A. Définition d'un Portlet

Un Portlet est un composant web unitaire s'intégrant au sein d'un conteneur (portail).

Chaque Portlet est indépendant des autres et peut-être imaginé comme une application WEB au sens J2EE (d'ou l'idée de composant web unitaire).

Les Portlets se basent sur une API définie par la spécification JSR 168.

Cette spécification étend (ou duplique) l'API des servlets.

Il existe une grande similarité entre les Servlets et les Portlets. Nous verrons un peu plus loin ces différences.

I-B. Qu'est-ce qu'un Portail ?

D'un point de vue technique un portail est un conteneur.

Ce conteneur manipule les Portlets; le portail fourni aux Portlets un environnement d'exécution.

Il les positionne sur les pages, il gère leurs cycles de vie, etc.

D'un point de vu fonctionnel un portail est une application web permettant d'agréger du contenu.

Il permet de centraliser différentes sources d'information sur une unique page.

Chaque source d'information est représentée par un Portlet.

Le conteneur, hébergeant les Portlets a la responsabilité de fournir un environnement d'exécution aux Portlets.

I-C. Objectif

La spécification JSR168 a pour objectif de standardiser les Portlets et d'assurer une interopérabilité entre les différents portails du marché.

Aussi, chaque fournisseur a adapté et spécialisé cette spécification. Je pense par exemple à IBM et le portail WebSphere-Portal qui fournit une API propre à ce serveur (les versions récentes du portail abandonnent cette API spécifique pour rentrer dans les standards).

Le but de cet article est de donner une vue générale sur les Portlets.

II. Portlet et Servlet

Afin de mieux appréhender le fonctionnement des Portlets, je vais vous présenter les points communs et les points de divergence entre ces deux composants.

II-A. Les points communs

Voici une liste des points similaires entre le Portlet et le servlet :

  • les servlets et les Portlets sont des composants basés sur le langage Java pour leur implémentation ;
  • les Portlets comme les servlets évoluent au sein d'un conteneur ;
  • ces deux composants génèrent du contenu (statique ou dynamique) ;
  • ils ont tous les deux un cycle de vie contrôlé par leur conteneur et de la même façon ;
  • la sémantique concernant les objets resquet et response est identique.

II-B. 2.4. Les points de divergences

Voici une liste des points de divergences entre le Portlet et le servlet :

  • un servlet génère une page complète tandis que la Portlet a pour vocation de ne générer qu'un fragment de page ;
  • un Portlet peut générer du code HTML sans inclure , de manière rigoureuse, les tags : base, body, frame, frameset, head, html ou title. Le tag iframe peut-être utilisé mais avec précaution ;
  • à la différence d'un servlet, un Portlet ne peut être invoqué directement via un URL ;
  • la communication entre le client et le Portlet est entièrement gérée par le portail ;
  • le Portlet permet de gérer un état et un mode d'affichage (notion décrit plus bas) ;
  • plusieurs instances d'une Portlet peuvent être placées dans un même page ;
  • deux scopes sont supportés dans l'objet de session : le scope Portlet application et le scope Portlet ;
  • le Portlet ne peut pas initialiser l'encodage de caractère de la réponse faite au client ;
  • le Portlet ne peut pas écrire d'information dans le header de l'entête HTTP sur la réponse faite au client.

Ces listes ne sont pas forcements exhaustives, elles donnent un aperçu des règles à avoir à l'esprit lors du développement de Portlet.

III. Description d'un Portlet

III-A. Arborescence des fichiers

L'arborescence des fichiers composant le Portlet est similaire à celle d'une application web J2EE. La différence réside dans l'ajout d'un nouveau fichier XML : Portlet.xml. Ce fichier décrit -de manière déclarative- les composants du Portlet.

Image non disponible

III-B. Le fichier Portlet.xml

Le fichier Portlet.xml représente le descripteur de/des Portlet(s) contenues dans l'application. Dans la version 1.0 de la spécification des Portlet il y a une distinction entre le descripteur de l'application web (web.xml) et celui des Portlets (Portlet.xml). Cette distinction est dû au fait que la version 2.3 de la spécification des servlets définissait le fichier web.xml comme non extensible.

Ci-dessous vous trouvez une représentation graphique des balises et attributs composant le fichier Portlet.xml.

Description des balises et attributs du fichier Portlet.xml
partie 1 partie 2

IV. Le cycle de vie d'un Portlet

Le conteneur fait l'interface entre le portail (l'IHM) et les Portlets, il se charge de réceptionner les requêtes issues du client pour les transmettre à la Portlet concerné. Le cycle de vie d'un Portlet peut-être assimilé à celui d'une servlet. Il se réalise au travers de l'invocation de différente méthode dans un ordre déterminé. À chaque méthode incombe une responsabilité bien définie. Les paragraphes suivants décrivent différentes phases du cycle de vie d'un Portlet.

IV-A. Phase d'initialisation

Cette phase se charge de lire et de mettre à disposition les paramètres déclarés dans le fichier XML de déploiement du Portlet.

Image non disponible

IV-B. Diagramme de séquence

Le client (via un navigateur web) envoie une requête HTTP vers le serveur de Portlet.

Le portail reçoit cette requête. Le conteneur détermine le destinataire de la requête (quel Portlet ?).

Le conteneur invoque la méthode ProcessAction() du Portlet concerné.

Ensuite le portail va invoquer les méthodes render() de chaque Portlet présente sur la page du Portlet sollicité par le client.

Les fragments de code HTML seront générés à l'issue de chaque méthode render(). Ces bouts de page vont être agrégés, par le conteneur, pour renvoyer une page au format HTML correctement formatée.

Ci-dessous la représentation au moyen d'un diagramme de séquence :

Image non disponible

V. Les méthodes

Ces quatre méthodes sont définies dans l'interface : javax.portlet.Portlet Tous les Portlets doivent implémenter cette interface directement ou alors, plus communément, par héritage au travers d'une classe l'implémentant (Cette façon de faire est généralement utilisée dans le cas de la réalisation de framework autour des Portlets). L'API des Portlets fournie une implémentation par défaut de cette interface par l'intermédiaire de la classe javax.portlet.GenericPortlet.

V-A. Init (PortletConfig portletConfig):

Le conteneur invoque une seule fois cette méthode. Cet appel est réalisé lors de la création d'une instance du Portlet. L'objet javax.portlet.PortletConfig fourni à la méthode d'initialisation certains paramètres décris dans le fichier portlet.xml.

V-B. Render (RenderRequest rRequest, RenderResponse rResponse)

Cette méthode a pour responsabilité de générer le fragment de code HTML à partir des informations obtenues précédemment.

V-C. Destroy()

Lorsque le Portlet est retiré du portail le conteneur invoque cette méthode afin de libérer les ressources occuper par le Portlet.

VI. Mode et état d'un Portlet

VI-A. Mode

Un Portlet peut s'afficher de plusieurs manières différentes, c'est-à-dire en édition, en visualisation, en mode Aide.

Les modes énumérés précédemment sont les modes standard définis dans la spécification des Portlets.

Une implémentation par défaut est définie par la classe javax.portlet.GenericPortlet.

Le comportement standard de chaque mode peut-être redéfinit par la surcharge de chaque méthode.

VI-A-1. VIEW

Nom de la méthode : doView().

Ce mode est le standard d'affichage du Portlet.

VI-A-2. EDIT

Nom de la méthode : doEdit().

Ce mode permet de configurer le Portlet.

VI-A-3. HELP

Nom de la méthode : doHelp().

Ce mode permet d'afficher l'aide concernant le Portlet courant.

VI-B. États

Le Portlet peut prendre plusieurs états de la même façon qu'une fenêtre.

VI-B-1. CLOSE

Nom de la méthode : allowClose().

Cette méthode est consultée par le Portlet manager pour savoir si l'on peut autoriser la fermeture de la Portlet.

VII. Information diverses

VII-A. Les acteurs

Les Portlets sont des composants Java s'intégrant dans un portail. Ces composants sont issus d'une spécification : JSR168.

Rédigée par un ensemble d'acteur du marché, en voici la liste :

  • Apache Software Foundation ;
  • Bœing ;
  • Citrix Systems ;
  • IBM ;
  • SAP AG ;
  • TIBCO Software Inc ;
  • Art Technology Group Inc.(ATG) ;
  • Borland Software Corporation ;
  • EDS ;
  • Novell, Inc ;
  • SAS Institute Inc ;
  • Vignette ;
  • BEA Systems ;
  • Broadvision Inc ;
  • Fujitsu Limited ;
  • Oracle ;
  • Sybase.

Informations issues du site : Java Community Process.

VII-B. Les APIs

Actuellement, il existe plusieurs implémentations de la spécification JSR 168 :

  • Jakarta JetSpeed 1.3 home page ;
  • BEA : Web Logic Portal 4.0 home page ;
  • IBM : WebSphere Portal 6 home page ;
  • iPlanet : iPlanet Portal Server 3.0 ;
  • Oracle : Oracle 9i Portal ;
  • SAP Portal ;
  • Epicentric portal.

Certaines API (Jakarta Jetspeep, IBM, BEA) sont plus populaire !

VIII. Tutoriel

VIII-A. Prérequis

Ce tutoriel a pour but de montrer les différentes étapes pour implémenter et déployer un Portlet.

Nous aurons besoin, pour mettre en œuvre ce tutoriel, d'installer JBossPortal, ainsi que Netbeans 5.5 enrichi d'un plug-in dédié au développement des Portlets. Nous verrons l'installation de chacun des produits.

Je considére que vous avez un jdk1.4 minimum installé et correctement paramétré.

VIII-B. Installation de JBossPortal

VIII-B-1. Téléchargement

Il faut télécharger l'archive contenant le server ici.

Sur la page, il faut sélectionner la ligne suivante :

Image non disponible

Copier dans un répertoire nommé jbossPortal(par exemple) l'archive et décompresser là au même endroit.

JBossPortal : Documentation en ligne.

VIII-B-2. Démarrage et arrêt du serveur

À cette étape, vous devez avoir un répertoire nommé jbossPortal contenant un sous-répertoire nommé jboss-portal-2.4.1.

Pour démarrer le serveur, il faut ouvrir une console (ou un shell) selon votre environnement.

Placer vous dans le répertoire bin :

Image non disponible

Vous pouvez maintenant lancer la commande suivante pour démarrer le serveur :

Image non disponible

Selon la puissance de la machine, le démarrage du serveur peut prendre plus ou moins de temps.

Lorsque le démarrage est terminé, vous devriez voir cette ligne dans la console :

Image non disponible

Pour arrêter le serveur, il suffit de se placer dans la console ou le portail a été lancé et d'utiliser la séquence de touche CTRL + C.

Une fois le serveur arrêté, le système vous rend la main.

VIII-B-3. Vérification de l'installation

Pour vérifier que le serveur est correctement installé et a bien démarré taper dans votre navigateur préféré, l'URL suivante :

http://localhost:8080/portal

Après avoir validé, cette page devrait s'afficher dans votre navigateur :

Image non disponible

VIII-C. Installation de NetBeans

VIII-C-1. Téléchargement

Il faut télécharger le fichier d'installation de la version 5.5 ici.

Choisir le fichier d'installation selon l'environnement de votre machine.

Une fois l'environnement installé, il faut ajouté le plugin permettant la création de Portlet.

VIII-C-2. Installation du plugin

Pour faciliter la développement de Portlet, nous allons utiliser un plugin.

Il est téléchargeable ici.

Une fois l'archive du plugin téléchargé, extraire le contenu dans un répertoire temporaire.
Vous devriez trouver 3 fichiers :

Image non disponible

Nous allons maintenant installer le plugin dans l'IDE. Pour se faire, il faut démarrer NetBeans. Une fois démarrée, sélectionnez le menu Tools/Module Manager :

Image non disponible

Cet écran permet de gérer l'ensemble des plugins installés.

Sur cet écran cliquer sur le bouton Update.

L'écran suivant apparaît :

Image non disponible

Sur celui-ci, sélectionnez le radio bouton suivant :

Image non disponible

Ensuite cliquer sur le bouton next.

Sur cet écran cliquer sur le bouton Add.

Dans l'écran qui s'affiche, rechercher le répertoire temporaire ou le plugin a été dézipper et sélectionner les 3 fichiers portant l'extension *.nbm/

Image non disponible

Et valider par le bouton OK.

Vous devriez obtenir l'écran suivant :

Image non disponible

Cliquer deux fois sur le bouton next jusqu'à arriver sur l'écran suivant :

Image non disponible

Sélectionner les deux occurrences : Généric portlets et OpenSource PC :

Image non disponible

Et enfin sélectionner le bouton finish pour terminer l'installation du plugin.

La ligne suivante devrait normalement apparaître dans le module manager :

Image non disponible

Cliquer sur le bouton Close pour fermer l'écran du module manager.

VIII-D. Création du Portlet : HelloWorldPortlet

VIII-D-1. Création du projet : HelloWorldProject

Pour créer un projet de portlet, il faut sélectionner dans le menu file l'item new Project.

La fenêtre suivante apparaît :

Image non disponible

Sélectionner dans la fenêtre de gauche la ligne portlet applications, ensuite dans la fenêtre de droite sélectionner JSR-168 Portlet Application.

Voir ci-dessous :

Image non disponible

Cliquer sur le bouton next.

L'écran suivant apparaît :

Image non disponible

Dans le champ Project Name saisissez 'HelloWorldProject'.

Les autres champs n'ont pas besoin d'être modifié.

Vous pouvez lancer la création du projet en cliquant sur le bouton finish Une fois le traitement terminé, le projet suivant devrait apparaître sur la gauche de l'écran :

Image non disponible

Cette arborescence de projet contient 6 répertoires :

  • Web pages : contient les jsp correspondant aux différentes vues du Portlet ;
  • Configuration files : contient un pointeur sur les fichiers de configuration du Portlet ;
  • Server Resources : contient les ressources externes utiles au Portlet ;
  • Sources Packages : contient l'ensemble des classes Java composant le Portlet ;
  • Libraries : contient les différentes librairies du framework Portlet et autres librairies nécessaires au fonctionnement du Portlet ;
  • Tests Libraries : contient la librairie Junit permettant d'implémenter les tests à réaliser sur le Portlet.

Vous pourrez parcourir l'arborescence et retrouver les fichiers vus dans la première partie du document.

Création de l'archive de déploiement : HelloWorldProject.war

Pour créer le l'archive, le plugin met à disposition un script ANT permettant d'automatiser différentes tâches sur le Portlet.

Voici la démarche à suivre pour exécuter la tâche de déploiement.

Il faut sélectionner l'onglet Files :

Image non disponible

En sélectionnant cet onglet, on peut voir le fichier build.xml.

Sélectionner le fichier, rechercher dans la fenêtre en dessous la tâche dist.

Image non disponible

Faites un clic droit sur la balise, et sélectionne, dans le menu contextuel, l'item Run target :

Image non disponible

L'exécution de la tâche doit générer la trace suivante :

Image non disponible

Maintenant l'archive web est générée. Elle est disponible dans le répertoire dist de l'arborescence du projet.

Voyons dans la section suivante comment déployer le Portlet sur le serveur JBOSS Portal.

VIII-E. Déploiement et affichage du Portlet

VIII-E-1. Déploiement du Portlet

Le déploiement du Portlet peut se faire à chaud.

Il faut copier l'archive web générée précédemment dans le répertoire :

Jboss-portal-2.4.1/server/default/deploy.

Une fois le fichier copié, vous devriez voir cette ligne s'afficher dans la console du serveur :

Image non disponible

La Portlet est maintenant déployée sur le serveur.

Nous allons voir dans la section suivante comment paramétrer le portail pour l'afficher dans une page.

VIII-F. Paramétrage du portail

Dans cette section, nous verrons de manière pragmatique comment paramétrer le portail pour afficher le Portlet HelloWorldPortlet. Je ne rentrerai pas dans les détails sur les fonctionnalités et les possibilités de paramétrage de Jboss-Portal.

Ceci étant dit, place à l'action…

VIII-F-1. Création d'une page

Sur la page d'accueil, cliquer sur le lien Admin, il se trouve dans la partie en bas à gauche de l'écran.

Image non disponible

Vous devrez vous identifier. Les identifiants par défaut sont : admin - admin.

À l'écran vous pouvez voir plusieurs Portlets. nous allons nous concentrer sur le Portlet ci-dessous.

Image non disponible

Pour vérifier que le Portlet a été déployé correctement, sélectionner le lien instance puis aller à la fin de la liste.

Vous devriez voir sur la dernière ligne le Portlet HelloWorld.

Image non disponible

Nous allons créer maintenant une page, elle nous permettra d'afficher notre Portlet.

Pour se faire, cliquer sur le lien portal puis dérouler l'arborescence de la manière suivante :

Image non disponible

Ensuite cliquer sur la page pour obtenir l'écran suivant :

Image non disponible

Dans le champ New Page Name, saisissez le nom de la page : HelloWorldPage.

Et valider la saisie en cliquant sur le bouton AddPage

Voila l'écran que vous devriez obtenir :

Image non disponible

Cliquer sur le nom de la nouvelle page.

Image non disponible

VIII-F-2. Ajout de Portlets

Nous allons compléter cette page par des Portlets.

Nous allons ajouter dans un premier temps la Portlet de navigation. Elle permettra de naviguer facilement sur la page d'administration.

Dans la liste déroulante, sélectionner l'instance nommée NavigationPortletInstance et donner le nom navigation à cette instance.

Une fois l'écran suivant obtenu, cliquer sur le bouton Add navigation :

Image non disponible

Le Portlet devrait apparaître dans l'arborescence des pages comme fils de la page que nous avons créée.

Sélectionner l'instance dans l'arborescence.

Cliquer sur le lien thème, vous devriez obtenir cet écran :

Image non disponible

Modifier les listes déroulantes pour obtenir cet écran :

Image non disponible

Valider par le bouton Update.

En cliquant sur l'onglet HelloWorldPage, vous devriez obtenir cet écran :

Image non disponible

De la même manière que nous avons créée le Portlet Navigation.

Nous allons ajouter le Portlet HelloWorldPortlet.

Nous allons ajouter dans un premier temps le Portlet de navigation. Elle permettra de naviguer facilement sur la page d'administration.

Dans la liste déroulante, sélectionner l'instance nommée HelloWorld et donner le nom MyHelloWorldPortlet à cette instance.

Une fois l'écran suivant obtenu, cliquer sur le bouton Add Center.

Image non disponible

Le Portlet devrait apparaître dans l'arborescence des pages comme fils de la page que nous avons crée.

Vous pouvez maintenant cliquer sur le lien HelloWorldPage.

Vous devriez obtenir l'écran suivant :

Image non disponible

IX. Conclusion

Nous avons vu dans ce tutoriel comment créer et déployer un Portlet basic.

À partir de cet exemple, vous pourrez faire évoluer ce Portlet pour l'enrichir et mieux comprendre les mécanismes.

Si vous avez des questions vous pouvez me contacter, ou alors poser vos questions sur le Forum développement Web en Java.

X. Remerciements

Merci à ChristopheJ, zekey et Ricky81 qui ont eu la patience de relire et de commenter cet article.