TP 2 : Programmation Java côté serveur

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.

Objectifs pédagogiques

Date de rendu

Ce TP et le suivant sont à réaliser et à pusher dans la forge pour le dimanche 3 novembre 2019 à 23h59.

Outils

Configuration de Tomcat

Vous utiliserez Tomcat pour déployer votre code sur votre machine. Vous devrez modifier la configuration (répertoire conf de votre installation) pour :

Mise en place du projet

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

Configuration du projet Maven

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.

Configuration pour l'utilisation d'Expression Language en JSP

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">

Compilation d'un projet Web et Déploiement sur Tomcat

Attention : pour re-déployer un war, utilisez le goal Maven tomcat7:redeploy et non tomcat7:deploy...

Description de l'application

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.

Fonctionnalités

Les tâches à réaliser sont les suivantes :

Architecture de l'interface et des composants de l'application

Accueil

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.

page d'accueil

Initialisation

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 :

Fonctionnement

L'interface affichée pendant le fonctionnement "normal" de l'application est constituée de 3 pages et est reponsable des fonctionnalités suivantes :

page d'accueil

Conception basique de l'application

Pour vous faire gagner du temps, un début d'implémentation est disponible ici.

Interface de gestion des billets

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 :

  1. Rajoutez à la classe Billet la possibilité de gérer des commentaires
  2. Mettez en place l'affichage des commentaires en-dessous du contenu du billet
  3. Mettez en place une variable globale de type GestionBillets
  4. Mettez en place un mode d'appel de la page billet.jsp pour que l'utilisateur puisse choisir quel billet afficher
  5. Ajoutez à la page un header HTTP Refresh pour que la page soit rafraîchie toutes les 5 secondes et qu'on puisse voir les commentaires ajoutés par un autre utilisateur

Déconnexion

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.

Ajout de groupes

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.

Déploiement sur votre VM

À 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.

Reconfiguration de nginx

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".

Installation de Java

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

Installation de Tomcat

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 :

  1. sudo nano /opt/tomcat/apache-tomcat-9.0.26/webapps/manager/META-INF/context.xml
  2. Commentez la directive "valve" (lignes 19 et 20)
  3. Redémarrez Tomcat
Licence Creative Commons
Valid XHTML 1.0 Transitional