Ce TP est divisé en deux parties : dans cette première partie, vous allez mettre en place une application fonctionnelle avec les technologies de programmation côté serveur en Java. Dans le suivant, vous refactorerez cette application pour la rendre confirme aux bonnes pratiques de programmation et mettrez en place quelques design patterns.
Ce TP et le suivant sont à réaliser et à pusher dans la forge pour le dimanche 3 novembre 2019 à 23h59.
Vous utiliserez Tomcat pour déployer votre code sur votre machine. Vous devrez modifier la configuration (répertoire conf de votre installation) pour :
Les différentes opérations ci-dessous nous permettront de récupérer correctement votre TP et les informations nécessaires à votre notation. Merci de veiller à ce qu'elles soient correctement réalisées, sans quoi vous risquez soit d'être sanctionnés, soit que votre projet ne soit pas corrigé.
Dans ce TP, vous allez travailler dans un projet Maven Webapp. Pour créer un nouveau projet (à titre d'information, car un projet configuré vous est fourni), vous avez plusieurs possibilités :
Attention : Maven ne vous crée pas tout seul le répertoire src/main/java. Vous devrez le créer car c'est dans ce répertoire que vous allez mettre vos sources Java. Si votre IDE trouve un répertoire src/main/resources dans votre projet, supprimez-le.
Ensuite, vous devrez ajouter dans votre projet une dépendance sur l'API servlet et sur la bibliothèque JSTL de tags JSP. Pour cela, rajoutez le code suivant dans votre pom.xml :
<dependency> <groupId>javax</groupId> <artifactId>javaee-web-api</artifactId> <version>8.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
Attention : si vous exécutez le projet en Java 8, il faut changer les versions dans l'exemple ci-dessus : pour javaee-web-api, utiliser la version 7.0.
Si vous voulez utiliser EL dans vos JSP, il faut que votre web.xml corresponde à l'API Servlet 2.4 ou supérieure. Exemple de code de l'élément racine :
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
Attention : pour re-déployer un war, utilisez le goal Maven tomcat7:redeploy et non tomcat7:deploy...
Tout au long de l'UE, vous allez concevoir, réaliser et déployer une application Web de gestion de billets (posts) de blog fonctionnant comme un réseau social très simple. Dans ce TP, vous mettrez en place les principales fonctionnalités qui devront être disponibles côté serveur pour permettre à l'application de fonctionner.
Les tâches à réaliser sont les suivantes :
La page d'accueil (index.html, voir figure ci-dessous) contient un formulaire demandant un pseudo à l'utilisateur. Le pseudo est saisi dans un champ texte, qui est envoyé par la méthode POST à une servlet, appelée Init.
La servlet Init effectue un traitement de la requête : si la requête est envoyée en POST, elle récupère le pseudo de l'utilisateur en paramètre et le stocke en attribut de session, et redirige l'utilisateur sur une la JSP qui affiche les billets billets.jsp. Si la requête est envoye en GET, elle redirige sur la page d'accueil.
Notez les deux types de redirection différents :
L'interface affichée pendant le fonctionnement "normal" de l'application est constituée de 3 pages et est reponsable des fonctionnalités suivantes :
Pour vous faire gagner du temps, un début d'implémentation est disponible ici.
La page billet.jsp permet d'afficher les billets. Actuellement, elle n'en affiche qu'un et ne prend pas en compte les commentaires. À vous de mettre en place ces fonctionnalités :
Créez une servlet Deco chargée de déconnecter l'utilisateur en supprimant ses attributs de session et de le renvoyer vers la page d'accueil.
Quel est le type de redirection que vous devez employer pour cela ?
Faites en sorte que billet.jsp redirige les utilisateurs non connectés sur la page d'accueil.
Faites en sorte que les utilisateurs aient accès à la liste des billets publiés, à l'aide d'un menu affiché sur billet.jsp. Chacun des éléments de cette liste possèdera un lien qui renverra vers l'affichage du billet correspondant.
Placez ce menu dans une JSP séparée, que vous incluerez dans billet.jsp à l'aide de la directive appropriée.
Vous allez maintenant modifier votre application pour qu'elle prenne en charge plusieurs "groupes de discussion".
À ce stade, vous avez réalisé une application de gestion de billets de blog basique, mais fonctionnelle.
Cette partie de TP est à pusher sur la forge avec un tag "TP2". La suite de l'énoncé se trouve dans le TP3.
À faire en dehors des séances de TP
Vous allez maintenant suivre les étapes ci-dessous pour déployer votre application sur la VM que vous avez installée au TP1.
Commencez par libérer le port 8080 pour que Tomcat puisse l'utiliser. Pour cela, supprimez le lien de sites-enabled vers la configuration de monsite (vous pouvez laisser la configuration dans sites-available).
Dans la configuration de default, commentez les redirections vers monsite, ainsi que vers les différents sites utilisés pour la question sur le load balancing.
Configurez nginx en reverse proxy sur le port 8080 pour toutes les URLs commençant par "/api".
Installez Java 11 :
sudo apt install openjdk-11-jdk
Si cela ne fonctionne pas du premier coup, tentez de mettre à jour les paquets.
Positionnez la variable d'environnement JAVA_HOME (nécessaire à Tomcat pour fonctionner) :
sudo nano /etc/environment
À la fin de ce fichier, ajouter la ligne :
JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64"
Relancez le chargement des variables d'environnement :
source /etc/environment
Vérifier l'ajout de la variable :
echo $JAVA_HOME
Ce qui suit est très fortement inspiré de ce tuto.
Téléchargez l'archive de Tomcat à partir de l'URL indiquée sur le site de Tomcat :
wget http://apache.mirrors.benatherton.com/tomcat/tomcat-9/v9.0.26/bin/apache-tomcat-9.0.26.tar.gz -P /tmp
Créez un utilisateur et un groupe tomcat pour exécuter le serveur (son home directory sera celui où vous dézipperez le serveur) :
sudo useradd -r -m -U -d /opt/tomcat -s /bin/false tomcat
Dézippez-le dedans :
sudo tar xf /tmp/apache-tomcat-9*.tar.gz -C /opt/tomcat
Faites la configuration de Tomcat indiquée dans la partie Configuration de Tomcat.
Donnez les droits à l'utilisateur tomcat dessus :
sudo chown -RH tomcat: /opt/tomcat/apache-tomcat-9.0.26/
Rendez les scripts exécutables :
sudo sh -c 'chmod +x /opt/tomcat/apache-tomcat-9.0.26/bin/*.sh'
Créez un service tomcat pour pouvoir l'utiliser comme nginx :
sudo nano /etc/systemd/system/tomcat.service
Ajoutez ce contenu dans le fichier :
[Unit] Description=Tomcat 9 servlet container After=network.target [Service] Type=forking User=tomcat Group=tomcat Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom -Djava.awt.headless=true" Environment="CATALINA_BASE=/opt/tomcat/apache-tomcat-9.0.26" Environment="CATALINA_HOME=/opt/tomcat/apache-tomcat-9.0.26" Environment="CATALINA_PID=/opt/tomcat/apache-tomcat-9.0.26/temp/tomcat.pid" Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC" ExecStart=/opt/tomcat/apache-tomcat-9.0.26/bin/startup.sh ExecStop=/opt/tomcat/apache-tomcat-9.0.26/bin/shutdown.sh [Install] WantedBy=multi-user.target
Rechargez les paramètres du système :
sudo systemctl daemon-reload
Démarrez Tomcat :
sudo service tomcat start
Vérifiez que vous voyez bien le serveur en HTTP sur le port 8080, et en HTTPS à l'URL de votre VM suivie de "/api".
Si vous voulez pouvoir utiliser l'application manager (qui n'est accessible par défaut que depuis la machine serveur elle-même), faites les manipulations suivantes :