Domino Références : Site francophone de ressources pour les développeurs Lotus Notes / Domino Domino Références
Site francophone de ressources pour les développeurs Notes/Domino
Annuaire Articles Forums Contact
Recherche
 
Mot exact résultats
Au Sommaire ...
Annuaire commenté des sites traitant de Lotus Notes/Domino
Articles d'actualité
Les forums de discussion
Une remarque, une critique, un encouragement. N'hésitez pas à me contacter.
The Team that meets in Forum.
Newsletter
email:   
s'abonner se désabonner 
Statistiques
 Stats du site

 

3. Programmer en JSP sous Domino
par Lionel

Programmer en JSP sous Domino


Article Précédent: Installer le serveur de JSP sous Domino

Dans le présent article, nous allons apprendre à comprendre et à développer une page JSP. Certes c'est moins utile que d'apprendre la recette du tiramisu et vous aurez certainement du mal à expliquer à votre tante Sophie que vous avez préféré passer du temps sur les JSP plutôt que sur la fameuse patisserie italienne. Bon d'un autre côté vous évitez des calories inutiles (non ne me remerciez pas).


Table des matières:

  1. Objectifs
  2. 1ère méthode : code Java pur
  3. Comprendre le code Java

 

1. Objectifs

L'objectif de cette première page est d'afficher la liste des 20 derniers sites publiés sur Domino Références. Bien évidemment, nous ne ferons aucune mise en page sophistiquée et le résultat retourné sera simplement un tableau avec quatre colonne : un numéro de ligne, la date de saisie du site dans DR, le titre du site en question et enfin un code exprimant la langue du site.

Nous allons commencer par la méthode la plus difficile : l'écriture de code Java dans la page HTML. Avant de pousser des hauts cris, sachez que je vais commenter chaque élément du code de manière à ce que tout le monde suive (même toi tata Sophie). L'autre méthode sera exposée par la suite et vous verrez qu'elle simplifie bien des choses.

Bien. Voici donc une copie de ce que l'on veut obtenir:

  Date Titre Code Langue
1 02/20/2002 DominoZone 1
2 02/20/2002 Editeur HTML 0
3 02/17/2002 NotesPOP3 1
4 02/12/2002 Notes Sauce 1
5 02/10/2002 Notes/Domino sur Amazon.fr 0

 

2. 1ère méthode : code Java pur

Vous trouverez ci-dessous le code de la page JSP. Les commentaires figurent à la suite, mais vous pouvez déja vous faciliter la lecture en vous aidant des reommandations suivantes :

  • Le code Java est surligné en jaune pâle
  • Les classes d'objets Lotus Domino et leurs méthodes apparaissent en bleu foncé
  • J'espère que vous n'êtes pas daltonien.

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<%@ page contentType="text/html; charset=UTF-8" import="lotus.domino.*,java.util.*" %>

<html>
<body>

<%
try {
NotesThread.sinitThread();
Session S = NotesFactory.createSession();
//
Database D = S.getDatabase ("", "admin/dr.nsf");
View V = D.getView ("last20");
ViewNavigator N = V.createViewNav();
Document Doc = null ;
//
int p = 0;
String DTitre;
String DCat;
Vector VDate;
DateTime DDate;
//
int MaxRows = 20;
//
String color1 = "lightgrey";
String color2 = "lightblue";
%>

<table cellspacing="1" cellpadding="2" border="0">

<tr bgcolor="grey">
<td>&nbsp;</td>
<td><font color="white">Date</font></td>
<td><font color="white">Titre</font></td>
<td><font color="white">Code Langue</font></td>
</tr>


<%
//
ViewEntry entry = N.getFirst();
while ((entry != null) & (p<MaxRows)) {
p++;
Doc = entry.getDocument();
//
VDate = Doc.getItemValue ("SiteDate");
DDate = (DateTime)VDate.elementAt(0);
DTitre = Doc.getItemValueString ("SiteTitre");
DCat = Doc.getItemValueString ("SiteLangue");
//
if ((p % 2) == 1) {
out.println ("<tr bgcolor=\"" + color1 + "\">");
} else {
out.println ("<tr bgcolor=\"" + color2 + "\">");
}
out.println ("<td>" + p + "</td>");
out.println ("<td>" + DDate.getLocalTime() + "</td>");
out.println ("<td>" + DTitre + "</td>");
out.println ("<td>" + DCat + "</td></tr>");
//
entry = N.getNext();
}
//
} catch (Exception e) {
e.printStackTrace();
} finally {
NotesThread.stermThread();
}
%>

