|
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:
- Objectifs
- 1ère méthode : code Java
pur
- 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> </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();
}
%>
|
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.
|