Toutes vos classes doivent être dans le package fr.uge.jee.servlet.hello.
Installez Tomcat 10 (il faut prendre la version Core pour votre OS) et rendez-le exécutable:
$ cd apache-tomcat-10.0.12 $ cd bin $ chmod +x catalina.sh
Démarrer Tomcat avec la commande:
$./catalina.sh run &
Créer un nouveau projet Maven en partant de ce pom.xml.
Si IntelliJ
se plaint de ne pas connaître le plugin, il faut:
Ecrivez le servlet HelloServlet
.
Rajoutez à votre projet un répertoire webapp contenant un répertoire vide WEB-INF comme ci-dessous:
Packagez votre servlet en un war avec la commande en ligne:
$ mvn compile war:war
Copiez votre war dans le répertoire webapps de Tomcat.
Testez que le servlet HelloServlet est bien installé en visitant l'adresse localhost:8080/App/hello avec votre navigateur favori.
Toutes vos classes doivent être dans le package fr.uge.jee.servlet.rectangle.
Dans cette exercice, on veut réaliser un servlet qui quand fait un requête GET sur la route App/rectangle renvoie un formulaire qui demande la longueur et la hauteur du rectangle.
Quand on envoie les données de ce formulaire, on veut voir s'afficher l'aire du rectangle.
Réaliser votre servlet et déployé le sur Tomcat.
Plutôt que d'écrire le code HTML de la page avec le formulaire dans votre servlet, mettez la dans le répertoire webapp/WEB-INF/templates/rectangle-form.html. Dans votre servlet, vous pourrez y accéder en utilisant:
InputStream inputStream = getServletContext().getResourceAsStream("/WEB-INF/templates/rectangle-form.html");
Cette méthode renvoie un InputStream
sur le fichier. Pour obtenir la String correspondante, vous pouver utiliser la méthode suivante:
public static String readFromInputStream(InputStream inputStream) throws IOException { var lines = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)).lines(); return lines.collect(Collectors.joining("\n")); }
On ne veut pas aller relire la ressource "/WEB-INF/templates/rectangle-form.html" à chaque requête. Regardez la méthode init
de HttpServlet
.
Que se passe-t-il si l'utilisateur ne rentre pas des nombres ?
BonusModifier votre code pour que dans ce cas, l'utilisateur retourne sur le formulaire avec les valeurs qu'il a donné et un petit message lui indiquant le problème.
Toutes vos classes doivent être dans le package fr.uge.jee.servlet.hellosession.
Dans cet exercice, on veux écrire un servlet qui lorsque l'on fait une requête GET sur la route /hellosession, va afficher Bonjour pour la i-ème fois où i est le nombre de fos que ce visiteur à accéder à cette ressource.
Ecrivez votre servlet HelloSessionBetter
en implémentant à la main la gestion du token de session comme expliqué en cours.
Rappelez vous les servlets doivent être thread-safe. Il peut être intéressant de créer une classe thread-safe qui a pour rôle de gérer les tokens de session.
Testez votre servlet avec deux navigateurs différents ou avec une fenêtre privée pour vérifier que vous identifiez correctement les visiteurs.
En pratique, il n'est pas nécessaire de gérer la session à la main. La classe HttpSession
permet de le faire pour nous.
On peut récupérer ou créer la session à partir de la HttpServletRequest request
avec
request.getSession(true)
. Ensuite l'objet
HttpSession
peut être utilisé comme une table de hachage de String vers Object grâce aux méthodes:
httpSession.getAttribute(String name)
et
httpSession.setAttribute(String name,Object value)
.
Récrivez le servlet HelloSession
dans une classe HelloSessionBetter
en utilisant les HttpSession
. La route de ce nouveau servlet sera /hellosessionbetter
Dans votre navigateur, récupérer votre token de session. Sur Firefox, cela se fait en ouvrant les outils développeurs et en examinant la réponse du serveur à notre requête GET. Dans le header de la réponse, vous devriez voir un cookie du genre JSESSIONID=0964C16E166EF0347296B2812F4.
Depuis un terminal, utilisez la commande curl suivant pour envoyer une requête GET avec le même token que cela de votre navigateur:
curl -X GET -i -b JSESSIONID=0964C16E166EF0347296B2812F4 http://localhost:8080/App/hellosessionbetter
Vous devriez voir le conteneur du navigateur incrémenté de 1.
Essayez un requête curl avec un token arbitraire comme FFFFFFFF. Que fait le servlet dans ce cas ?