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>
).
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é.
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
.