</table>
</body>
</html>

Première constatation : en dehors du code surligné en jaune, on reconnaît bien les éléments constitutifs d'une page web. Nous sommes en terrain connu et on imagine bien les avantages que cela peut procurer : on va concevoir la page avec un logiciel spécialisé comme Dreamweaver et on n'aura plus aucun mal à appliquer la charte graphique de l'entreprise, aussi complexe soit-elle.

Vous remarquez ensuite que le code Java est inclus dans les balises <% et %>. Ce sont elles qui indiquent au serveur Tomcat qu'il faut interpréter leur contenu comme du code Java et non comme du code HTML.

Tout en haut de la page, nous trouvons une déclaration contenue dans les codes <%@ et %>. On y spécifie que le serveur de JSP doit utiliser les librairies Java de Domino. C'est le sens de import="lotus.domino.*,java.util.*".

Dans la page, j'ai scindé le code en deux parties distinctes bien que ce ne fut pas nécessaire. Au départ, il n'y avait qu'un seul bloc et j'ai simplement réarrangé le code pour le séparer en deux. Je l'ai fait pour vous montrer que (1) on peut écrire du code n'importe où, et que (2) les déclarations que l'on fait à un endroit sont valables partout ailleurs, ce qui allége considérablement le code.

Mais le grand avantage c'est que l'on va pouvoir utiliser nos objets Domino un peu partout : une vue A en haut à gauche, une vue B en bas à droite, un formulaire, etc ... et tout ça sur la même page ! (Note: je répète que l'on peut obtenir le même résultat avec des servlets ou des agents LotusScript ou Java).

3. Comprendre le code Java

Nous allons maintenant aborder la partie difficile : la compréhension du code Java. Je suis compréhensif et je veux bien que vous regardiez Star Academy pendant les explications (à condition que quelqu'un me fasse un résumé des moments les plus croustillants par la suite).

Je vous rappelle que les // représentent des commentaires et que les lignes d'instruction sont terminées par un ";". Les blocs d'instructions sont entourées par des accolades {}.

Le code Java commence par un bloc try/catch. Cette méthode permet de gérer les erreurs qui pourraient apparaître lors de l'ouverture de session. On appelle cela la gestion des exceptions.

try {
  NotesThread.sinitThread ();
  //le code ci dessous s'execute si tout va bien
   instruction 1
   instruction 2
   ...
   instruction n
} catch (NotesException e) {
  //le code ci dessous s'execute si tout va bien
   instruction 1b
   instruction 2
   ...
   instruction n
}

Dans l'exemple proposé, le bloc est coupé en deux en raison du choix que j'ai fait d'écrire mon code en deux endroits différents. Mais, je le répète pour ceux qui liraient distraitement cet article, je l'ai uniquement fait pour vous montrer que l'on peut faire apparaître le code en plusieurs endroits sans avoir à tout re-déclarer à chaque fois.

Nous allons nous intéresser à ce qui se passe dans la partie haute du bloc try/catch et vous allez voir que c'est très simple.

Tout d'abord, on ouvre une nouvelle session sur le serveur Domino:

NotesThread.sinitThread();
Session S = NotesFactory.createSession();

Cette session sera anonyme et c'est important de bien le comprendre. Si vous voulez vous authentifer sur le serveur Domino et donc utiliser ses droits d'accès , il vous faut activer la tâche DIIOP sur votre serveur (c'est ce que l'on appelle CORBA) et ajouter des arguments dans la méthode createSession : le nom du serveur, le nom d'utilisateur, et le mot de passe. On peut éviter de coder en dur ce genre d'informations (il faut écrire un formulaire et c'est un peu complexe), mais de toutes façons ne vous attendez pas à voir surgir la petite boîte de dialogue d'authentification.

Par la suite, nous allons déclarer notre base et notre vue en cours parce que nous allons faire un parcours de la vue "last20":

Database D = S.getDatabase ("", "admin/dr.nsf");
View V = D.getView ("last20");
ViewNavigator N = V.createViewNav();
Document Doc = null ;

Comme vous pouvez le constater, j'utilise un objet ViewNavigator qui va me servir à parcourir ma vue. En LotusScript je ne le ferais pas. Mais en Java, il en va tout autrement : les parcours de vue comportant de nombreux éléments peuvent poser de gros problèmes de mémoire. Et même si on utilise la méthode recycle() on n'arrange pas tout le temps le problème. Alors qu'avec le ViewNavigator, c'est tellement mieux ...

Ensuite, j'effectue un parcours de vue on ne peut plus classique :

ViewEntry entry = N.getFirst();
while ((entry != null) & (p<MaxRows)) {
  Instruction 1
  Instruction 2
  ...
  Instruction n

entry = N.getNext();
}

Vous remarquerez que j'ai ajouté une condition dans le While car je veux seulement récupérer les 20 premiers éléments (deuxième condition avec MaxRows).

Donc,je parcours la vue et je récupère l'entrée courante dans l'objet entry. La première chose que je veux faire c'est de récupérer les champs qui m'intéressent :

Doc = entry.getDocument();
//
VDate = Doc.getItemValue ("SiteDate");
DDate = (DateTime)VDate.elementAt(0);
DTitre = Doc.getItemValueString ("SiteTitre");
DCat = Doc.getItemValueString ("SiteLangue");

Comme vous pouvez le constater, je commence par utiliser l'objet Document associé à l'entrée. C'est plus facile et je suis plus habitué aux documents notes qu'aux entrées de vues.

Je récupère une date et deux champs texte. Comme d'habitude, avec les dates c'est un peu plus compliqué : il faut passer par un objet Vector (ici VDate) et ensuite récupérer le premier élément de cet objet dans un objet DateTime. C'est à ce moment précis qu'on se dit que LotusScript ce n'est finalement pas si mal.

Il ne reste plus qu'à afficher le résultat dans le navigateur :

C'est très simple. On utlise l'instruction Java out.println(chaine) pour écrire la chaîne de caractères chaine dans le navigateur. Et comme on veut mettre nos données dans un tableau, notre chaîne de caractère va comporter des éléments de HTML comme td ou tr par exemple. J'ai utilisé la méthode getLocalTime pour récupérer la date au format texte.

if ((p % 2) == 1) {
out.println ("<tr bgcolor=\"" + color1 + "\">");
} else {
out.println ("<tr bgcolor=\"" + color2 + "\">");
}
out.println ("<td>" + p + "</td>");
out.println ("<td>" + DDate.getLocalTime() + "</td>");
out.println ("<td>" + DTitre + "</td>");
out.println ("<td>" + DCat + "</td></tr>");

Vous pouvez noter au passage la petite astuce que j'utilise pour alterner la couleur des lignes. J'ai un compteur de ligne p, et en fonction du reste de la division de p par 2 (on appelle cela le modulo) j'utilise color1 ou color2 (déclarées en variables dans le code du haut).

Et voilà ! Vous pouvez accompagner le code ainsi obtenu d'une petite chantilly à l'amaretto ou de quelques boudoirs que vous aurez mis de côté pendant la préparation du tiramisu. On peut également remplacer le mascarpone par de la crême fraiche, mais ce n'est pas tout à fait pareil.


Ouf ! C'est terminé. C'était un peu difficile, mais il fallait le faire. Nous allons maintenant voir comment faire la même chose en plus simple avec les Custom Tags Domino.

 

Mise à jour: 18/09/2003
Conception: Lionel, 2001-2002