TP2 : Etude des servlets

De $1

Version de 17:31, 29 Avr 2024

cette version.

Revenir à liste des archives.

Voir la version actuelle

Introduction

Ce TP est consacré à l'étude des servlets. Nous allons étudier des exemples en Java EE 5 (où de nombreux éléments sont indiqués dans le descripteur web.xml, comme le mapping des servlets sur des URLs), mais aussi des exemples en Java EE 6 où les annotations de code sont omniprésentes.

Etude d'un projet contenant de nombreux exemples J2EE 1.4

Oui, il s'agit d'exemples en J2EE 1.4 (l'ancêtre de Java EE 5, lui-même ancêtre de Java EE 6 !). Ils sont toujours d'actualité, les seules choses qui peuvent changer en Java EE 6 sont les annotations de code qui permettraient de se passer d'une partie de ce qui est spécifié dans le descripteur web.xml (nous allons l'étudier un peu plus tard...)

Ouverture du projet

Sous netbeans, faites file/nouveau projet, puis choisissez dans les exemples le projet suivant :

Snap1.jpg

Cela va ouvrir dans netbeans un projet Java web contenant de nombreux exemples :

Snap3.jpg

Lancer le projet, tester les exemples, regarder le code source

Faites clic droit / run sur le projet, cela va ouvrir une page avec la liste des exemples de servlets que vous allez étudier. Regardez l'exécution, les URLs, et le code source.

Regardez aussi le vrai code source des servlets (dans le package par défaut, sous "src").

Notez au passage la manière dont l'aspect "multi-langue" est géré (à l'aide de fichiers de propriétés et de la classe ResourceBundle) :

 

ResourceBundle rb = ResourceBundle.getBundle("LocalStrings",request.getLocale());

Cette ligne indique que l'on ira chercher les "ressources" dans un fichier LocalStrings.properties par défaut, contenant des couples clé=valeur. Selon la langue du système, on ira chercher dans un fichier LocalStrings_fr.properties, LocalStrings_es.properties, LocalStrings_en.properties, etc le fichier de base étant celui par défaut.

Puis ensuite, lorsqu'on veut manipuler une chaine de caractères pour l'affichage : 

String title = rb.getString("helloworld.title");

On retrouvera la valeur de cette chaîne de caractère dans le fichier LocalStrings_fr.properties si on est en français. Double cliquez sur le nom du fichier pour voir son contenu :

 

helloworld.title=Salut le Monde!

requestinfo.title=Exemple d''information sur la requête
requestinfo.label.method=Méthode:
...

Regardons la partie "servlets" du fichier de configuration web.xml

Double cliquez sur le fichier web.xml qui se trouve sous "configuration". Netbeans doit ouvrir une "vue" de ce fichier, vous pouvez en cliquant sur le bouton "XML" passer à la vue XML du fichier. Il contient de nombreuses informations. Pour le moment, nous allons nous intéresser à la partie "servlets", notamment au mapping entre les servlets et les URLs qui permettent de les invoquer.

Vue "servlet" du fichier web.xml :

