Programmation Orientée Objet et Réseau en Java

Servlets avec Tomcat

Exercice 1 - Installation de Tomcat

Installer Tomcat, le serveur de servlets et de JSP du projet Jakarta. Pour cela, il suffit de télécharger l'archive disponible à la page http://www-igm.univ-mlv.fr/~duris/JAKARTA/
et de suivre les indications données par cette page.
Vérifier que le serveur démarre correctement sur http://localhost:8080 et tester quelques uns des exemples disponibles. Accédez également à la documentation des API des servlets.

Exercice 2 - La servlet qui dit bonjour

Dans le répertoire d'installation (disons JAKARTA_HOME), créer une nouvelle application web de nom tdservlet revient à créer un nouveau répertoire sous webapp, soit ${JAKARTA_HOME}/webapp/tdservlet). À l'intérieur de ce répertoire tdservlet, créer un sous-répertoire WEB-INF qui contient lui-même un sous répertoire classes.

Dans le répertoire classes, écrire une classe servlet Bonjour héritant de la classe javax.servlet.http.HttpServlet. Cette classe doit redéfinir la méthode doGet() de sorte qu'elle écrive, sur le flot de sortie associé à la réponse, une page HTML contenant "Bonjour" écrit en gras. Compiler ce source par
javac -classpath ${JAKARTA_HOME}/common/lib/servlet.jar:. Bonjour.java

Afin de vérifier si elle fonctionne, il faut placer un fichier de nom web.xml dans le répertoire WEB-INF, qui spécifie l'association entre les classes, les noms et les URL permettant d'accéder aux servlets. Par exemple, en vous inspirant du fichier web.xml de la webapp examples, associer le nom hello à la classe Bonjour (élément <servlet>), et associer à ce nom hello les URL /bonjour et /hi (éléments <servlet-mapping>).

Vérifier le fonctionnement en accédant dans un navigateur aux deux URL
      http://localhost:8080/tdservlet/bonjour
      http://localhost:8080/tdservlet/hi
    

Remarque: pour éviter d'arrêter et de redémarrer le serveur à chaque modification pour qu'elle soit prise en compte, il est possible d'utiliser le manager de Tomcat. Pour cela, il faut ajouter, dans le fichier conf/tomcat-users.xml, un role de nom manager et un user qui dispose du droit manager. Une fois ceci fait, on peut accéder dans la partie Administration au lien Tomcat Manager, à partir duquel on peut recharger à chaud une webapp.

Exercice 3 - Instances de servlets

Dans le fichier Bonjour.java, ajouter une variable d'instance count (initialisée à 0 qui compte le nombre de fois où la servlet a été appelée (incrémentée dans la méthode doGet()). Modifier le contenu de la page retournée par la servlet afin de visualiser ce nombre. Tester votre servlet avec différents chemins (<servlet-mapping>) et avec différents noms de servlets (<servlet-name>). Qu'en concluez vous? Vous pourrez faire afficher à la servlet le hashcode de son instance pour confirmer votre intuition.

Exercice 4 - Initialisation de servlets

Si le serveur est arrêté puis redémarré, ou bien la webapp rechargée, de nouvelles servlets sont instanciées et leur compteur est donc réinitialisé à 0.

Pour permettre de conserver un historique, une solution consiste à sauver la valeur du compteur à chaque fois que ce nombre est modifié.

  1. Pour cela, la servlet doit tout d'abord récupérer le nom d'un fichier au moment de l'instanciation. Ce nom peut être précisé dans le fichier web.xml grâce à l'élément <init-param> (cf. web.xml de la webapp examples). La valeur de ce paramètre peut ensuite être récupérée dans la servlet, par redéfinition de la méthode init(ServletConfig config), via la méthode getInitParameter() sur l'instance de ServletConfig reçue en argument.
  2. Il faut ensuite modifier le contenu du fichier lors de chaque accès à la page (attention à la concurrence).

Exercice 5 - Utilisation de formulaire

Écrire un formulaire statique form.html (dans un fichier HTML, placé dans le répertoire tdservlet de la webapp), permettant à un client de préciser son nom qu'il désire voir afficher après "Bonjour" dans la page retournée par une nouvelle servlet Perso, via l'URL /perso. Le bouton de soumission du formulaire sera pour l'instant associé à la servlet avec la méthode GET.

Faire alors en sorte que la servlet Perso retourne une page contenant Bonjour toto si le formulaire a été rempli avec le nom toto. Pour cela, on pourra récupérer ce nom grâce à la méthode getParameter() appliquée à l'instance de HttpServletRequest reçue en argument de doGet().

Comment faire pour que cela fonctionne encore si la méthode utilisée pour l'envoi du formulaire est désormais POST?

Exercice 6 - Distribution de servlets

Étant donné le contexte d'exécution une servlet, il est possible de récupérer un objet implémentant l'interface RequestDispatcher, par les appels de méthodes getServletContext().getRequestDispatcher(cible). Sur l'objet obtenu, qui enveloppe la servlet cible ou bien une ressource statique, on peut appeler les méthodes include() ou forward(), qui délèguent une partie ou tout le traitement de la requête à la servlet cible.

Ajoutez au formulaire form.html de l'exercice précédent un champ permettant de spécifier combien de fois le client veut se voir dire bonjour, et faire en sorte que l'action associée à ce formulaire soit un POST émis vers l'URL /combien appelant une nouvelle servlet Combien. Lorsqu'elle est accédée par un GET, la méthode doGet() cette dernière se contente de déléguer la génération de la réponse à l'URL /form.html, c'est-à-dire le fichier HTML statique proposant le formulaire. En revanche, lorsque ce formulaire est soumis, c'est sa méthode doPost() qui est sollicitée: cette dernière appelle alors plusieurs fois (le nombre spécifié dans le formulaire) l'inclusion du résultat de l'appel à la servlet d'URL /perso (on prendra soin de modifier cette dernière servlet pour qu'elle n'affiche qu'un seul paragraphe de document HTML, l'en-tête et la fin du document étant à la charge de la servlet Combien.


Nicolas.Bedon[at]univ-mlv.fr - Etienne.Duris[at]univ-mlv.fr - Rémi.Forax[at]univ-mlv.fr - © Université de Marne-La-Vallée - Février 2003