Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi Eclipse MS-Office SQL & SGBD Oracle  4D  Business Intelligence
FORUMS JAVA FAQs TUTORIELS JAVASEARCH SOURCES LIVRES OUTILS, EDI & API ECLIPSE NETBEANS BLOG DISCUSSIONS TV

Portlets - JSR168

Date de publication : 14/03/2007

Par Fabrice SZNAJDERMAN (autres articles)
 

Cet article est une première approche du concept des Portlets. Il permet d'avoir une vision générale sur le fonctionnement , l'architecture et les objectifs de ces composants.

1. Intoduction
1.1. Définition d'un portlet
1.2. Qu'est ce qu'un Portail?
1.3. Objectif
2. Portlet et Servlet
2.3. Les points communs
2.4. Les points de divergences
3. Description d'un portlet
3.1. Arborescence des fichiers
3.2. le fichier portlet.xml
4. Le cycle de vie d'un portlet
4.1. Phase d'initialisation
4.2. Diagramme de séquence
5. Les méthodes
5.1. Init (PortletConfig portletConfig):
5.2. render (RenderRequest rRequest, RenderResponse rResponse)
5.3. destroy()
6. Mode et état d'un portlet
6.1. Mode
6.1.1. VIEW
6.1.2. EDIT
6.1.3. HELP
6.2. Etats
6.2.1. CLOSE
7. Information diverses
7.1. Les acteurs
7.2. Les APIs
8. Tutorial
8.1. Pré-requis
8.2. Installation de JBossPortal
8.2.1. Téléchargement
8.2.2. Démarrage et arrêt du serveur
8.2.3. Vérification de l'installation
8.3. Installation de NetBeans
8.3.1. Téléchargement
8.3.2. Installation du plugin
8.4. Création du portlet : HelloWorldPortlet
8.4.1. création du projet : HelloWorldProject
8.4.2. Création de l'archive de déploiement : HelloWorldProject.war
8.5. Déploiement et affichage du portlet
8.5.1. Déploiement du portlet
8.6. Paramétrage du portail
8.6.1. Création d'une page
8.6.2. Ajout de portlets
9. Conclusion
10. Remerciements


1. Intoduction


1.1. 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.


1.2. 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 contenus.

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.


1.3. 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.


2. 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.


2.3. 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.

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.
  • A 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éré un état et un mode d'affichage (notion décrit plus bas).
  • Plusieurs instance 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 forcement exhaustives, elles donnent un aperçue des règles à avoir à l'esprit lors du développement de portlet.


3. Description d'un portlet


3.1. 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.


3.2. 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 du 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

4. 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é. A chaque méthode incombe une responsabilité bien définie. Les paragraphes suivants décrivent différentes phases du cycle de vie d'un portlet.


4.1. Phase d'initialisation

Cette phase se charge de lire et de mettre à disposition les paramètres déclarés dand le fichier xml de déploiement du portlet.


4.2. 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 aggréger, 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 :


5. 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


5.1. 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.


5.2. 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.


5.3. destroy()

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


6. Mode et état d'un portlet


6.1. 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.


6.1.1. VIEW

Nom de la méthode: doView()
Ce mode est le standard d'affichage du portlet.


6.1.2. EDIT

Nom de la méthode: doEdit()
Ce mode permet de configurer le portlet.


6.1.3. HELP

Nom de la méthode: doHelp()
Ce mode permet d'afficher l'aide concernant le portlet courant.


6.2. Etats

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


6.2.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.


7. Information diverses


7.1. Les acteurs

Les portlets sont des composants Java s'intégrant dans un portail. Ces composants sont issues d'une spécification : JSR168
rédigée par un ensemble d'acteur du marché, en voici la liste :

  • Apache Software Foundation
  • Boeing
  • 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
info informations issues du site : Java Community Process

7.2. 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!


8. Tutorial


8.1. Pré-requis

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

Nous aurons besoin, pour mettre en oeuvre ce tutorial, 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é.


8.2. Installation de JBossPortal


8.2.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 :


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

JBossPortal :Documentation en ligne


8.2.2. Démarrage et arrêt du serveur

A 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 :



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



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 :




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.


8.2.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 valider, cette page devrait s'afficher dans votre navigateur :





8.3. Installation de NetBeans


8.3.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.


8.3.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 :




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



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

Sur cet écran cliquer sur le bouton Update
L'écran suivant apparait :



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



Ensuite cliquer sur le bouton next

L'écran suivant s'affiche :



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



Et valider par le bouton OK
Vous devriez obtenir l'écran suivant :



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



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



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

La ligne suivante devrait normalement apparaitre dans le module manager



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


8.4. Création du portlet : HelloWorldPortlet


8.4.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 apparait :



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 :



Cliquer sur le bouton next
L'écran suivant apparait :



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 apparaitre sur la gauche de l'écran :





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 vues dans la première partie du document.


8.4.2. 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 :



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.



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



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



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.


8.5. Déploiement et affichage du portlet


8.5.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 :





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.


8.6. Paramétrage du portail

Dans cette section, nous verrons de manière pragmatique comment paramétrer le portail pour afficher la 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...


8.6.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.



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

A l'écran vous pouvez voir plusieurs portlets. nous allons nous concentrer sur le portlet ci-dessous.



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 la portlet HelloWorld.




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 :




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




Dans le champ New Page Name saisisser le nom de la page : HelloWorldPage.
Et valider la saisie en cliquant sur le bouton AddPage
Voila l'écran que vous devriez obtenir :



Cliquer sur le nom de la nouvelle page.





8.6.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



Le portlet devrait apparaitre 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 :



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



Valider par le bouton Update
En cliquant sur l'onglet HelloWorldPage, vous devriez obtenir cet écran :




De la même manière que nous avons créer le portlet Navigation
Nous allons ajouter le portlet HelloWorldPortlet.
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 HelloWorld et donner le nom MyHelloWorldPortlet à cette instance.
Une fois l'écran suivant obtenu, cliquer sur le bouton Add Center



Le portlet devrait apparaitre 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 :





9. Conclusion

Nous avons vu dans ce tutorial comment créer et déployer un portlet basic.
A 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.


10. Remerciements

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



Valid XHTML 1.1!Valid CSS!

Copyright @ 2007 - Fabrice SZNAJDERMAN . Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérets.
Responsables bénévoles de la rubrique Java : Eric Siber et Baptiste Wicht - Contacter par EMail :
Vos questions techniques : forum d'entraide Java - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.