Programmation des Réseaux avec Java
Servlettes avec Tomcat
Nous abordons ici la mise en oeuvre et le fonctionnement des
servlettes en Java, ainsi que la configuration des applications web
(webapp) qui les hébergent.
Exercice 1
- Installation de Tomcat
Tomcat, le
serveur de servlettes 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 servlettes
et de JSP. Accédez également à la documentation,
et en particulier aux javadoc des API des servlettes et des JSP.
Exercice 2
- La servlette 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.
- 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 servlettes
- 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 qui est fourni par la documentation web.xml,
et modifiez le afin d'associer d'une part, le nom de servlette
bonjour à la classe fr.umlv.ttt.servlet.Bonjour (en utilisant un
élément <servlet>), et d'autre part le nom de servlette
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
servletvia 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 servlettes
À partir du fichier Bonjour.java, créer une nouvelle classe
Java TDbasic/src/fr/umlv/servlet/tdbasic/SimpleCounter.java
en ajoutant un champ count (initialisé à 0) qui
compte le nombre de fois où la servlette a été appelée (incrémentée
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 servlette compteurA, et les URL /compteB et
/compteBbis au nom de servlette 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 servlettes.
Exercice 4
- Initialisation de servlettes
Si le serveur est arrêté puis redémarré, de nouvelles servlettes 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 servlette est
arrêtée.
-
Pour cela, la servlette 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 servlette, 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 serveltte, 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 6
- Utilisation de formulaire
Écrire un formulaire statique (une page HTML), permettant à un client
de préciser un texte qu'il désire voir afficher après "Bonjour" dans
la page retournée par votre servlette. Le champ de saisie sera
initialisé à "moi" et le bouton de soumission du formulaire associé à
votre servlette avec la méthode GET. Tester l'association.
Maintenant que votre servlette 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 servlette afin d'accéder à cette
fonctionnalité via la méthode POST.