:: Enseignements :: Master :: Master TTT :: 2008-2009 :: Programmation Réseaux en Java ::
[LOGO]

Servlets avec TOMCAT


Exercice 1 - Installation de TOMCAT

Tomcat, le serveur de servlets et de JSP du projet Jakarta, est déjà "installé" sur le serveur de vos comptes, mais nécessite de créer un répertoire sur vos machines. Au premier lancement de la commande tomcat start un répertoire MY_CATALINA_HOME est créé sur votre compte.

Important : vous n'oublierez pas avant de vous déloger d'arrêter le serveur avec la commande tomcat stop

Vérifier que le serveur a correctement démarré en accédant depuis un navigateur à l'URL http://localhost:8080/. Testez les exemples de servlets et de JSP. Accédez également à la documentation, et en particulier aux javadoc des APIs des servlets et des JSP.

Exercice 2 - La servlet qui dit bonjour

La documentation qui est accessible lorsque le serveur tourne (http://localhost:8080/tomcat-docs/) décrit des bonnes pratiques de développement et de déploiement des applications web. En particulier, elle préconise de stocker les "sources" de développement dans un répertoire différent de celui qui est utilisé par Tomcat pour "servir" l'application Web correspondante. Le "passage" entre répertoire de développement et le répertoire d'"exploitation", ainsi que toutes les phases de compilation, pourront être prises en charge par l'outil ant à l'aide d'un fichier build.xml dont la trame est donnée dans la documentation ici.

  • En guise de répertoire de développement, créez un répertoire TDbasic sur votre compte (ailleurs que dans le répertoire MY_CATALINA_HOME). Dans ce répertoire, créez trois répertoires (comme décrit dans la section 3- First webapp du guide utilisateur de la documentation) :
    • TDbasic/docs contiendra toute documentation utile
    • TDbasic/src contiendra les classes de vos servlets
    • TDbasic/web contiendra toute la partie "configuration" de votre application web. Plus particulièrement, sous ce crépertoire, créez les répertoires TDbasic/web/WEB-INF/ et TDbasic/web/WEB-INF/classes/
  • Dans le répertoire TDbasic/web/WEB-INF/, copiez le fichier d'exemple de configuration web.xml qui est fourni par la documentation, et modifiez le afin d'associer d'une part, le nom de servlet bonjour à la classe fr.umlv.ttt.servlet.Bonjour (en utilisant un élément <servlet>), et d'autre part le nom de servlet bonjour au pattern URL /hello (en utilisant un élément <servlet-mapping>) ;
  • Dans le répertoire TDbasic/web, créer un fichier d'accueil index.html qui propose un lien permettant d'accéder à la servlet via son nom /hello ;
  • Dans le répertoire TDbasic/src, créer le fichier contenant le source Java : TDbasic/src/fr/umlv/servlet/tdbasic/Bonjour.java (inspirez vous des exemples pour le code) ;
  • Pour pouvoir compiler ce source, de même que pour pouvoir réaliser toutes les opérations de déploiement, copiez à la racine du répertoire TDbasic le fichier de configuration ant donné en exemple dans la documentation build.xml, et modifiez le pour l'adapter à votre cas (les principales modifications concernent le manager : voir la partie Custom Ant Task Definition)
  • Vérifier que votre configuration est correcte en faisant des compilations, installations, suppressions, etc. (la liste des cibles de ant est obtenue par ant -projecthelp).

Exercice 3 - Configuration de l'application Web et instances de servlets

À partir du fichier Bonjour.java, créer une nouvelle classe TDbasic/src/fr/umlv/servlet/tdbasic/SimpleCounter.java en ajoutant un champ count (initialisé à 0) qui compte le nombre de fois où la servlet a été appelée (incrémenté dans la méthode doGet()).
  • Modifier le contenu de la page retournée par la servlette afin de visualiser ce nombre.
  • Dans le fichier web.xml, créer deux nouveaux éléments <servlet>, l'un de nom compteurA et l'autre de nom compteurB, tous les deux associés à la classe fr.umlv.servlet.tdbasic.SimpleCounter.java.
  • Par ailleurs, créer quatre éléments <servlet-mapping> : associer les URL /compteA et /compteAbis au nom de servlet compteurA, et les URL /compteB et /compteBbis au nom de servlet compteurB.
  • Mettre à jour le fichier index.html pour qu'il permette d'accéder à ces différents URLs, et tester l'évolution des différents compteurs. Qu'en déduisez vous sur l'existance des instances de servlet ?

Exercice 4 - Initialisation de servlets

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

Pour permettre de conserver un historique, une solution consiste à sauvegarder la valeur du compteur dans un fichier. Ce peut être fait à chaque fois que ce nombre est modifié ou bien lorsque la servlet est arrêtée.
  • 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, dans la méthode init(ServletConfig config), via la méthode getInitParameter() sur l'instance de ServletConfig reçue en argument (penser à appeler super.init(config)).
  • Pour effectuer une action à réaliser lors de la destruction de la servlet, il est possible de le spécifier dans la méthode destroy().
  • Lors de la modification du contenu du fichier lors de chaque accès à la page, il faut faire attention à la concurrence.
Tester ces fonctionalités.

Exercice 5 - Utilisation de formulaire

Écrire un formulaire statique (une page HTML), permettant à un client de préciser un texte qu'il désire voir affiché après "Bonjour" dans la page retournée par votre servlet. Le champ de saisie sera initialisé à "moi" et le bouton de soumission du formulaire associé à votre servlet avec la méthode GET. Tester l'association.

Maintenant que votre servlet est associée au formulaire, modifier la méthode doGet() afin de récupérer le texte entré par le client. Pour cela, utiliser la méthode getParameter() de l'instance de HttpServletRequest reçue en argument.

Modifier le formulaire et votre servlet afin d'accéder à cette fonctionnalité via la méthode POST.