Académique Documents
Professionnel Documents
Culture Documents
Travaux Pratiques
6- Accès concurrents...................................................................................................................... 13
4- Spring Boot................................................................................................................................ 19
2
Tarik BOUDAA, ENSA AL Hoceima 2021/2022
1- Filtres et Servlets :
1. Créer une Servlet MyServlet qui enregistre toutes les données d’un étudiant ;
reçues par la méthode GET ; dans la session de l’utilisateur.
Exemple :
Après les invocations suivantes :
http://localhost/app/MyServlet?id=1&nom=test_nom1&prenom=test_prenom1
&dateNaissance=1/1/2000&cne=4444444444
http://localhost/app/MyServlet?id=2&nom=test_nom2&prenom=test_prenom
&dateNaissance=1/2/2001&cne=2222222222
http://localhost/app/MyServlet?id=3&nom=test_nom3&prenom=test_prenom3
&dateNaissance=1/3/2001&cne=3333333333
http://localhost/app/MyServlet?id=1&nom=test_nom4&prenom=test_prenom4
&dateNaissance=4/2/2001&cne=1111111111
La session de l’utilisateur doit stocker dans une structure de données adéquate les
données suivantes :
- Etudiant 1 : id=1 ; nom="test_nom4" ; prenom="test_prenom4 ; dateNaissance
=4/2/2001 ;cne=1111111111
- Etudiant 2 : id=2 ; nom="test_nom2" ; prenom="test_prenom2 ;
dateNaissance=1/2/2001 ;cne=2222222222
- Etudiant 3 : id=3 ; nom="test_nom3" ; prenom="test_prenom3 ;
dateNaissance=1/3/2001 ;cne=3333333333
2. Créer un filtre MyFilter1 qui intercepte les requêtes envoyées vers MyServlet et
il vérifie si un étudiant ayant le même cne existe déjà dans la session. Dans ce
cas, le filtre redirige vers une page JSP qui affiche une erreur. Sinon il laisse la
Servlet s’exécuter.
3
Tarik BOUDAA, ENSA AL Hoceima 2021/2022
3. Ajouter un deuxième filtre MyFilter2 qui doit s’exécuter avant MyFilter1 et qui
interdit l’exécution des requêtes contenant des personnes ayant l’âge < 22 ans.
2- Jeu de dés 1: Servlets, gestion de la session, contexte et filtres
Réaliser une application jeu de dés, à base de Servlets, JSP et filtres, qui offre les
fonctionnalités ci-dessous :
- L’utilisateur doit pouvoir créer un compte
- L’application stocke les informations de chaque utilisateur (nom,
prénom, login, mot de passe et meilleur score)
- L’application permet à l’utilisateur de :
Se connecter / Se déconnecter
Jouer sur l’application
Consulter son meilleur score
Consulter le meilleur score des autres joueurs
Règles du jeu :
Lorsque le joueur lance le dès, s'il réalise deux fois successivement le même
résultat alors il reçoit 20 points (on incrémente son score de 20 points). Pour
chaque partie de jeu le joueur a droit à 20 lancées.
Enregistrer les données de l’application dans une structure de données adéquate,
dans le contexte de l’application.
3- Jeu de dés 2 : Servlets, gestion de la session, contexte et filtres
On considère un jeu dans lequel on lance 3 dés un par un dans n’importe quel
ordre, via une interface comme celle décrite sur la figure 1. Ces dés sont
numéroté 1, 2 et 3. Le champ de texte permet à l’utilisateur d’indiquer le numéro
du dé à lancer, le lancement du dé se fait via le bouton « Lancer le dé ». Durant
une partie, un même dé ne doit pas être lancé plusieurs fois, en effet, si un joueur
lance un même dé plus qu’une fois l’application arrête la partie de jeu et le joueur
reçoit un score = -1.
4
Tarik BOUDAA, ENSA AL Hoceima 2021/2022
un score égal à la somme des résultats obtenus pour les 3 dés. Sinon il reçoit un
score nul. L’application doit arrêter la partie une fois on peut conclure à propos
du score, par exemple si on obtient 6 pour le dé numéro 1 il ne sert à rien
d’attendre les résultats des autres dés, le score dans ce cas est 0.
Une partie de jeu se termine donc soit après avoir lancé les 3 dés ou suite à une
faute de lancement d’un même dé deux fois ou car la condition « résultat (dé 1)
< résultat (dé 2) < résultat (dé 3) » est surement n’est vérifiée (cas d’avoir 6 pour
le premier dé par exemple).
A la fin d’une partie, l’application affiche le score de la partie qui vient d’être
jouée ainsi que le meilleur score enregistré sur l’application (cf. figure 2).
5
Tarik BOUDAA, ENSA AL Hoceima 2021/2022
Se connecter / Se déconnecter
Jouer sur l’application
Consulter son meilleur score
Consulter le meilleur score des autres joueurs
6
Tarik BOUDAA, ENSA AL Hoceima 2021/2022
Travail à faire :
1. Créer une application Web AppWeb avec Spring MVC basée sur une
configuration par code Java qui effectuent les choses suivantes :
a) Un contrôleur Spring MVC qui effectue le même travail que celui de la
Servlet MyServlet de l’exercice TP1-EX1.
b) Deux intercepteurs effectuant le même travail des filtres MyFilter1 et
MyFilter2 de l’exercice TP1-EX1.
c) Un contrôleur Spring MyController qui reçoit les données des étudiants (id,
nom, prénom, date naissance, cne) envoyées via un formulaire il les enregistre
dans la session puis il les affiche dans une JSP sous forme d’une table HTML
en utilisant les balises de JSTL. Si une personne portant le même id existe
déjà dans la session le contrôleur effectue (si nécessaire) une mise à jour des
données de la session.
2. Ecrire une classe nommée CalculAgeImpl qui implémente l’interface
ICalculAge. La méthode calculer prend en paramètre une date et retourne l’âge
d’une personne exprimé en nombre entier d'années :
public interface ICalculAge {
public int calculer(Date d) ;
}
3. Injecter dans MyController une instance de CalculAgeImpl en utilisant
@autowired et une injection par constructeur.
4. Changer le code précédent de MyController et le code JSP pour afficher dans la
table HTML l’âge au lieu de la date de naissance.
5. Ajouter une Classe CompareAgeImpl qui implémente l’interface
ICompareAge ci-dessous. La méthode comparer retourne 1 si d1<d2, 0 si d1=d2
et -1 si d1>d2.
7
Tarik BOUDAA, ENSA AL Hoceima 2021/2022
8
Tarik BOUDAA, ENSA AL Hoceima 2021/2022
9
Tarik BOUDAA, ENSA AL Hoceima 2021/2022
Ecrire le code de cette application avec Spring MVC et Hibernate en réutilisant une
partie du code écrit dans le TP précédent.
Inscription :
Le bouton envoyer permet d’enregistrer les données dans une base données. La liste des
inscrits s’affiche au-dessous du formulaire.
Si l’opération est effectuée avec succès une page s’affiche contenant un message
indiquant le succès de l’opération sinon une page d’erreur doit être affichée.
L’application dispose également d’une page de gestion des inscrits et permet de modifier
les informations d’une personne ou supprimer une personne de la base de données.
10
Tarik BOUDAA, ENSA AL Hoceima 2021/2022
Le lien « update » redirige vers le formulaire (pré-rempli) de mise à jour d’une personne
(voir figure ci-dessous) :
11
Tarik BOUDAA, ENSA AL Hoceima 2021/2022
Dans le code de l’application précédente, ajouter les règles de validations suivantes avec
Hibernate Validator:
La figure suivante montre comment elles doivent s’afficher les erreurs de validation de
données :
12
Tarik BOUDAA, ENSA AL Hoceima 2021/2022
6- Accès concurrents
1- Effectuer une copie du code de l’application de l’exercice TP3-EX1, puis écrire
un code mettant en évidence quelques problèmes d’accès concurrent vue dans le
cours en changeant à chaque fois les paramètres d’isolation et de propagation
transactionnel de l’annotation @Transactional.
2- Implémenter le versionning d’entités avec Hibernate pour éviter les problèmes
d’accès concurrents sur les entités représentant les personnes en base de données.
On suppose que plusieurs utilisateurs peuvent modifier en même temps les
mêmes données des personnes en base de données.
13
Tarik BOUDAA, ENSA AL Hoceima 2021/2022
Cette application gère plusieurs rôles et chaque rôle a accès uniquement à un sous-
ensemble des cas d’utilisations :
Améliorer le code précédent pour utiliser JDBC et une base de données pour la gestion
des comptes utilisateurs. Ajouter la protection contre les attaques CRSF et implémenter
le hachage des mots de passe avec un gain de sel.
14
Tarik BOUDAA, ENSA AL Hoceima 2021/2022
Travail à faire :
Le digramme de classe donné sur la figure 1, décrit les entités d’une application de
gestion d’absence.
1- Ecrire ces classes en Java en les annotant avec les annotations de JPA puis
générer la base de données.
2- Cette application possèdes 4 types de rôles : Cadre ADMIN, ETUDIANT, PROF
et ADMIN. Implémenter une gestion personnalisée de l’authentification et la
gestion des autorisations basées sur la couche Service de l’application et ce en
personnalisant UserDetailsService de Spring Security et en respectant la
conception donnée sur la figure 1 pour les classes : Utilisateur, Compte et Role.
3- Développer avec Spring, Spring MVC et Hibernate le sous-ensemble des
fonctionnalités de cette application décrites ci-dessous par rôle :
15
Tarik BOUDAA, ENSA AL Hoceima 2021/2022
TypeSeance
- idTypeSeance : int
- intitule : String
- alias : String
0..*
typeSeance Absence Matiere
0..1
- idAbsence : int - idMatiere : int
absences 0..* 1..1
- dateHeureDebutAbsence : Date - nom : String
absences matiere
- dateHeureFinAbsence : Date - code : String
PieceJustificative
- etat : int
- idPieceJustificative : int 0..*
- typeSaisie : String
- cheminFichier : String absences 1..*
- intitule : String matieres
0..* 1..*
- dateLivraison : Date piecesJustificatives absence 0..*
- etat : int absencesMarquees
- source : String
1..1
inscription
1..1
observateur Inscription
Enseignant - idInscription : int
- specialite : String - annee : int
- etat : int 1..1
module
Module
0..* 0..*
inscriptions inscriptions - idModule : int
- titre : String
- code : String
Etudiant 0..*
Utilisateur modules
1..1
- idUtilisateur : int - cne : String
etudiant
- dateNaissance : Date
- nom : String
- prenom : String
- identifiant : String
- email : String 1..1 1..1
1..1 - telephone : String niveau niveau
proprietaire - nomArabe : String Niveau
- prenomArabe : String
- photo : String - idNiveau : int
- alias : String
- titre : String
0..* CadreAdministrateur
comptes
- grade : String
Compte
- idCompte : int
- enabled : int
- accountNotExpired : int
- accountNotLocked : int
- login : int JournalisationEvenements
- password : int - idEvenement : int
- disconnectAccount : boolean - details : String
- accepteDemandeAutorisationAbsence : boolean 0..* - adresseIP : String
- affichePhoto : boolean evenements - DateHeure : Date
- afficheEmail : boolean 1..1 - typeEvenement : String
compte - criticite : String
Role
- idRole : int
- nomRole : String
0..*
comptes 1..1
role
Figure 1
16
Tarik BOUDAA, ENSA AL Hoceima 2021/2022
17
Tarik BOUDAA, ENSA AL Hoceima 2021/2022
Ecrire une nouvelle application qui propose une API REST qui inclut les mêmes services
web de l’application de l’exercice 2 mais cette fois-ci en utilisant Spring data REST.
18
Tarik BOUDAA, ENSA AL Hoceima 2021/2022
4- Spring Boot
19