HttpServlets

HelloServlet

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:

lui dire d'utiliser le plugin repository et invalider les caches et redémarrer.

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.

Rectangle

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.

Hello avec de la mémoire

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 foisi 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 ?