Spring MVC : formulaires et sessions
Achref El Mouelhi
Docteur de l’université d’Aix-Marseille
Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel
[Link]@[Link]
H & H: Research and Training 1 / 30
Plan
1 Formulaires
Récupérer les données d’un formulaire dans un objet
Valider les formulaires
2 Autres balises de formulaires Spring
3 Sessions
H & H: Research and Training 2 / 30
Formulaires
Spring MVC 5
Un formulaire
n’est pas un composant propre à Spring
H I ©
peut donc être défini comme on le faisait avant, avec HTML
E Lés de Spring afin de
peut être construit en respectant les spécificit
U
faciliter le contrôle de la saisie et la O
L M validation
r e f E
A ch
©
H & H: Research and Training 3 / 30
Formulaires
Spring MVC 5
Un formulaire
n’est pas un composant propre à Spring
H I ©
peut donc être défini comme on le faisait avant, avec HTML
E Lés de Spring afin de
peut être construit en respectant les spécificit
U
faciliter le contrôle de la saisie et la O
L M validation
r e f E
A c: h
©
L’apport de Spring
Facilite la récupération de données après la soumission d’un
formulaire sous forme d’un objet
Simplifie la validation de formulaires
H & H: Research and Training 3 / 30
Formulaires Récupérer les données d’un formulaire dans un objet
Spring MVC 5
Pour récupérer les données d’un formulaire dans un objet
On doit :
construire le formulaire en utilisant les balises Spring
H I ©
EL
utiliser l’annotation @ModelAttribute pour récupérer les données envoyées
par le formulaire sous forme d’objet
O U
f E LM
ch r e
©A
H & H: Research and Training 4 / 30
Formulaires Récupérer les données d’un formulaire dans un objet
Spring MVC 5
Pour récupérer les données d’un formulaire dans un objet
On doit :
construire le formulaire en utilisant les balises Spring
H I ©
EL
utiliser l’annotation @ModelAttribute pour récupérer les données envoyées
par le formulaire sous forme d’objet
O U
f E LM
Démarche
ch r e
On va : ©A
créer un contrôleur FormController
créer une vue [Link] et construire le formulaire en utilisant les
balises Spring
H & H: Research and Training 4 / 30
Formulaires Récupérer les données d’un formulaire dans un objet
Spring MVC 5
Le contrôleur FormController (première partie)
package [Link];
import [Link];
import
import
[Link];
[Link];
H I ©
import
U
[Link]; EL
import
O
[Link];
import
LM
[Link];
f E
ch r e
import [Link];
©A
import [Link];
@Controller
public class FormController {
@Autowired
private PersonneRepository personneRepository;
H & H: Research and Training 5 / 30
Formulaires Récupérer les données d’un formulaire dans un objet
Le contrôleur FormController (suite)
@GetMapping("/personne")
public String personneForm(Model model) {
[Link]("personne", new Personne());
return "personneForm";
}
@PostMapping("/personne")
public String personneSubmit(@ModelAttribute("personne") Personne
H I ©
personne, Model model) {
Personne p1 = [Link](personne);
U EL
O
LM
[Link]("personne", p1);
}
return "confirm";
r e f E
}
ch
©A
H & H: Research and Training 6 / 30
Formulaires Récupérer les données d’un formulaire dans un objet
Le contrôleur FormController (suite)
@GetMapping("/personne")
public String personneForm(Model model) {
[Link]("personne", new Personne());
return "personneForm";
}
@PostMapping("/personne")
public String personneSubmit(@ModelAttribute("personne") Personne
H I ©
personne, Model model) {
Personne p1 = [Link](personne);
U EL
O
LM
[Link]("personne", p1);
}
return "confirm";
r e f E
}
ch
Explication ©A
@ModelAttribute permet de récupérer les valeurs ajoutées au Model au
[Link]("personne", new Personne()); du get.
On peut initialiser nos champs en attribuant des valeurs aux attributs de l’objet personne
envoyé dans model
H & H: Research and Training 6 / 30
Formulaires Récupérer les données d’un formulaire dans un objet
Spring MVC 5
Pour utiliser les formulaires Spring (comme pour la JSTL)
on déclare un préfixe
on utilise les attributs de ce préfixe pour la construction et la
H I ©
EL
validation de formulaires
O U
f E LM
ch r e
©A
H & H: Research and Training 7 / 30
Formulaires Récupérer les données d’un formulaire dans un objet
Spring MVC 5
Pour utiliser les formulaires Spring (comme pour la JSTL)
on déclare un préfixe
H I ©
on utilise les attributs de ce préfixe pour la construction et la
EL
validation de formulaires
O U
Déclarer le préfixe
f E LM
ch r e
© A
<%@ taglib uri="[Link]
form" prefix="form" %>
H & H: Research and Training 7 / 30
Formulaires Récupérer les données d’un formulaire dans un objet
Spring MVC 5
Pour utiliser les formulaires Spring (comme pour la JSTL)
on déclare un préfixe
H I ©
on utilise les attributs de ce préfixe pour la construction et la
EL
validation de formulaires
O U
Déclarer le préfixe
f E LM
ch r e
© A
<%@ taglib uri="[Link]
form" prefix="form" %>
Utiliser le préfixe
<form:element [attributs]> ... </form:element>
H & H: Research and Training 7 / 30
Formulaires Récupérer les données d’un formulaire dans un objet
Spring MVC 5
Contenu du formulaire [Link]
<%@ taglib uri="[Link] prefix="form"
%>
<!DOCTYPE html>
<html>
<head>
H I ©
EL
<meta charset="UTF-8">
<title>Person form</title>
O U
LM
</head>
<body>
<h1>Person form</h1>
r e f E
ch
<form:form modelAttribute="personne" action="personne" method="post">
©A
<form:label path="nom">nom</form:label>
<form:input path="nom"/>
<form:label path="prenom">prénom</form:label>
<form:input path="prenom"/>
<input type="submit" value="Ajouter">
</form:form>
</body>
</html>
H & H: Research and Training 8 / 30
Formulaires Récupérer les données d’un formulaire dans un objet
Spring MVC 5
Explication
Les balises Spring (<form:x>) sont indispensables pour le
binding contrôleur/vue.
L’attribut modelAttribute="personne" du formulaire
H I ©
correspond à l’attribut @ModelAttribute du contrôleur.
U EL
O
f E LM
L’attribut path="..." doit correspondre à un getter/setter de
r e
l’attribut de modèle (ici la classe Personne). Lorsque le
ch
©A
formulaire est soumis, les setters seront utilisé pour enregistrer
les valeurs du formulaire dans l’objet personne.
Enfin, lorsque le formulaire est soumis, la méthode du contrôleur
annotée par @PostMapping est appelée et le formulaire affecte
automatiquement les valeurs du formulaire à l’attribut personne
du contrôleur.
H & H: Research and Training 9 / 30
Formulaires Valider les formulaires
Spring MVC 5
Pour contrôler la saisie avant d’insérer une personne dans la BD
On va : H I ©
U EL
O
ajouter le module de validation de Hibernate dans [Link]
f E LM
modifier l’entité Personne en rajoutant des contraintes exprimées
avec des annotations ch r e
©A
modifier la vue pour pouvoir afficher les messages d’erreur
H & H: Research and Training 10 / 30
Formulaires Valider les formulaires
Spring MVC 5
Ajoutons la dépendance suivante dans [Link]
<!-- [Link]
H I ©
[Link]/hibernate-validator -->
U EL
<dependency> O
E LM
<groupId>[Link]</groupId>
f
ch r e
<artifactId>hibernate-validator</artifactId>
©A
<version>[Link]</version>
</dependency>
H & H: Research and Training 11 / 30
Formulaires Valider les formulaires
Définissons nos règles de validation dans le modèle (l’entité)
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
H I ©
EL
import [Link];
@Entity
O U
public class Personne {
@Id
f E LM
ch r e
@GeneratedValue(strategy = [Link])
©A
private Long num;
@Size(min = 2)
@NotEmpty(message = "le champ nom est obligatoire")
private String nom;
@NotEmpty(message = "le champ prénom est obligatoire")
@Size(min = 2)
private String prenom;
...
H & H: Research and Training 12 / 30
Formulaires Valider les formulaires
Spring MVC 5
Les annotations de validation utilisées
H I ©
EL
@Size : pour indiquer la taille (le nombre de caractère) min et/ou
OU
max d’un champ (on peut aussi utiliser @Min et @Max)
M
f
@NotEmpty : pour préciserE L champ ne peut pas être vide (à
qu’un
e
c r @NotNull qui concerne plutôt le champ
ne pas confondrehavec
© A
d’une table et non pas d’un formulaire) )
H & H: Research and Training 13 / 30
Formulaires Valider les formulaires
Autres annotations
@Email : vérifie si la valeur est une adresse email valide
@Positive et @PositiveOrZero : vérifie si un champ est positif (ou resp. positif ou
null) (Réciproquement pour @Negative et @NegativeOrZero )
@Past : vérifie si une date est dans le passé (Pareillement pour @Future,
@FutureOrPresent et @PastOrPresent )
H I ©
EL
@Digits(integer=..., fraction=...) : vérifie si les partie entière et décimale
U
d’un nombre respectent la précision
O
E LM
@AssertTrue : vérifie si la valeur d’un champ est true (réciproquement pour
f
@AssertFalse)
ch r e
©A
@Max(value=) : vérifie si la valeur (nombre ou chaı̂ne de caractères représentant un
nombre) est inférieure ou égale à max (réciproquement @Min(value=))
Length(min=, max=) : vérifie si la longueur de la chaı̂ne de caractères est dans
l’intervalle
@ISBN, @Pattern... (consultez les autres sur
[Link]
/en-US/html single/#section-validating-bean-constraints)
H & H: Research and Training 14 / 30
Formulaires Valider les formulaires
Ajoutons les champs d’erreurs dans [Link]
<%@ taglib uri="[Link] prefix="form"
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
.error { color: red; }
H I ©
EL
</style>
<title>Person form</title>
</head>
O U
<body>
<h1>Person form</h1>
f E LM
r e
<form:form modelAttribute="personne" action="personne" method="post">
ch
©A
<form:label path="nom">nom</form:label>
<form:input path="nom"/>
<form:errors path="nom" cssClass="error"/>
<form:label path="prenom">prénom</form:label>
<form:input path="prenom"/>
<form:errors path="prenom" cssClass="error"/>
<input type="submit" value="Ajouter">
</form:form>
</body>
</html>
H & H: Research and Training 15 / 30
Formulaires Valider les formulaires
Spring MVC 5
Comment tester la validité de ce qui a été saisie par rapport à ce qui a été défini
(Personne)
@PostMapping("/personne")
public String personneSubmit(@ModelAttribute("personne") @Valid
Personne personne, BindingResult result, Model model) {
H I ©
U EL
if ([Link]()) {
O
}
return "personneForm";
f E LM
ch r e
Personne p1 = [Link](personne);
©A
[Link]("personne",p1);
return "confirm";
}
@Valid permet de valider les valeurs saisies par rapport à ce qui a été défini dans le
modèle.
Pour le binding, il faut placer le BindingResult result juste après le modèle.
H & H: Research and Training 16 / 30
Autres balises de formulaires Spring
Spring MVC 5
Considérons la méthode suivante définie dans FormController
@GetMapping("/form")
H I ©
EL
public String showView(Model model) {
O U
LM
[Link]("sexe", "");
[Link]("message", "Hello World!");
e f E
[Link]("genre", new String [] {"homme", "femme"});
r
ch
[Link]("personnes", [Link]());
©A
return "formSpring";
}
H & H: Research and Training 17 / 30
Autres balises de formulaires Spring
Spring MVC 5
Dans la vue formSpring, pour créer des boutons radios
homme : <form:radiobutton path="genre" value="homme"/>
femme : <form:radiobutton path="genre" value="femme"/>
H I ©
UEL
O
f E LM
ch r e
©A
H & H: Research and Training 18 / 30
Autres balises de formulaires Spring
Spring MVC 5
Dans la vue formSpring, pour créer des boutons radios
homme : <form:radiobutton path="genre" value="homme"/>
femme : <form:radiobutton path="genre" value="femme"/>
H I ©
EL
M OU
E L envoyées par le contrôleur
On peut aussi récupérer les valeurs
f
<form:radiobuttons r e
chitems="${ genre }" path="sexe" />
© A
H & H: Research and Training 18 / 30
Autres balises de formulaires Spring
Spring MVC 5
Dans la vue formSpring, pour créer des boutons radios
homme : <form:radiobutton path="genre" value="homme"/>
femme : <form:radiobutton path="genre" value="femme"/>
H I ©
EL
M OU
E L envoyées par le contrôleur
On peut aussi récupérer les valeurs
f
<form:radiobuttons r e
chitems="${ genre }" path="sexe" />
© A
Ne pas confondre radiobutton et radiobuttons
H & H: Research and Training 18 / 30
Autres balises de formulaires Spring
Spring MVC 5
Pour créer des cases à cocher
homme : <form:checkbox path="genre" value="homme"/>
femme : <form:checkbox path="genre" value="femme"/>
H I ©
UEL
O
f E LM
ch r e
©A
H & H: Research and Training 19 / 30
Autres balises de formulaires Spring
Spring MVC 5
Pour créer des cases à cocher
homme : <form:checkbox path="genre" value="homme"/>
femme : <form:checkbox path="genre" value="femme"/>
H I ©
EL
M OU
E L envoyées par le contrôleur
On peut aussi récupérer les valeurs
f
hr
<form:checkboxescitems="${
e genre }" path="sexe" />
© A
H & H: Research and Training 19 / 30
Autres balises de formulaires Spring
Spring MVC 5
Pour créer des cases à cocher
homme : <form:checkbox path="genre" value="homme"/>
femme : <form:checkbox path="genre" value="femme"/>
H I ©
EL
M OU
E L envoyées par le contrôleur
On peut aussi récupérer les valeurs
f
hr
<form:checkboxescitems="${
e genre }" path="sexe" />
© A
Ne pas confondre checkbox et checkboxes
H & H: Research and Training 19 / 30
Autres balises de formulaires Spring
Spring MVC 5
Pour créer des listes déroulantes
<form:select path="personnes">
<form:option value="-" label="--Choisir une personne
--"/>
<form:options items="${ personnes }" />
H I ©
EL
</form:select>
O U
f E LM
ch r e
©A
H & H: Research and Training 20 / 30
Autres balises de formulaires Spring
Spring MVC 5
Pour créer des listes déroulantes
<form:select path="personnes">
<form:option value="-" label="--Choisir une personne
--"/>
<form:options items="${ personnes }" />
H I ©
EL
</form:select>
O U
f E LM
ch r e
Pour créer des listes déroulantes avec sélection multiple
© A
<form:select path="personnes"
multiple="true" />
items="${ personnes }"
H & H: Research and Training 20 / 30
Autres balises de formulaires Spring
Spring MVC 5
Pour créer des listes déroulantes
<form:select path="personnes">
<form:option value="-" label="--Choisir une personne
--"/>
<form:options items="${ personnes }" />
H I ©
EL
</form:select>
O U
f E LM
ch r e
Pour créer des listes déroulantes avec sélection multiple
© A
<form:select path="personnes"
multiple="true" />
items="${ personnes }"
Pour consulter la liste des balises et d’attributs, aller sur
[Link]
/spring-framework-reference/html/[Link]
H & H: Research and Training 20 / 30
Sessions
Spring MVC 5
Les sessions avec Spring
H I ©
UEL
on peut les utiliser via l’objet WebRequest (comme
O
HttpSession de la plateforme JEE)
f E LM
ch r e
mais on peut les utiliser aussi via les annotations
©A
H & H: Research and Training 21 / 30
Sessions
Les sessions
Pour récupérer le WebRequest
@PostMapping("/connect")
H I ©
public String ourMethod(..., WebRequest request) {
UEL
O
f E LM
ch r e
©A
H & H: Research and Training 22 / 30
Sessions
Les sessions
Pour récupérer le WebRequest
@PostMapping("/connect")
H I ©
public String ourMethod(..., WebRequest request) {
UEL
O
f E LM
ch r e
Pour enregistrer une donnée dans une session
©A
[Link]("perso", personne,WebRequest.
SCOPE_SESSION);
H & H: Research and Training 22 / 30
Sessions
Les sessions
Pour récupérer la donnée d’une session (dans un contrôleur)
[Link]("perso",WebRequest.
SCOPE_SESSION);
H I ©
UEL
O
f E LM
ch r e
©A
H & H: Research and Training 23 / 30
Sessions
Les sessions
Pour récupérer la donnée d’une session (dans un contrôleur)
[Link]("perso",WebRequest.
SCOPE_SESSION);
H I ©
UEL
O
Pour récupérer une donnée d’une session (dans une vue)
f E LM
${ [Link] }
ch r e
©A
H & H: Research and Training 23 / 30
Sessions
Les sessions
Pour récupérer la donnée d’une session (dans un contrôleur)
[Link]("perso",WebRequest.
SCOPE_SESSION);
H I ©
UEL
O
Pour récupérer une donnée d’une session (dans une vue)
f E LM
${ [Link] }
ch r e
©A
Pour supprimer une variable session
[Link]("perso", WebRequest.
SCOPE_SESSION);
H & H: Research and Training 23 / 30
Sessions
Spring MVC 5
Avec les annotations
H I ©
U EL
on peut aussi annoter la classe par @SessionAttributes en
précisant le nom d’une variable qui O
L M sera ajoutée à une session
r e
cette variable doit être f E être annotée par
également
A
ModelAttribute ch
©
H & H: Research and Training 24 / 30
Sessions
Spring MVC 5
Exemple
@Controller
@SessionAttributes("perso")
public class ConnectionController {
H I ©
UEL
@Autowired O
E LM
private PersonneRepository personneRepository;
f
ch r e
public ©
A
@GetMapping("/connect")
String personneForm(Model model) {
[Link]("perso", new Personne());
return "connectForm";
}
H & H: Research and Training 25 / 30
Sessions
Spring MVC 5
Exemple (suite)
@PostMapping("/connect")
public String checkData(@ModelAttribute("perso") Personne personne,
BindingResult result, Model model, WebRequest request) {
List <Personne> personnes = [Link](
[Link](), [Link]());
H I ©
EL
if ([Link]() > 0) {
U
[Link]("connected", true, WebRequest.SCOPE_SESSION)
O
LM
;
return "redirect:personne";
}
r e f E
ch
return "connectForm";
©A
}
@GetMapping("/deconnect")
public String leave(WebRequest request) {
[Link]("connected", false, WebRequest.SCOPE_SESSION);
[Link]("perso", WebRequest.SCOPE_SESSION);
return "redirect:connect";
}
H & H: Research and Training 26 / 30
Sessions
Spring MVC 5
Remarque
H I ©
EL
L’objet perso récupéré du formulaire sera ajouté comme une
variable session
M OU
E
Pour bien vérifier l’ajoutf de L perso dans la session, on peut
l’objet
c
par exemple ajouter e
hr${ [Link] } dans le body de
© A
personneForm.
H & H: Research and Training 27 / 30
Sessions
Spring MVC 5
Contenu du [Link]
<%@ taglib uri="[Link]
prefix="form" %>
<!DOCTYPE html>
<html>
<head>
H I ©
<meta charset="UTF-8">
UEL
<title>Connection Form</title>
O
</head>
<body>
f E LM
ch r e
<form:form modelAttribute="perso" action="connect" method="
©A
post">
<form:label path="nom">nom</form:label>
<form:input path="nom"/>
<form:label path="prenom">prénom</form:label>
<form:input path="prenom"/>
<input type="submit" value="Connexion">
</form:form>
</body>
</html>
H & H: Research and Training 28 / 30
Sessions
Spring MVC 5
Utilisons les sessions en modifiant le body de [Link]
<body>
Bonjour ${ [Link] }
<h1>Person form</h1>
H I ©
EL
<form:form modelAttribute="personne" action="personne" method="post">
<form:label path="nom">nom</form:label>
O U
LM
<form:input path="nom"/>
<form:errors path="nom" cssClass ="error"/>
e f E
<form:label path="prenom">prénom</form:label>
r
ch
<form:input path="prenom"/>
©A
<form:errors path="prenom" cssClass ="error"/>
<input type="submit" value="Ajouter">
</form:form>
<a href="deconnect" > déconnexion </a>
</body>
H & H: Research and Training 29 / 30
Sessions
Spring MVC 5
Ne pas confondre @SessionAttributes et @SessionAttribute
@SessionAttribute permet l’utilisation d’une variable session dans
une méthode de contrôleur
H I ©
UEL
O
Exemple
f E LM
@GetMapping("/info")
ch r e
©A
public String editPersonSession(@SessionAttribute("
perso") Personne personne) {
...
[Link]("Denzel")
...
H & H: Research and Training 30 / 30