P
'
t
i
t
e
C
h
a
t
t
e
 
spacer~ WAR DOES NOT DETERMINE WHO IS RIGHT, WAR DETERMINE WHO IS LEFT Articles | Connexion
 
~Les sessions en JSP

Précédent  
  JSP  
  Suivant
 Présentation

La réalisation d'un site Internet dynamique repose énormément sur le principe de passage de données d'une page à l'autre. Nous allons étudier dans cet article comment procéder en JSP.
 Sommaire

8. Annexe

 Introduction

Lors de notre article précédent nous avons appris comment insérer du code JSP dans la page d'un site Internet. Nous avons également découvert qu'il existait trois manières de déposer du code Java dans une telle page. Avant de nous pencher sur les méthodes de passage d'informations entre deux pages, voyons comment sont interprétées les directives JSP par Tomcat.


 Compilation des pages

Un serveur tel que Tomcat contient un compilateur de pages JSP. Ce compilateur va, quand une page est demandée par un client, reformuler le contenu d'une page avant d'écrire un code source Java complet. Une fois rédigé, ce code source sera compilé comme vous le feriez pour votre propre programme. Le bytecode résultant est ensuite placé dans un répertoire cache afin d'accélérer les traitements ultérieurs.

Ce répertoire se nomme work/ pour Tomcat. L'un des inconvénients de ce cache tient au fait que parfois, Tomcat ne recompilera pas votre code source modifié. En cette occasion vous devrez supprimer vous-mêmes le bytecode du répertoire cache. La situation classique provoquant ce problème est l'inclusion d'un fichier que l'on modifie par la suite.



Compilation d'une page JSP

Reprenons l'exemple "Hello World !" du précédent article. Si vous étudiez le cache, vous trouverez un fichier nommé "work/localhost/helloworld/index$jsp.java". Editons maintenant ce fichier. Ce dernier contient de nombreuses lignes de la forme:

// HTML // begin [file="/index.jsp";from=(0,0);to=(3,6)]
out.write("<html>\r\n  <body>\r\n    <center>\r\n      ");
       
      
JextCopier dans Jext | Jext | Plugin Codegeek
Ces lignes correspondent au code HTML écrit dans le fichier JSP. Notre code Java est lui directement ajouté dans le corps de la méthode:

out.print( request.getContextPath() );
       
      
JextCopier dans Jext
Que se passerait-il si nous décidions d'employer la balise de declaration <%! %> de la sorte ?

<%! String login = "Login: le magazine"; %>
       
      
JextCopier dans Jext
Pour répondre à cette question il suffit d'ouvrir à nouveau le fichier index$jsp.java après avoir ouvert l'adresse http://localhost:8080/helloworld dans votre navigateur. Suivant immédiatement la déclaration de la classe se trouve ces lignes:

// begin [file="/index.jsp";from=(3,9);to=(3,38)]
String login = "Login: le magazine";
       
      
JextCopier dans Jext
Ces études nous mènent à la conclusion suivante: les balises <%! %> permettent de préciser les champs de la classe de la page et les balises <% %> (ou <%= %>) à écrire le contenu de la méthode appelée lors de la distribution de la page. Constatons également que de telles constructions sont permises:

<% if (test) { %>
  <br>Test réussi
<% } else { %>
  <br>Test raté
<% } %>
       
      
JextCopier dans Jext
Nous avons à disposition un moyen élégant et pratique d'écrire des données dans la page.


 Méthodes utilisateur

Connaissant la location du code introduit par les balises <%! %> et <% %>, comment devons-nous, à votre avis, déclarer une méthode interne à la page ? Simplement dans la balise de déclaration.

<%!
public String getAnswerToLifeTheUniverseAndEverything() {
 return "42";
}
%>
       
      
JextCopier dans Jext | Jext | Plugin Codegeek
Considérez par ailleurs que le modificateur de visibilité de la méthode n'a pour ainsi dire aucune espèce d'importance. Une méthode déclarée de la sorte pourra ensuite se voir appelée à l'intérieur d'une balise d'instruction. La balise de déclaration a ceci de magique que l'on peut l'employer en tout point du code source JSP sans aucune incidence sur le comportement de la page. Nous pouvons tout à fait émettre un appel à la méthode foo() dont la déclaration se situera en fin de fichier.


 Passage d'informations