Snap5.jpg

 Comme vous pouvez le voir, on peut utiliser des expressions régulières pour associer non pas un URL à une servlet, mais aussi plusieurs ! Ici la servlet RequestInfoExample est associée à tous les URLs de type /servlet/RequestInfoExample/*

Executez donc cet exemple, et modifiez l'URL, par exemple en ajoutant "toto" à la fin :

Snap6.jpg

Regardez dans le source comment on peut récupérer le "/toto". Cet exemple montre comment on peut par exemple, développer une Servlet qui utilise l'URL complet pour un paramètre permettant par exemple d'aller chercher "toto" dans une base de données. Imaginez : http://www.monsite.com/disques/Beatles/AbbeyRoad, et une unique servlet "disques" qui saura à partir de cet URL aller chercher le disque "Abbey Road" des Beatles dans sa base de données.

Modification de la page d'accueil par défaut du projet

Lorsqu'on exécute le projet il affiche la page par défaut du projet. On peut préciser quelle est cette page dans le descripteur web.xml, on peut même en indiquer plusieurs (si la première n'existe pas, c'est la seconde qui sera utilisée, etc.). Par défaut, c'est la page index.html qui est affichée. Les pages web se situent sous "Web Pages" dans la structure de projets de netbeans. 

  1. Modifiez maintenant cette page pour que cela soit le fichier reqinfo.html qui soit affiché par défaut (on doit voir le source de l'exemple du screenshot précédent s'afifcher),
  2. Modifiez maintenant la page par défaut pour que cela soit la servlet HelloWorldExample qui soit affichée (cela doit afficher non pas le source mais l'exécution de la servlet, soit le message "Salut le monde !"

NOTE : il se peut que vous deviez faire shift-reload sur votre navigateur pour que la page s'affiche réellement, cela dépend des navigateurs et des options de cache.

Positionnement de paramètres "globaux" à l'application dans le web.xml ("context parameters")

Nous allons maintenant utiliser le fichier web.xml pour positionner des paramètres "globaux" à l'application. On les appelle des "Context Parameters". Vous allez, dans le fichier web.xml, positionner un de ces paramètres, que vous appellerez par exemple SMTP_server (cela peut être utile si vous écrivez une application qui envoie des mails). Vous lui donnerez comme valeur "smtp.google.com".

Pour cela, double cliquez sur le fichier web.xml et utilisez l'onglet "general" pour positionner ce paramètre. Nous allons voir que l'on peut récupérer ces paramètres :

  1. soit au tout début de l'exécution de notre application web (la première fois qu'elle est lancée), dans une classe qui implémente "ContextListener",
  2. soit dans la méthode init() d'une servlet, exécutée lors de la première invocation d'une servlet.

Snap8.jpg

Une fois le paramètre positionné, ouvrez le fichier ContextListener.java et regardez un peu le code, nous allons nous intéresser plus particulièrement à la méthode contextInitialized() située à la fin... et nous allons ajouter deux lignes pour afficher la valeur du paramètre :

 

public void contextInitialized(ServletContextEvent event) {
    this.context = event.getServletContext();
      String smtpServer = context.getInitParameter("SMTP_server");

     log("contextInitialized()");

      log("SMTP SERVER = " +smtpServer);
    }

Nous allons observer ce qu'il se passe dans la console du serveur. Au passage, c'est là qu'apparaissent les erreurs s'il y en a, il faudra prendre l'habitude de l'utiliser ! Pour commencer, effaçons son contenu :

Snap11.jpg

Executons maintenant le programme et regardons à la loupe la trace dans la console :

Snap12.jpg

Habituellement, dans un contextListener, on "prépare les choses", en gros, on récupère un gros paquet de paramètres et on fait des initialisations globales à partir de ces paramètres... on crée de nouveau objets que l'on ajoute dans le servletContext (avec setAttribute). Un exemple concret : on écrit un CMS qui va utiliser de nombreux chemins sur le disque, pour gérer les images, les vidéos, les pages, etc. On va lire tous ces chemins, créer un objet de type PathManager, instance d'une classe à vous, avec des getPathForVideos() etc... et on va rajouter l'instance de ce PathManager dans le contexte. Dans n'importe quelle servlet qui devra utiliser ces chemins, dans sa méthode init() elle récupèrera dans le contexte une référence sur le PathManager et la conservera dans une variable qui sera utilisée pendant toute la durée de vie de la servlet.

Exemple de code dans une servlet qui récupère le paramètre SMTP_server (ici dans la servlet SessionExample.java)

 

public class SessionExample extends HttpServlet {
    String smtpServer = "";

    public void init() {        smtpServer = getServletContext().getInitParameter("SMTP_server");        System.out.println("Dans la Servlet SessionExample.java : SMTP Server = " + smtpServer);    }...

Faites donc cette modification puis exécutez la servlet, et regardez les traces du serveur comme précédemment.

Utilisation de paramètres d'initialisation d'une Servlet (les "init parameters")

Il est possible de passer des paramètes aux servlets, qui seront récupérables de la même manière que les paramètres globaux, sauf que cette fois-ci ils seront propres à une servlet. On utilise pour cela l'onglet "Servlet" de l'éditeur de fichier web.xml. Ajoutez donc un paramètre dans une des servlets du projet et récupérez-le dans une méthode init() de cette servlet, que vous écrirez. Executez le projet et regardez la trace.