La technologie des Java Server Pages offre trois manières de transmettre des informations d'une page à l'autre. Pour ce faire, trois instances de classe sont accessibles par défaut dans les pages JSP: request, session et application. Le premier objet, request, permet de lire des informations transmises à la page par les méthodes GET et POST. Voici un exemple de résolution de transmission GET. Tout d'abord le lien:

<a href="next.jsp?Arthur=Accroc">Page suivante</a>
       
      
JextCopier dans Jext | Jext | Plugin Codegeek
Ensuite voici le contenu de la page next.jsp:

<%= request.getParameter("Arthur") %>
       
      
JextCopier dans Jext
La méthode getParameter() sert à d'afficher la valeur associée à une clé. Ici la clé est "Arthur" et la valeur "Accroc". La résolution de formulaires se fait grâce à l'objet request. La valeur de chaque champ d'un formulaire se voit transmise en POST avec la condition suivante: clé = nom du champ, valeur = valeur du champ. Un exemple:

<form action="next.jsp" method="POST">
   Nom: <input type="text" name="nom" />
   <input type="submit" name="formSubmit" value="ok" />
 </form>
       
      
JextCopier dans Jext
La page next.jsp pourra lire la valeur entrée grâce à request.getParameter("nom"). L'objet request contient plusieurs méthodes rendant la gestion des paramètres plus aisée. La méthode getParameterMap() renvoie un tableau à clé des paramètres, getParameterNames() retourne une énumération de tous les noms de paramètres contenus dans la requête et ainsi de suite...


 La session

L'objet session forme un objet propre à chaque visiteur du site. Cet objet est actif tant que l'utilisateur n'a pas quitté le site ou que le programmeur ne l'a pas désactivé par le biais de l'instruction session.invalidate() (ce que l'on fait lorsqu'un utilisateur entre un mauvais mot de passe par exemple). La durée d'inactivité dirigeant l'invalidation de la session se spécifie dans le fichier de configuration web.xml de Tomcat.

Pour placer une information (une instance de classe Java) en session le programmeur doit utiliser la méthode setAttribute(String cle, Object valeur). Sur un site proposant une page de login nous stockerons par exemple le nom de l'utilisateur et son mot de passe dans l'objet session:

session.setAttribute("login", userLogin);
session.setAttribute("password", userPassword);
       
      
JextCopier dans Jext | Jext | Plugin Codegeek
Ces deux informations deviendront alors accessibles sur chaque page visitée sur le site. Ceci permet de vérifier la validité du mot de passe sur chacune des pages, rendant alors impossible l'accès au site sans passer par la page de login. Reportez-vous aux fichiers index.jsp et next.jsp pour découvrir un exemple d'une telle utilisation.


 L'application

Le dernier objet de notre étude se nomme application. Celui-ci fonctionne, du point de vue stockage des informations, de la même manière que l'objet session. Néanmoins, cet objet est commun à tous les utilisateurs visitant le site. Cet objet est créé lors du démarrage de l'application, autrement dit lors du premier accès à une page quelconque du site par un utilisateur. Un emploi possible peut être un compteur de visiteurs actuellement sur le site. Nos connaissances ne nous permettent pas encore de réaliser une telle chose. La notification de fin de session d'un utilisateur est requise. Or cela n'est envisageable qu'à l'aide d'un JavaBean.


 Class-ieux

Pour finir, voici un petit avant-goût de ce qui nous attend au cours des prochains épisodes de cette saga JSP. Le fichier exemple classe.jsp vous propose un exemple d'utilisation de classes Java au sein de pages JSP. La classe utilisée se trouve, ainsi que son code source, au sein du répertoire Web-inf/classes. Notre nouvel exemple fait appel à la balise de directive pour importer la classe.


 Annexe

Télécharger l'exemple de l'article.



par Romain Guy
romain.guy@jext.org
http://www.jext.org
Dernière mise à jour : 14/10/2006


Précédent  
  JSP  
  Suivant

 
#ProgX©2005 Mathieu GINOD - Romain GUY - Erik LOUISE