SlideShare une entreprise Scribd logo
1  sur  100
Télécharger pour lire hors ligne
Spring Boot : fondamentaux
Achref El Mouelhi
Docteur de l’université d’Aix-Marseille
Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel
elmouelhi.achref@gmail.com
H & H: Research and Training 1 / 76
Plan
1 Introduction
2 Un premier projet Spring Boot
3 Le contrôleur
4 DevTools
5 La vue
Model, ModelMap et ModelAndView
Paramètres de requête et variables de chemin
6 Le modèle
7 Thymeleaf
8 L’internationalisation (i18n)
9 Les services web Rest
H & H: Research and Training 2 / 76
Introduction
Spring Boot
Spring MVC
un des premiers framework Spring
basé sur l’API Servlet de Java JEE
permettant de simplifier le développement d’applications web en
respectant le patron de conception MVC 2
Problèmes
trop de dépendance à gérer (ce qui pose souvent un problème
d’incompatibilité entre les versions)
beaucoup de configuration (JPA, Sécurité, contrôleurs, vues...)
H & H: Research and Training 3 / 76
Introduction
Spring Boot
Spring Boot : encore de l’abstraction
Pour éviter les problèmes de Spring MVC, Spring Boot propose :
Les démarreurs (starter) : un démarreur est une dépendance,
contenant un paquet de dépendance, permettant de réaliser un
type de projet (Web, Rest...). Ainsi, le développeur n’a plus à
gérer, lui même le problème d’incompatibilité entre les versions.
l’auto-configuration : c’est-à-dire laisser Spring Boot configurer le
projet à partir de dépendances ajoutées par le développeur.
H & H: Research and Training 4 / 76
Introduction
Spring Boot
Exemple, pour créer un projet web, il faut ajouter la dépendance
Spring Boot suivante :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
H & H: Research and Training 5 / 76
Introduction
Spring Boot
Exemple, pour créer un projet web, il faut ajouter la dépendance
Spring Boot suivante :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Les démarreurs Spring Boot ont la forme
spring-boot-starter-*
H & H: Research and Training 5 / 76
Introduction
Spring Boot
Exemple, pour créer un projet web, il faut ajouter la dépendance
Spring Boot suivante :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Les démarreurs Spring Boot ont la forme
spring-boot-starter-*
Pour consulter la liste des starters, aller sur
https://docs.spring.io/spring-boot/docs/current
/reference/html/using-boot-build-systems.html
H & H: Research and Training 5 / 76
Introduction
La dépendance spring-boot-starter-web inclut les six dépendances suivantes :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
H & H: Research and Training 6 / 76
Introduction
Spring Boot
La dépendance spring-boot-starter-web permet donc de créer
un projet web contenant :
un serveur Apache Tomcat
Spring Framework et Spring MVC
les validateurs d’Hibernate
jackson pour les données sous format JSON
...
H & H: Research and Training 7 / 76
Un premier projet Spring Boot
Spring Boot
Création de projet Spring Boot
Aller dans File > New > Other
Chercher Spring, dans Spring Boot sélectionner Spring Starter Project et cli-
quer sur Next >
Saisir
first-spring-boot dans Name,
com.example dans Group,
firstspringboot dans Artifact
com.example.demo dans Package
Cliquer sur Next >
Chercher et cocher la case correspondante à Spring Web, choisir la version
2.1.11.RELEASE puis cliquer sur Next >
Valider en cliquant sur Finish
H & H: Research and Training 8 / 76
Un premier projet Spring Boot
Spring Boot
Pourquoi a-t-on coché la case Spring Web à la création du projet?
pour ajouter la dépendance spring-boot-starter-web
Contenu de la section dependencies de pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
H & H: Research and Training 9 / 76
Un premier projet Spring Boot
Spring Boot
Pour la compatibilité d’Apache Tomcat avec les JSP, on ajoute la
dépendance suivante
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
H & H: Research and Training 10 / 76
Un premier projet Spring Boot
Spring Boot
Pour la compatibilité d’Apache Tomcat avec les JSP, on ajoute la
dépendance suivante
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
Pour utiliser la JSTL, on ajoute la dépendance suivante
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
H & H: Research and Training 10 / 76
Un premier projet Spring Boot
Spring Boot
Remarques
Le package contenant le point d’entrée de notre applica-
tion (la classe contenant le public static void main) est
com.example.demo
Tous les autres packages dao, model... doivent être dans le pa-
ckage demo.
H & H: Research and Training 11 / 76
Un premier projet Spring Boot
Spring Boot
Le point de démarrage de l’application
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class FirstSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(FirstSpringBootApplication.class, args);
}
}
H & H: Research and Training 12 / 76
Un premier projet Spring Boot
Spring Boot
Explication
SpringApplication : la classe de démarrage d’une application Spring et qui va créer
une instance de la classe ApplicationContext
ApplicationContext : l’interface centrale d’une application Spring permettant de fournir
des informations de configuration à l’application.
@SpringBootApplication : contient les 3 annotations suivantes
@Configuration : fait partie du noyau de Spring Framework et
indique que la classe annoté peut contenir des méthodes annotées
par @Bean. Ainsi,Spring Container peut traiter la classe et
générer des beans qui seront utilisés par l’application.
@EnableAutoConfiguration : permet, au démarrage de
Spring, de générer automatiquement les configurations
nécessaires en fonction des dépendances ajoutées.
@ComponentScan : demande de scanner ce package contenant
de Beans de configuration
H & H: Research and Training 13 / 76
Un premier projet Spring Boot
Spring Boot
Pour exécuter
Faire un clic droit sur le projet et aller dans Run As et cliquer sur
Spring Boot App
Ou faire un clic droit sur la classe FirstSpringBootApplication
dans Package Explorer, aller dans Run As et cliquer sur Java
Application
H & H: Research and Training 14 / 76
Un premier projet Spring Boot
Spring Boot
Pour exécuter
Faire un clic droit sur le projet et aller dans Run As et cliquer sur
Spring Boot App
Ou faire un clic droit sur la classe FirstSpringBootApplication
dans Package Explorer, aller dans Run As et cliquer sur Java
Application
La console nous indique
Tomcat started on port(s): 8080 (http) with context path
’’
H & H: Research and Training 14 / 76
Un premier projet Spring Boot
Spring Boot
Pour exécuter
Faire un clic droit sur le projet et aller dans Run As et cliquer sur
Spring Boot App
Ou faire un clic droit sur la classe FirstSpringBootApplication
dans Package Explorer, aller dans Run As et cliquer sur Java
Application
La console nous indique
Tomcat started on port(s): 8080 (http) with context path
’’
Allons donc à http://localhost:8080/
H & H: Research and Training 14 / 76
Un premier projet Spring Boot
Spring Boot
Résultat : message d’erreur
On a créé un projet web, mais on n’a aucune page HTML, JSP ou
autre
Spring Boot, comme Spring MVC, implémente le patron de concep-
tion MVC, donc il nous faut au moins un contrôleur et une vue.
H & H: Research and Training 15 / 76
Le contrôleur
Spring Boot
Le contrôleur
un des composants du modèle MVC
une classe Java annotée par Controller ou RestController
Il reçoit une requête du contrôleur frontal et communique avec le
modèle pour préparer et retourner une réponse à la vue
H & H: Research and Training 16 / 76
Le contrôleur
Spring Boot
Création du contrôleur
Faire clic droit sur le projet
Aller dans New > Class
Choisir le package com.example.demo.controller
Saisir HomeController comme nom de classe
Ensuite valider
H & H: Research and Training 17 / 76
Le contrôleur
Spring Boot
Remplaçons le contenu du HomeController par le code suivant :
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class HomeController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public void sayHello() {
System.out.println("Hello World!");
}
}
H & H: Research and Training 18 / 76
Le contrôleur
Spring Boot
Explication
La première ligne indique que notre contrôleur se trouve dans le
package com.example.demo.controller
Les trois imports concernent l’utilisation des annotations
L’annotation @Controller permet de déclarer que la classe
suivante est un contrôleur Spring
La valeur de l’annotation @RequestMapping indique la route
(/hello ici) et la méthode permet d’indiquer la méthode HTTP
(get ici, c’est la méthode par défaut). On peut aussi utiliser le
raccourci @GetMapping(value = "/url")
H & H: Research and Training 19 / 76
Le contrôleur
Spring Boot
Remplaçons le contenu du HomeController par le code suivant :
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping(value = "/hello")
public void sayHello() {
System.out.println("Hello World!");
}
}
H & H: Research and Training 20 / 76
Le contrôleur
Spring Boot
Testons tout cela
Démarrer le serveur Apache Tomcat
Aller sur l’url http://localhost:8080/hello et vérifier qu’un
Hello World! a bien été affiché dans la console (d’Eclipse)
H & H: Research and Training 21 / 76
Le contrôleur
Spring Boot
Remarque
On peut aussi annoter le contrôleur par le @RequestMapping
@Controller
@RequestMapping("/hello")
public class HelloController {
...
}
H & H: Research and Training 22 / 76
DevTools
Spring Boot
DevTools
outil de développement
fonctionnant en mode développement
permettant de redémarrer le projet après chaque changement
H & H: Research and Training 23 / 76
DevTools
Spring Boot
Intégrer DevTools sous Eclipse
Faire clic droit sur le projet
Aller à Spring > Add DevTools
H & H: Research and Training 24 / 76
DevTools
Spring Boot
Intégrer DevTools sous Eclipse
Faire clic droit sur le projet
Aller à Spring > Add DevTools
Ou ajouter la dépendance Maven suivante
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
H & H: Research and Training 24 / 76
DevTools
Spring Boot
Avant utilisation, il faut
vider le cache du projet
le mettre à jour
H & H: Research and Training 25 / 76
La vue
Spring Boot
Constats
Dans une application web Spring MVC, le rôle du contrôleur n’est
pas d’afficher des informations dans la console
C’est plutôt de communiquer avec les différents composants
Afficher la réponse est le rôle de la vue
H & H: Research and Training 26 / 76
La vue
Spring Boot
Les vues sous Spring
Permettent d’afficher des données
Communiquent avec le contrôleur pour récupérer ces données
Doivent être créées dans le répertoire views dans WEB-INF
Peuvent être créées avec un simple code JSP, JSTL ou en
utilisant un moteur de template comme Thymeleaf...
H & H: Research and Training 27 / 76
La vue
Spring Boot
Par défaut
Spring cherche les vues dans un répertoire webapp situé dans src/main.
Le répertoire n’existe pas, il faut le créer.
H & H: Research and Training 28 / 76
La vue
Spring Boot
Par défaut
Spring cherche les vues dans un répertoire webapp situé dans src/main.
Le répertoire n’existe pas, il faut le créer.
Créons une première vue que nous appelons hello.jsp dans webapp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>first jsp called from controller</title>
</head>
<body>
<h1>first jsp called from controller</h1>
</body>
</html>
H & H: Research and Training 28 / 76
La vue
Spring Boot
Appelons hello.jsp à partir du contrôleur
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping
;
@Controller
public class HomeController {
@GetMapping(value = "/hello")
public String sayHello() {
return "hello.jsp";
}
}
Dans le return, on précise le nom de la vue à afficher (ici c’est
hello.jsp)
H & H: Research and Training 29 / 76
La vue
Spring Boot
Remarques
On peut préciser un autre répertoire pour les vues (il faut qu’il soit dans
webapp)
Pour éviter de préciser chaque fois l’extension de la vue, on peut
l’indiquer dans application.properties situé dans
src/main/resources
Nouveau contenu d’application.properties
spring.mvc.view.prefix=/views/
spring.mvc.view.suffix=.jsp
Toutes les propriétés possibles de application.properties sont ici :
https://docs.spring.io/spring-boot/docs/current/reference/
html/common-application-properties.html
H & H: Research and Training 30 / 76
La vue
Spring Boot
Nouveau contenu du contrôleur
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping
;
@Controller
public class HomeController {
@GetMapping(value = "/hello")
public String sayHello() {
return "hello";
}
}
N’oublions pas de déplacer hello.jsp dans views qu’il faut le créer
dans webapp
H & H: Research and Training 31 / 76
La vue Model, ModelMap et ModelAndView
Spring Boot
Deux questions
Comment passer des données d’une vue à un contrôleur et d’un
contrôleur à une vue?
Une vue peut-elle appeler un contrôleur?
H & H: Research and Training 32 / 76
La vue Model, ModelMap et ModelAndView
Spring Boot
Comment le contrôleur envoie des données à la vue?
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping
;
@Controller
public class HomeController {
@GetMapping(value = "/hello")
public String sayHello(Model model) {
model.addAttribute("nom", "Wick");
return "hello";
}
}
Dans la déclaration de la méthode, on injecte l’interface Model qui nous
permettra d’envoyer des attributs à la vue
H & H: Research and Training 33 / 76
La vue Model, ModelMap et ModelAndView
Spring Boot
Comment la vue récupère les données envoyées par le contrôleur?
<%@ page language="java" contentType="text/html; charset=
UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>first jsp called from controller</title>
</head>
<body>
<h1>first jsp called from controller</h1>
Je m’appelle ${ nom }
</body>
</html>
Exactement comme dans la plateforme JEE
H & H: Research and Training 34 / 76
La vue Model, ModelMap et ModelAndView
Spring Boot
Comment la vue récupère les données envoyées par le contrôleur?
<%@ page language="java" contentType="text/html; charset=
UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>first jsp called from controller</title>
</head>
<body>
<h1>first jsp called from controller</h1>
Je m’appelle ${ nom }
</body>
</html>
Exactement comme dans la plateforme JEE
Ajouter isELIgnored="false" s’il ne reconnait pas les Expressions de
langage
H & H: Research and Training 34 / 76
La vue Model, ModelMap et ModelAndView
Spring Boot
Une deuxième façon en utilisant ModelAndView
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.ui.ModelMap;
@Controller
public class HomeController {
@RequestMapping(value = "/hello")
public String sayHello(ModelMap model) {
model.addAttribute("nom", "Wick");
return "hello";
}
}
H & H: Research and Training 35 / 76
La vue Model, ModelMap et ModelAndView
Spring Boot
Une troisième façon en utilisant ModelAndView
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HomeController {
@RequestMapping(value = "/hello")
public ModelAndView sayHello(ModelAndView mv) {
mv.setViewName("hello");
mv.addObject("nom", "wick");
return mv;
}
}
H & H: Research and Training 36 / 76
La vue Model, ModelMap et ModelAndView
Spring Boot
Model vs ModelMap vs ModelAndView
Model : est une interface permettant d’ajouter des attributs et de
les passer à la vue
ModelMap : est une classe implémentant l’interface Map et
permettant d’ajouter des attributs sous forme de key - value
et de les passer à la vue. On peut donc chercher un élément
selon la valeur de la clé ou de la valeur
ModelAndView : est un conteneur à la fois d’un ModelMap pour
les attributs et d’un View Object. Le contrôleur pourra ainsi
retourner une seule valeur.
H & H: Research and Training 37 / 76
La vue Paramètres de requête et variables de chemin
Spring Boot
Les paramètres de requête
Ce sont les paramètres qui s’écrivent sous la forme
/chemin?param1=value1&param2=value2
H & H: Research and Training 38 / 76
La vue Paramètres de requête et variables de chemin
Spring Boot
Les paramètres de requête
Ce sont les paramètres qui s’écrivent sous la forme
/chemin?param1=value1&param2=value2
Les variables de chemin
Ce sont les paramètres qui s’écrivent sous la forme /chemin/value
H & H: Research and Training 38 / 76
La vue Paramètres de requête et variables de chemin
Spring Boot
Comment le contrôleur récupère les paramètres de requête?
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class HomeController {
@GetMapping(value = "/hello")
public String sayHello(@RequestParam(value = "nom") String
nom, Model model) {
model.addAttribute("nom", nom);
return "hello";
}
}
H & H: Research and Training 39 / 76
La vue Paramètres de requête et variables de chemin
Spring Boot
Pour tester, il faut aller sur l’URL
localhost:8080/hello?nom=wick
Explication
@RequestParam(value = "nom") String nom : permet de
récupérer la valeur du paramètre de la requête HTTP est de
l’affecter au paramètre nom de la méthode.
H & H: Research and Training 40 / 76
La vue Paramètres de requête et variables de chemin
Spring Boot
Peut-on accéder à localhost:8080/hello sans préciser le paramètre
nom?
non, une erreur sera affichée.
Mais, il est possible de rendre ce paramètre facultatif
@Controller
public class HomeController {
@GetMapping(value = "/hello")
public String sayHello(@RequestParam(value = "nom",
required = false) String nom, Model model) {
model.addAttribute("nom", nom);
return "hello";
}
}
H & H: Research and Training 41 / 76
La vue Paramètres de requête et variables de chemin
Spring Boot
Il est possible aussi de préciser une valeur par défaut
@Controller
public class HomeController {
@GetMapping(value = "/hello")
public String sayHello(@RequestParam(value = "nom",
required = false, defaultValue = "wick") String nom,
Model model) {
model.addAttribute("nom", nom);
return "hello";
}
}
H & H: Research and Training 42 / 76
La vue Paramètres de requête et variables de chemin
Spring Boot
Comment le contrôleur récupère une variable de chemin?
package com.example.demo.controller;
import org.springframework.web.bind.annotation.PathVariable;
@Controller
public class HomeController {
@GetMapping(value = "/hello/{nom}")
public String sayHello(@PathVariable String nom, Model model)
{
model.addAttribute("nom", nom);
return "hello";
}
}
Pour tester, il faut aller sur l’URL localhost:8080/hello/wick
H & H: Research and Training 43 / 76
La vue Paramètres de requête et variables de chemin
Spring Boot
Comment une vue peut faire appel à une méthode d’un contrôleur?
Soit en utilisant les formulaires et on précise la route dans l’attribut
action et la méthode dans l’attribut method
Soit en utilisant un lien hypertexte (dans ce cas la méthode est
get)
...
H & H: Research and Training 44 / 76
Le modèle
Spring Boot
Modèle : accès et traitement de données
Utilisation de JPA, Hibernate et MySQL
Précision de données de connexion dans application.properties
Utilisation des annotations (@Repository, @Service... et
@Autowired pour l’injection de dépendance)
Organisation du projet
Créons un premier répertoire com.example.demo.model dans
src/main/java où nous placerons les entités JPA
Créons un deuxième répertoire com.example.demo.dao dans
src/main/java où nous placerons les classes DAO (ou ce qu’on
appelle Repository dans Spring)
H & H: Research and Training 45 / 76
Le modèle
Spring Boot
Pour ajouter les dépendances JPA et MySQL
Faire clic droit sur le projet et aller dans Spring > Edit Starters
Cocher les cases respectives de MySQL Driver et Spring Data JPA
H & H: Research and Training 46 / 76
Le modèle
Spring Boot
Pour ajouter les dépendances JPA et MySQL
Faire clic droit sur le projet et aller dans Spring > Edit Starters
Cocher les cases respectives de MySQL Driver et Spring Data JPA
Ou ajouter les dépendances suivantes
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
H & H: Research and Training 46 / 76
Le modèle
Spring Boot
Dans application.properties, on ajoute les données concernant la connexion à la
base de données et la configuration de Hibernate
spring.datasource.url = jdbc:mysql://localhost:3306/boot?useSSL=false&
serverTimezone=UTC
spring.datasource.username = root
spring.datasource.password = root
spring.jpa.hibernate.ddl-auto = update
spring.jpa.show-sql = true
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.
MySQL5Dialect
L’ajout de la propriété spring.jpa.hibernate.naming.physical-strategy =
org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
permet de forcer Hibernate à utiliser les mêmes noms pour les tables et les colonnes que les
entités et les attributs.
H & H: Research and Training 47 / 76
Le modèle
Spring Boot
L’entité Personne
package com.example.demo.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Personne {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long num;
private String nom;
private String prenom;
public Personne() { }
public Personne(String nom, String prenom) {
this.nom = nom;
this.prenom = prenom;
}
// + getters / setters
}
H & H: Research and Training 48 / 76
Le modèle
Spring Boot
Pour obtenir le DAO, il faut créer une interface qui étend
soit CrudRepository : fournit les méthodes principales pour
faire le CRUD
soit PagingAndSortingRepository : hérite de
CrudRepository et fournit en plus des méthodes de pagination
et de tri sur les enregistrements
soit JpaRepository : hérite de
PagingAndSortingRepository en plus de certaines autres
méthodes JPA.
H & H: Research and Training 49 / 76
Le modèle
Spring Boot
Le repository
package com.example.demo.dao;
import org.springframework.data.jpa.repository.
JpaRepository;
import com.example.demo.model.Personne;
public interface PersonneRepository extends
JpaRepository <Personne, Long> {
}
Long est le type de la clé primaire (Id) de la table (entité) personnes
H & H: Research and Training 50 / 76
Le modèle
Spring Boot
Préparons une vue addPerson.jsp
<%@ page language="java" contentType="text/html; charset=
UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Index page</title>
</head>
<body>
<h2>Adding a new person</h2>
<form action="addPerson" method="post"><br>
Nom : <input type="text" name="nom"><br>
Prénom : <input type="text" name="prenom">
<button type="submit">Envoyer</button>
</form>
</body>
</html>
H & H: Research and Training 51 / 76
Le modèle
Spring Boot
Préparons le contrôleur
@Controller
public class PersonneController {
@Autowired
private PersonneRepository personneRepository;
@GetMapping(value = "/addPerson")
public String addPerson() {
return "addPerson";
}
@PostMapping(value = "/addPerson")
public ModelAndView addPerson(@RequestParam(value = "nom") String
nom, @RequestParam(value = "prenom") String prenom) {
Personne p1 = new Personne(nom,prenom);
personneRepository.save(p1);
ModelAndView mv = new ModelAndView();
mv.setViewName("confirm");
mv.addObject("nom", nom);
mv.addObject("prenom", prenom);
return mv;
}
}
H & H: Research and Training 52 / 76
Le modèle
Spring Boot
La vue confirm.jsp
<%@ page language="java" contentType="text/html;
charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Confirm page</title>
</head>
<body>
<h1>Welcome</h1>
Person named ${ nom } ${ prenom } has been
successfully added.
</body>
</html>
H & H: Research and Training 53 / 76
Le modèle
Spring Boot
Pour récupérer la liste de toutes les personnes
@GetMapping(value = "/showAll")
public ModelAndView showAll() {
ArrayList <Personne> personnes =(ArrayList<
Personne>) personneRepository.findAll();
ModelAndView mv = new ModelAndView();
mv.setViewName("result");
mv.addObject("personnes", personnes);
return mv;
}
H & H: Research and Training 54 / 76
Le modèle
Spring Boot
La vue result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Result page</title>
</head>
<body>
<h1>List of persons</h1>
<c:forEach items="${ personnes }" var="personne">
<div>
<c:out value="${ personne.prenom } ${ personne.nom }"/>
</div>
</c:forEach>
</body>
</html>
H & H: Research and Training 55 / 76
Le modèle
Spring Boot
Autres méthodes du repository
findById() : recherche selon la valeur de la clé primaire
findAllById() : recherche selon un tableau de clé primaire
deleteById() : Supprimer selon la valeur de la clé primaire
deleteAll() : supprimer tout
flush() : modifier
count(), exists(), existsById()...
H & H: Research and Training 56 / 76
Le modèle
Spring Boot
On peut aussi récupérer la liste de personnes par page
@GetMapping(value = "/showAllByPage/{i}/{j}")
public ModelAndView showAllByPage(@PathVariable int i,
@PathVariable int j) {
Page<Personne> personnes = personneRepository.findAll(
PageRequest.of(i, j));
ModelAndView mv = new ModelAndView();
mv.setViewName("result");
mv.addObject("personnes", personnes.getContent());
return mv;
}
Les variables de chemin i et j
i : le numéro de la page (première page d’indice 0)
j : le nombre de personnes par page
H & H: Research and Training 57 / 76
Le modèle
Spring Boot
Considérons le contenu suivant de la table Personne
Personne
num nom prenom
1 Durand Philippe
2 Leberre Bernard
3 Benammar Pierre
4 Hadad Karim
5 Wick John
H & H: Research and Training 58 / 76
Le modèle
Spring Boot
Considérons le contenu suivant de la table Personne
Personne
num nom prenom
1 Durand Philippe
2 Leberre Bernard
3 Benammar Pierre
4 Hadad Karim
5 Wick John
En allant sur l’URL localhost:8080/firstspringmvc/showAllByPage/1/2,
le résultat est
Personne
num nom prenom
3 Benammar Pierre
4 Hadad Karim
H & H: Research and Training 58 / 76
Le modèle
Spring Boot
On peut aussi récupérer une liste de personnes triée
@GetMapping(value = "/showAllSorted")
public ModelAndView showAllSorted() {
List<Personne> personnes = personneRepository.findAll(
Sort.by("nom").descending());
ModelAndView mv = new ModelAndView();
mv.setViewName("result");
mv.addObject("personnes", personnes);
return mv;
}
Explication
Ici on trie le résultat selon la colonne nom dans l’ordre décroissant
H & H: Research and Training 59 / 76
Le modèle
Spring Boot
Les méthodes personnalisées du repository
On peut aussi définir nos propres méthodes personnalisées dans le
repository et sans les implémenter.
H & H: Research and Training 60 / 76
Le modèle
Spring Boot
Le repository
package org.eclipse.FirstSpringMvc.dao;
import java.util.List;
import org.springframework.data.jpa.repository.
JpaRepository;
import org.eclipse.FirstSpringMvc.model.Personne;
public interface PersonneRepository extends
JpaRepository <Personne, Long> {
List<Personne> findByNomAndPrenom(String nom,
String prenom);
}
nom et prenom : des attributs qui doivent exister dans l’entité Personne.
Il faut respecter le CamelCase
H & H: Research and Training 61 / 76
Le modèle
Spring Boot
Le contrôleur
@GetMapping(value = "/showSome")
public ModelAndView showSome(@RequestParam(value =
"nom") String nom, @RequestParam(value = "prenom"
) String prenom) {
ArrayList <Personne> personnes =(ArrayList<
Personne>) personneRepository.
findByNomAndPrenom(nom, prenom);
ModelAndView mv = new ModelAndView();
mv.setViewName("result");
mv.addObject("personnes", personnes);
return mv;
}
H & H: Research and Training 62 / 76
Le modèle
Spring Boot
Dans la méthode précédente on a utilisé l’opérateur logique And
Mais, on peut aussi utiliser
Or, Between, Like, IsNull...
StartingWith, EndingWith, Containing, IgnoreCase
After, Before pour les dates
OrderBy, Not, In, NotIn
...
H & H: Research and Training 63 / 76
Le modèle
Spring Boot
Dans la méthode précédente on a utilisé l’opérateur logique And
Mais, on peut aussi utiliser
Or, Between, Like, IsNull...
StartingWith, EndingWith, Containing, IgnoreCase
After, Before pour les dates
OrderBy, Not, In, NotIn
...
Pour plus de détails : https://docs.spring.io/spring-data
/jpa/docs/current/reference/html/
H & H: Research and Training 63 / 76
Le modèle
Spring Boot
On peut également écrire des requêtes HQL (Hiberenate Query Language) avec
l’annotation Query
package org.eclipse.firstspringmvc.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
import org.eclipse.firstspringmvc.model.Personne;
public interface PersonneRepository extends JpaRepository<
Personne, Long> {
@Query("select p from Personne p where p.nom = ?1")
List<Personne> chercherSelonLeNom(String nom);
List<Personne> findByNomAndPrenom(String nom, String prenom);
}
H & H: Research and Training 64 / 76
Thymeleaf
Spring Boot
Intégrer Thymeleaf sous Eclipse
Faire clic droit sur le projet
Aller à Spring > Edit Starters
Cocher les cases respectives de Thymeleaf
H & H: Research and Training 65 / 76
Thymeleaf
Spring Boot
Intégrer Thymeleaf sous Eclipse
Faire clic droit sur le projet
Aller à Spring > Edit Starters
Cocher les cases respectives de Thymeleaf
Ou ajouter la dépendance Maven suivante
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</
artifactId>
</dependency>
H & H: Research and Training 65 / 76
Thymeleaf
Spring Boot
Gestion de vues
Créer deux répertoires : jsp et thymeleaf dans le répertoire
views de webapp
Déplacer et placer toutes les pages JSP dans jsp
Placer les vues Thymeleaf dans thymeleaf
H & H: Research and Training 66 / 76
Thymeleaf
Spring Boot
Gestion de vues
Créer deux répertoires : jsp et thymeleaf dans le répertoire
views de webapp
Déplacer et placer toutes les pages JSP dans jsp
Placer les vues Thymeleaf dans thymeleaf
Configurons application.properties
spring.view.view-names=jsp/*
spring.thymeleaf.prefix=/views/
spring.thymeleaf.suffix=.html
spring.thymeleaf.view-names=thymeleaf/*
H & H: Research and Training 66 / 76
Thymeleaf
JSP et Thymeleaf
Dans les contrôleurs, remplacer chaque appel d’une page JSP
return "nomVue";
H & H: Research and Training 67 / 76
Thymeleaf
JSP et Thymeleaf
Dans les contrôleurs, remplacer chaque appel d’une page JSP
return "nomVue";
Par
return "jsp/nomVue";
H & H: Research and Training 67 / 76
Thymeleaf
JSP et Thymeleaf
Dans les contrôleurs, remplacer chaque appel d’une page JSP
return "nomVue";
Par
return "jsp/nomVue";
Pour appeler une page Thymeleaf
return "thymeleaf/nomVue";
H & H: Research and Training 67 / 76
Thymeleaf
Spring Boot
Pour tester, créer un contrôleur ThymeleafController
@Controller
public class ThymeleafController {
@GetMapping(value = "/thymeleaf")
public String displayMessage(Model model) {
model.addAttribute("message", "Hello World!");
return "thymeleaf/index";
}
}
H & H: Research and Training 68 / 76
Thymeleaf
Spring Boot
La vue index.html
<!DOCTYPE html>
<html xmlns:th="www.thymeleaf.org">
<head>
<meta charset="ISO-8859-1">
<title>First Thymeleaf Page</title>
</head>
<body>
<p th:text = "${ message }"></p>
</body>
</html>
H & H: Research and Training 69 / 76
Thymeleaf
Spring Boot
La vue index.html
<!DOCTYPE html>
<html xmlns:th="www.thymeleaf.org">
<head>
<meta charset="ISO-8859-1">
<title>First Thymeleaf Page</title>
</head>
<body>
<p th:text = "${ message }"></p>
</body>
</html>
En allant , Hello World! est affiché
H & H: Research and Training 69 / 76
L’internationalisation (i18n)
L’internationalisation (i18n)
Préciser les sources et l’encodage de messages dans
application.properties
spring.messages.encoding=UTF-8
spring.messages.basename=messages
H & H: Research and Training 70 / 76
L’internationalisation (i18n)
L’internationalisation (i18n)
Préciser les sources et l’encodage de messages dans
application.properties
spring.messages.encoding=UTF-8
spring.messages.basename=messages
Contenu de messages.properties (dans src/main/resources)
welcome.text=Bonjour tout le monde
H & H: Research and Training 70 / 76
L’internationalisation (i18n)
L’internationalisation (i18n)
Préciser les sources et l’encodage de messages dans
application.properties
spring.messages.encoding=UTF-8
spring.messages.basename=messages
Contenu de messages.properties (dans src/main/resources)
welcome.text=Bonjour tout le monde
Contenu de messages en.properties (dans src/main/resources)
welcome.text=Hello world
H & H: Research and Training 70 / 76
L’internationalisation (i18n)
L’internationalisation (i18n)
Préciser les sources et l’encodage de messages dans
application.properties
spring.messages.encoding=UTF-8
spring.messages.basename=messages
Contenu de messages.properties (dans src/main/resources)
welcome.text=Bonjour tout le monde
Contenu de messages en.properties (dans src/main/resources)
welcome.text=Hello world
Dans une vue (Thymeleaf), ajouter
<h1 th:text = "#{ welcome.text }"></h1>
H & H: Research and Training 70 / 76
L’internationalisation (i18n)
Créons la classe de configuration MvcConfig dans com.example.demo.configuration
@Configuration
public class MvcConfig implements WebMvcConfigurer{
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver sessionLocaleResolver = new
SessionLocaleResolver();
sessionLocaleResolver.setDefaultLocale(Locale.FRANCE);
return sessionLocaleResolver;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor localeChangeInterceptor = new
LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("language");
return localeChangeInterceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
}
H & H: Research and Training 71 / 76
L’internationalisation (i18n)
L’internationalisation (i18n)
En allant sur http://localhost:8080/thymeleaf?language=en , le résultat
est :
Hello world
H & H: Research and Training 72 / 76
L’internationalisation (i18n)
L’internationalisation (i18n)
En allant sur http://localhost:8080/thymeleaf?language=en , le résultat
est :
Hello world
En allant sur http://localhost:8080/thymeleaf?language=fr , le résultat
est :
Bonjour tout le monde
H & H: Research and Training 72 / 76
L’internationalisation (i18n)
L’internationalisation (i18n)
En allant sur http://localhost:8080/thymeleaf?language=en , le résultat
est :
Hello world
En allant sur http://localhost:8080/thymeleaf?language=fr , le résultat
est :
Bonjour tout le monde
En allant sur http://localhost:8080/thymeleaf?language=it , le résultat
est toujours le même :
Bonjour tout le monde
H & H: Research and Training 72 / 76
Les services web Rest
Spring Boot
Considérons le contrôleur PersonneRestController
@RestController
public class PersonneRestController {
@Autowired
private PersonneRepository personneRepository;
@GetMapping("/personnes")
public List<Personne> getPersonnes() {
return personneRepository.findAll();
}
@GetMapping("/personnes/{id}")
public Personne getPersonne(@PathVariable("id") long id) {
return personneRepository.findById(id).orElse(null);
}
@PostMapping("/personnes")
public Personne addPersonne(@RequestBody Personne personne) {
System.out.println(personne);
return personneRepository.save(personne);
}
}
H & H: Research and Training 73 / 76
Les services web Rest
Spring Boot
Modifions le point d’entrée (qui implémentera l’interface ApplicationRunner) pour
ajouter des tuples dans la base de données avant d’appeler nos services REST
@SpringBootApplication
public class FirstSpringBootApplication implements ApplicationRunner {
@Autowired
private PersonneRepository personneRepository;
public static void main(String[] args) {
SpringApplication.run(FirstSpringBootApplication.class, args);
}
@Override
public void run(ApplicationArguments args) throws Exception {
// TODO Auto-generated method stub
Personne personne1 = new Personne("wick", "john");
Personne personne2 = new Personne("dalton", "jack");
personneRepository.save(personne1);
personneRepository.save(personne2);
}
}
H & H: Research and Training 74 / 76
Les services web Rest
Spring Boot
Pour tester
Aller sur localhost:8080/personnes
Ou sur localhost:8080/personnes/1
H & H: Research and Training 75 / 76
Les services web Rest
Spring Boot
Pour tester
Aller sur localhost:8080/personnes
Ou sur localhost:8080/personnes/1
Pour ajouter une personne
utiliser Postman en précisant la méthode POST et l’url
localhost:8080/personne
dans Headers, préciser la clé Accept et la valeur
application/json
dans Body, cocher raw et sélectionner
JSON(application/json)
H & H: Research and Training 75 / 76
Les services web Rest
Spring Boot
Propriété server.servlet.context-path de application.properties
Elle sert à définir un chemin de contexte pour un projet Spring Boot (comme dans les
applications JEE et Spring MVC)
Si on lui affecte la valeur /firstspringboot, il faudra utiliser l’URL
localhost:8080/firstspringboot/personnes pour récupérer la liste de
personnes
H & H: Research and Training 76 / 76
Les services web Rest
Spring Boot
Propriété server.servlet.context-path de application.properties
Elle sert à définir un chemin de contexte pour un projet Spring Boot (comme dans les
applications JEE et Spring MVC)
Si on lui affecte la valeur /firstspringboot, il faudra utiliser l’URL
localhost:8080/firstspringboot/personnes pour récupérer la liste de
personnes
On peut aussi modifier le chemin de contexte à partir de la classe de démarrage
@SpringBootApplication
public class FirstSpringBootApplication {
public static void main(String[] args) {
System.setProperty("server.servlet.context-path", "/firstspringboot
");
SpringApplication.run(FirstSpringBootApplication.class, args);
}
}
H & H: Research and Training 76 / 76

Contenu connexe

Similaire à cours-gratuit.com--id-12477.pdf

Asp.net Tutorials de L'application "Organizer"
Asp.net Tutorials de L'application "Organizer"Asp.net Tutorials de L'application "Organizer"
Asp.net Tutorials de L'application "Organizer"Nazih Heni
 
Application Spring MVC/IOC & Hibernate
Application Spring MVC/IOC & HibernateApplication Spring MVC/IOC & Hibernate
Application Spring MVC/IOC & HibernateInes Ouaz
 
Chapitre 1-Composants et Modules.pdf
Chapitre 1-Composants et Modules.pdfChapitre 1-Composants et Modules.pdf
Chapitre 1-Composants et Modules.pdfBoubakerMedanas
 
Chapitre 1-Composants et Modules.pdf
Chapitre 1-Composants et Modules.pdfChapitre 1-Composants et Modules.pdf
Chapitre 1-Composants et Modules.pdfBoubakerMedanas
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache MavenArnaud Héritier
 
Supervision et analyse de script batch
Supervision et analyse de script batchSupervision et analyse de script batch
Supervision et analyse de script batchschomy
 
Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Eric SIBER
 
laravel.sillo.org-Cours Laravel 10 les bases installation et organisation.pdf
laravel.sillo.org-Cours Laravel 10  les bases  installation et organisation.pdflaravel.sillo.org-Cours Laravel 10  les bases  installation et organisation.pdf
laravel.sillo.org-Cours Laravel 10 les bases installation et organisation.pdfHeartKing10
 
20100225 Ippon Osgi Are You Ready
20100225 Ippon Osgi Are You Ready20100225 Ippon Osgi Are You Ready
20100225 Ippon Osgi Are You ReadyGeoffray Gruel
 
Asp Au Service Des Mv Ps
Asp Au Service Des Mv PsAsp Au Service Des Mv Ps
Asp Au Service Des Mv PsGregory Renard
 
[Webinar] Techniques avancées de création de workflow - FR
[Webinar] Techniques avancées de création de workflow - FR[Webinar] Techniques avancées de création de workflow - FR
[Webinar] Techniques avancées de création de workflow - FRNuxeo
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonyVincent Composieux
 
SLIDES-625.1.1-IDL-4-build tools maven.pdf
SLIDES-625.1.1-IDL-4-build tools maven.pdfSLIDES-625.1.1-IDL-4-build tools maven.pdf
SLIDES-625.1.1-IDL-4-build tools maven.pdfArouNa3
 
Introduction à Symfony2
Introduction à Symfony2Introduction à Symfony2
Introduction à Symfony2Hugo Hamon
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJSVISEO
 

Similaire à cours-gratuit.com--id-12477.pdf (20)

Asp.net Tutorials de L'application "Organizer"
Asp.net Tutorials de L'application "Organizer"Asp.net Tutorials de L'application "Organizer"
Asp.net Tutorials de L'application "Organizer"
 
Application Spring MVC/IOC & Hibernate
Application Spring MVC/IOC & HibernateApplication Spring MVC/IOC & Hibernate
Application Spring MVC/IOC & Hibernate
 
Tuto spring
Tuto springTuto spring
Tuto spring
 
Chapitre 1-Composants et Modules.pdf
Chapitre 1-Composants et Modules.pdfChapitre 1-Composants et Modules.pdf
Chapitre 1-Composants et Modules.pdf
 
Chapitre 1-Composants et Modules.pdf
Chapitre 1-Composants et Modules.pdfChapitre 1-Composants et Modules.pdf
Chapitre 1-Composants et Modules.pdf
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven
 
Supervision et analyse de script batch
Supervision et analyse de script batchSupervision et analyse de script batch
Supervision et analyse de script batch
 
Spring Boot RestApi.pptx
Spring Boot RestApi.pptxSpring Boot RestApi.pptx
Spring Boot RestApi.pptx
 
Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)
 
laravel.sillo.org-Cours Laravel 10 les bases installation et organisation.pdf
laravel.sillo.org-Cours Laravel 10  les bases  installation et organisation.pdflaravel.sillo.org-Cours Laravel 10  les bases  installation et organisation.pdf
laravel.sillo.org-Cours Laravel 10 les bases installation et organisation.pdf
 
react-fr.pdf
react-fr.pdfreact-fr.pdf
react-fr.pdf
 
20100225 Ippon Osgi Are You Ready
20100225 Ippon Osgi Are You Ready20100225 Ippon Osgi Are You Ready
20100225 Ippon Osgi Are You Ready
 
Asp Au Service Des Mv Ps
Asp Au Service Des Mv PsAsp Au Service Des Mv Ps
Asp Au Service Des Mv Ps
 
Applets
AppletsApplets
Applets
 
[Webinar] Techniques avancées de création de workflow - FR
[Webinar] Techniques avancées de création de workflow - FR[Webinar] Techniques avancées de création de workflow - FR
[Webinar] Techniques avancées de création de workflow - FR
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
 
SLIDES-625.1.1-IDL-4-build tools maven.pdf
SLIDES-625.1.1-IDL-4-build tools maven.pdfSLIDES-625.1.1-IDL-4-build tools maven.pdf
SLIDES-625.1.1-IDL-4-build tools maven.pdf
 
Introduction à Symfony2
Introduction à Symfony2Introduction à Symfony2
Introduction à Symfony2
 
Formation gwt
Formation gwtFormation gwt
Formation gwt
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJS
 

cours-gratuit.com--id-12477.pdf

  • 1. Spring Boot : fondamentaux Achref El Mouelhi Docteur de l’université d’Aix-Marseille Chercheur en programmation par contrainte (IA) Ingénieur en génie logiciel elmouelhi.achref@gmail.com H & H: Research and Training 1 / 76
  • 2. Plan 1 Introduction 2 Un premier projet Spring Boot 3 Le contrôleur 4 DevTools 5 La vue Model, ModelMap et ModelAndView Paramètres de requête et variables de chemin 6 Le modèle 7 Thymeleaf 8 L’internationalisation (i18n) 9 Les services web Rest H & H: Research and Training 2 / 76
  • 3. Introduction Spring Boot Spring MVC un des premiers framework Spring basé sur l’API Servlet de Java JEE permettant de simplifier le développement d’applications web en respectant le patron de conception MVC 2 Problèmes trop de dépendance à gérer (ce qui pose souvent un problème d’incompatibilité entre les versions) beaucoup de configuration (JPA, Sécurité, contrôleurs, vues...) H & H: Research and Training 3 / 76
  • 4. Introduction Spring Boot Spring Boot : encore de l’abstraction Pour éviter les problèmes de Spring MVC, Spring Boot propose : Les démarreurs (starter) : un démarreur est une dépendance, contenant un paquet de dépendance, permettant de réaliser un type de projet (Web, Rest...). Ainsi, le développeur n’a plus à gérer, lui même le problème d’incompatibilité entre les versions. l’auto-configuration : c’est-à-dire laisser Spring Boot configurer le projet à partir de dépendances ajoutées par le développeur. H & H: Research and Training 4 / 76
  • 5. Introduction Spring Boot Exemple, pour créer un projet web, il faut ajouter la dépendance Spring Boot suivante : <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> H & H: Research and Training 5 / 76
  • 6. Introduction Spring Boot Exemple, pour créer un projet web, il faut ajouter la dépendance Spring Boot suivante : <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> Les démarreurs Spring Boot ont la forme spring-boot-starter-* H & H: Research and Training 5 / 76
  • 7. Introduction Spring Boot Exemple, pour créer un projet web, il faut ajouter la dépendance Spring Boot suivante : <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> Les démarreurs Spring Boot ont la forme spring-boot-starter-* Pour consulter la liste des starters, aller sur https://docs.spring.io/spring-boot/docs/current /reference/html/using-boot-build-systems.html H & H: Research and Training 5 / 76
  • 8. Introduction La dépendance spring-boot-starter-web inclut les six dépendances suivantes : <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-json</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> H & H: Research and Training 6 / 76
  • 9. Introduction Spring Boot La dépendance spring-boot-starter-web permet donc de créer un projet web contenant : un serveur Apache Tomcat Spring Framework et Spring MVC les validateurs d’Hibernate jackson pour les données sous format JSON ... H & H: Research and Training 7 / 76
  • 10. Un premier projet Spring Boot Spring Boot Création de projet Spring Boot Aller dans File > New > Other Chercher Spring, dans Spring Boot sélectionner Spring Starter Project et cli- quer sur Next > Saisir first-spring-boot dans Name, com.example dans Group, firstspringboot dans Artifact com.example.demo dans Package Cliquer sur Next > Chercher et cocher la case correspondante à Spring Web, choisir la version 2.1.11.RELEASE puis cliquer sur Next > Valider en cliquant sur Finish H & H: Research and Training 8 / 76
  • 11. Un premier projet Spring Boot Spring Boot Pourquoi a-t-on coché la case Spring Web à la création du projet? pour ajouter la dépendance spring-boot-starter-web Contenu de la section dependencies de pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> H & H: Research and Training 9 / 76
  • 12. Un premier projet Spring Boot Spring Boot Pour la compatibilité d’Apache Tomcat avec les JSP, on ajoute la dépendance suivante <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> H & H: Research and Training 10 / 76
  • 13. Un premier projet Spring Boot Spring Boot Pour la compatibilité d’Apache Tomcat avec les JSP, on ajoute la dépendance suivante <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> Pour utiliser la JSTL, on ajoute la dépendance suivante <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> H & H: Research and Training 10 / 76
  • 14. Un premier projet Spring Boot Spring Boot Remarques Le package contenant le point d’entrée de notre applica- tion (la classe contenant le public static void main) est com.example.demo Tous les autres packages dao, model... doivent être dans le pa- ckage demo. H & H: Research and Training 11 / 76
  • 15. Un premier projet Spring Boot Spring Boot Le point de démarrage de l’application package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class FirstSpringBootApplication { public static void main(String[] args) { SpringApplication.run(FirstSpringBootApplication.class, args); } } H & H: Research and Training 12 / 76
  • 16. Un premier projet Spring Boot Spring Boot Explication SpringApplication : la classe de démarrage d’une application Spring et qui va créer une instance de la classe ApplicationContext ApplicationContext : l’interface centrale d’une application Spring permettant de fournir des informations de configuration à l’application. @SpringBootApplication : contient les 3 annotations suivantes @Configuration : fait partie du noyau de Spring Framework et indique que la classe annoté peut contenir des méthodes annotées par @Bean. Ainsi,Spring Container peut traiter la classe et générer des beans qui seront utilisés par l’application. @EnableAutoConfiguration : permet, au démarrage de Spring, de générer automatiquement les configurations nécessaires en fonction des dépendances ajoutées. @ComponentScan : demande de scanner ce package contenant de Beans de configuration H & H: Research and Training 13 / 76
  • 17. Un premier projet Spring Boot Spring Boot Pour exécuter Faire un clic droit sur le projet et aller dans Run As et cliquer sur Spring Boot App Ou faire un clic droit sur la classe FirstSpringBootApplication dans Package Explorer, aller dans Run As et cliquer sur Java Application H & H: Research and Training 14 / 76
  • 18. Un premier projet Spring Boot Spring Boot Pour exécuter Faire un clic droit sur le projet et aller dans Run As et cliquer sur Spring Boot App Ou faire un clic droit sur la classe FirstSpringBootApplication dans Package Explorer, aller dans Run As et cliquer sur Java Application La console nous indique Tomcat started on port(s): 8080 (http) with context path ’’ H & H: Research and Training 14 / 76
  • 19. Un premier projet Spring Boot Spring Boot Pour exécuter Faire un clic droit sur le projet et aller dans Run As et cliquer sur Spring Boot App Ou faire un clic droit sur la classe FirstSpringBootApplication dans Package Explorer, aller dans Run As et cliquer sur Java Application La console nous indique Tomcat started on port(s): 8080 (http) with context path ’’ Allons donc à http://localhost:8080/ H & H: Research and Training 14 / 76
  • 20. Un premier projet Spring Boot Spring Boot Résultat : message d’erreur On a créé un projet web, mais on n’a aucune page HTML, JSP ou autre Spring Boot, comme Spring MVC, implémente le patron de concep- tion MVC, donc il nous faut au moins un contrôleur et une vue. H & H: Research and Training 15 / 76
  • 21. Le contrôleur Spring Boot Le contrôleur un des composants du modèle MVC une classe Java annotée par Controller ou RestController Il reçoit une requête du contrôleur frontal et communique avec le modèle pour préparer et retourner une réponse à la vue H & H: Research and Training 16 / 76
  • 22. Le contrôleur Spring Boot Création du contrôleur Faire clic droit sur le projet Aller dans New > Class Choisir le package com.example.demo.controller Saisir HomeController comme nom de classe Ensuite valider H & H: Research and Training 17 / 76
  • 23. Le contrôleur Spring Boot Remplaçons le contenu du HomeController par le code suivant : package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class HomeController { @RequestMapping(value = "/hello", method = RequestMethod.GET) public void sayHello() { System.out.println("Hello World!"); } } H & H: Research and Training 18 / 76
  • 24. Le contrôleur Spring Boot Explication La première ligne indique que notre contrôleur se trouve dans le package com.example.demo.controller Les trois imports concernent l’utilisation des annotations L’annotation @Controller permet de déclarer que la classe suivante est un contrôleur Spring La valeur de l’annotation @RequestMapping indique la route (/hello ici) et la méthode permet d’indiquer la méthode HTTP (get ici, c’est la méthode par défaut). On peut aussi utiliser le raccourci @GetMapping(value = "/url") H & H: Research and Training 19 / 76
  • 25. Le contrôleur Spring Boot Remplaçons le contenu du HomeController par le code suivant : package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class HomeController { @GetMapping(value = "/hello") public void sayHello() { System.out.println("Hello World!"); } } H & H: Research and Training 20 / 76
  • 26. Le contrôleur Spring Boot Testons tout cela Démarrer le serveur Apache Tomcat Aller sur l’url http://localhost:8080/hello et vérifier qu’un Hello World! a bien été affiché dans la console (d’Eclipse) H & H: Research and Training 21 / 76
  • 27. Le contrôleur Spring Boot Remarque On peut aussi annoter le contrôleur par le @RequestMapping @Controller @RequestMapping("/hello") public class HelloController { ... } H & H: Research and Training 22 / 76
  • 28. DevTools Spring Boot DevTools outil de développement fonctionnant en mode développement permettant de redémarrer le projet après chaque changement H & H: Research and Training 23 / 76
  • 29. DevTools Spring Boot Intégrer DevTools sous Eclipse Faire clic droit sur le projet Aller à Spring > Add DevTools H & H: Research and Training 24 / 76
  • 30. DevTools Spring Boot Intégrer DevTools sous Eclipse Faire clic droit sur le projet Aller à Spring > Add DevTools Ou ajouter la dépendance Maven suivante <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> H & H: Research and Training 24 / 76
  • 31. DevTools Spring Boot Avant utilisation, il faut vider le cache du projet le mettre à jour H & H: Research and Training 25 / 76
  • 32. La vue Spring Boot Constats Dans une application web Spring MVC, le rôle du contrôleur n’est pas d’afficher des informations dans la console C’est plutôt de communiquer avec les différents composants Afficher la réponse est le rôle de la vue H & H: Research and Training 26 / 76
  • 33. La vue Spring Boot Les vues sous Spring Permettent d’afficher des données Communiquent avec le contrôleur pour récupérer ces données Doivent être créées dans le répertoire views dans WEB-INF Peuvent être créées avec un simple code JSP, JSTL ou en utilisant un moteur de template comme Thymeleaf... H & H: Research and Training 27 / 76
  • 34. La vue Spring Boot Par défaut Spring cherche les vues dans un répertoire webapp situé dans src/main. Le répertoire n’existe pas, il faut le créer. H & H: Research and Training 28 / 76
  • 35. La vue Spring Boot Par défaut Spring cherche les vues dans un répertoire webapp situé dans src/main. Le répertoire n’existe pas, il faut le créer. Créons une première vue que nous appelons hello.jsp dans webapp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>first jsp called from controller</title> </head> <body> <h1>first jsp called from controller</h1> </body> </html> H & H: Research and Training 28 / 76
  • 36. La vue Spring Boot Appelons hello.jsp à partir du contrôleur package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping ; @Controller public class HomeController { @GetMapping(value = "/hello") public String sayHello() { return "hello.jsp"; } } Dans le return, on précise le nom de la vue à afficher (ici c’est hello.jsp) H & H: Research and Training 29 / 76
  • 37. La vue Spring Boot Remarques On peut préciser un autre répertoire pour les vues (il faut qu’il soit dans webapp) Pour éviter de préciser chaque fois l’extension de la vue, on peut l’indiquer dans application.properties situé dans src/main/resources Nouveau contenu d’application.properties spring.mvc.view.prefix=/views/ spring.mvc.view.suffix=.jsp Toutes les propriétés possibles de application.properties sont ici : https://docs.spring.io/spring-boot/docs/current/reference/ html/common-application-properties.html H & H: Research and Training 30 / 76
  • 38. La vue Spring Boot Nouveau contenu du contrôleur package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping ; @Controller public class HomeController { @GetMapping(value = "/hello") public String sayHello() { return "hello"; } } N’oublions pas de déplacer hello.jsp dans views qu’il faut le créer dans webapp H & H: Research and Training 31 / 76
  • 39. La vue Model, ModelMap et ModelAndView Spring Boot Deux questions Comment passer des données d’une vue à un contrôleur et d’un contrôleur à une vue? Une vue peut-elle appeler un contrôleur? H & H: Research and Training 32 / 76
  • 40. La vue Model, ModelMap et ModelAndView Spring Boot Comment le contrôleur envoie des données à la vue? package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping ; @Controller public class HomeController { @GetMapping(value = "/hello") public String sayHello(Model model) { model.addAttribute("nom", "Wick"); return "hello"; } } Dans la déclaration de la méthode, on injecte l’interface Model qui nous permettra d’envoyer des attributs à la vue H & H: Research and Training 33 / 76
  • 41. La vue Model, ModelMap et ModelAndView Spring Boot Comment la vue récupère les données envoyées par le contrôleur? <%@ page language="java" contentType="text/html; charset= UTF-8" pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>first jsp called from controller</title> </head> <body> <h1>first jsp called from controller</h1> Je m’appelle ${ nom } </body> </html> Exactement comme dans la plateforme JEE H & H: Research and Training 34 / 76
  • 42. La vue Model, ModelMap et ModelAndView Spring Boot Comment la vue récupère les données envoyées par le contrôleur? <%@ page language="java" contentType="text/html; charset= UTF-8" pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>first jsp called from controller</title> </head> <body> <h1>first jsp called from controller</h1> Je m’appelle ${ nom } </body> </html> Exactement comme dans la plateforme JEE Ajouter isELIgnored="false" s’il ne reconnait pas les Expressions de langage H & H: Research and Training 34 / 76
  • 43. La vue Model, ModelMap et ModelAndView Spring Boot Une deuxième façon en utilisant ModelAndView package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.ui.ModelMap; @Controller public class HomeController { @RequestMapping(value = "/hello") public String sayHello(ModelMap model) { model.addAttribute("nom", "Wick"); return "hello"; } } H & H: Research and Training 35 / 76
  • 44. La vue Model, ModelMap et ModelAndView Spring Boot Une troisième façon en utilisant ModelAndView package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class HomeController { @RequestMapping(value = "/hello") public ModelAndView sayHello(ModelAndView mv) { mv.setViewName("hello"); mv.addObject("nom", "wick"); return mv; } } H & H: Research and Training 36 / 76
  • 45. La vue Model, ModelMap et ModelAndView Spring Boot Model vs ModelMap vs ModelAndView Model : est une interface permettant d’ajouter des attributs et de les passer à la vue ModelMap : est une classe implémentant l’interface Map et permettant d’ajouter des attributs sous forme de key - value et de les passer à la vue. On peut donc chercher un élément selon la valeur de la clé ou de la valeur ModelAndView : est un conteneur à la fois d’un ModelMap pour les attributs et d’un View Object. Le contrôleur pourra ainsi retourner une seule valeur. H & H: Research and Training 37 / 76
  • 46. La vue Paramètres de requête et variables de chemin Spring Boot Les paramètres de requête Ce sont les paramètres qui s’écrivent sous la forme /chemin?param1=value1&param2=value2 H & H: Research and Training 38 / 76
  • 47. La vue Paramètres de requête et variables de chemin Spring Boot Les paramètres de requête Ce sont les paramètres qui s’écrivent sous la forme /chemin?param1=value1&param2=value2 Les variables de chemin Ce sont les paramètres qui s’écrivent sous la forme /chemin/value H & H: Research and Training 38 / 76
  • 48. La vue Paramètres de requête et variables de chemin Spring Boot Comment le contrôleur récupère les paramètres de requête? package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class HomeController { @GetMapping(value = "/hello") public String sayHello(@RequestParam(value = "nom") String nom, Model model) { model.addAttribute("nom", nom); return "hello"; } } H & H: Research and Training 39 / 76
  • 49. La vue Paramètres de requête et variables de chemin Spring Boot Pour tester, il faut aller sur l’URL localhost:8080/hello?nom=wick Explication @RequestParam(value = "nom") String nom : permet de récupérer la valeur du paramètre de la requête HTTP est de l’affecter au paramètre nom de la méthode. H & H: Research and Training 40 / 76
  • 50. La vue Paramètres de requête et variables de chemin Spring Boot Peut-on accéder à localhost:8080/hello sans préciser le paramètre nom? non, une erreur sera affichée. Mais, il est possible de rendre ce paramètre facultatif @Controller public class HomeController { @GetMapping(value = "/hello") public String sayHello(@RequestParam(value = "nom", required = false) String nom, Model model) { model.addAttribute("nom", nom); return "hello"; } } H & H: Research and Training 41 / 76
  • 51. La vue Paramètres de requête et variables de chemin Spring Boot Il est possible aussi de préciser une valeur par défaut @Controller public class HomeController { @GetMapping(value = "/hello") public String sayHello(@RequestParam(value = "nom", required = false, defaultValue = "wick") String nom, Model model) { model.addAttribute("nom", nom); return "hello"; } } H & H: Research and Training 42 / 76
  • 52. La vue Paramètres de requête et variables de chemin Spring Boot Comment le contrôleur récupère une variable de chemin? package com.example.demo.controller; import org.springframework.web.bind.annotation.PathVariable; @Controller public class HomeController { @GetMapping(value = "/hello/{nom}") public String sayHello(@PathVariable String nom, Model model) { model.addAttribute("nom", nom); return "hello"; } } Pour tester, il faut aller sur l’URL localhost:8080/hello/wick H & H: Research and Training 43 / 76
  • 53. La vue Paramètres de requête et variables de chemin Spring Boot Comment une vue peut faire appel à une méthode d’un contrôleur? Soit en utilisant les formulaires et on précise la route dans l’attribut action et la méthode dans l’attribut method Soit en utilisant un lien hypertexte (dans ce cas la méthode est get) ... H & H: Research and Training 44 / 76
  • 54. Le modèle Spring Boot Modèle : accès et traitement de données Utilisation de JPA, Hibernate et MySQL Précision de données de connexion dans application.properties Utilisation des annotations (@Repository, @Service... et @Autowired pour l’injection de dépendance) Organisation du projet Créons un premier répertoire com.example.demo.model dans src/main/java où nous placerons les entités JPA Créons un deuxième répertoire com.example.demo.dao dans src/main/java où nous placerons les classes DAO (ou ce qu’on appelle Repository dans Spring) H & H: Research and Training 45 / 76
  • 55. Le modèle Spring Boot Pour ajouter les dépendances JPA et MySQL Faire clic droit sur le projet et aller dans Spring > Edit Starters Cocher les cases respectives de MySQL Driver et Spring Data JPA H & H: Research and Training 46 / 76
  • 56. Le modèle Spring Boot Pour ajouter les dépendances JPA et MySQL Faire clic droit sur le projet et aller dans Spring > Edit Starters Cocher les cases respectives de MySQL Driver et Spring Data JPA Ou ajouter les dépendances suivantes <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> H & H: Research and Training 46 / 76
  • 57. Le modèle Spring Boot Dans application.properties, on ajoute les données concernant la connexion à la base de données et la configuration de Hibernate spring.datasource.url = jdbc:mysql://localhost:3306/boot?useSSL=false& serverTimezone=UTC spring.datasource.username = root spring.datasource.password = root spring.jpa.hibernate.ddl-auto = update spring.jpa.show-sql = true spring.jpa.properties.hibernate.dialect = org.hibernate.dialect. MySQL5Dialect L’ajout de la propriété spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl permet de forcer Hibernate à utiliser les mêmes noms pour les tables et les colonnes que les entités et les attributs. H & H: Research and Training 47 / 76
  • 58. Le modèle Spring Boot L’entité Personne package com.example.demo.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Personne { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long num; private String nom; private String prenom; public Personne() { } public Personne(String nom, String prenom) { this.nom = nom; this.prenom = prenom; } // + getters / setters } H & H: Research and Training 48 / 76
  • 59. Le modèle Spring Boot Pour obtenir le DAO, il faut créer une interface qui étend soit CrudRepository : fournit les méthodes principales pour faire le CRUD soit PagingAndSortingRepository : hérite de CrudRepository et fournit en plus des méthodes de pagination et de tri sur les enregistrements soit JpaRepository : hérite de PagingAndSortingRepository en plus de certaines autres méthodes JPA. H & H: Research and Training 49 / 76
  • 60. Le modèle Spring Boot Le repository package com.example.demo.dao; import org.springframework.data.jpa.repository. JpaRepository; import com.example.demo.model.Personne; public interface PersonneRepository extends JpaRepository <Personne, Long> { } Long est le type de la clé primaire (Id) de la table (entité) personnes H & H: Research and Training 50 / 76
  • 61. Le modèle Spring Boot Préparons une vue addPerson.jsp <%@ page language="java" contentType="text/html; charset= UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Index page</title> </head> <body> <h2>Adding a new person</h2> <form action="addPerson" method="post"><br> Nom : <input type="text" name="nom"><br> Prénom : <input type="text" name="prenom"> <button type="submit">Envoyer</button> </form> </body> </html> H & H: Research and Training 51 / 76
  • 62. Le modèle Spring Boot Préparons le contrôleur @Controller public class PersonneController { @Autowired private PersonneRepository personneRepository; @GetMapping(value = "/addPerson") public String addPerson() { return "addPerson"; } @PostMapping(value = "/addPerson") public ModelAndView addPerson(@RequestParam(value = "nom") String nom, @RequestParam(value = "prenom") String prenom) { Personne p1 = new Personne(nom,prenom); personneRepository.save(p1); ModelAndView mv = new ModelAndView(); mv.setViewName("confirm"); mv.addObject("nom", nom); mv.addObject("prenom", prenom); return mv; } } H & H: Research and Training 52 / 76
  • 63. Le modèle Spring Boot La vue confirm.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Confirm page</title> </head> <body> <h1>Welcome</h1> Person named ${ nom } ${ prenom } has been successfully added. </body> </html> H & H: Research and Training 53 / 76
  • 64. Le modèle Spring Boot Pour récupérer la liste de toutes les personnes @GetMapping(value = "/showAll") public ModelAndView showAll() { ArrayList <Personne> personnes =(ArrayList< Personne>) personneRepository.findAll(); ModelAndView mv = new ModelAndView(); mv.setViewName("result"); mv.addObject("personnes", personnes); return mv; } H & H: Research and Training 54 / 76
  • 65. Le modèle Spring Boot La vue result.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Result page</title> </head> <body> <h1>List of persons</h1> <c:forEach items="${ personnes }" var="personne"> <div> <c:out value="${ personne.prenom } ${ personne.nom }"/> </div> </c:forEach> </body> </html> H & H: Research and Training 55 / 76
  • 66. Le modèle Spring Boot Autres méthodes du repository findById() : recherche selon la valeur de la clé primaire findAllById() : recherche selon un tableau de clé primaire deleteById() : Supprimer selon la valeur de la clé primaire deleteAll() : supprimer tout flush() : modifier count(), exists(), existsById()... H & H: Research and Training 56 / 76
  • 67. Le modèle Spring Boot On peut aussi récupérer la liste de personnes par page @GetMapping(value = "/showAllByPage/{i}/{j}") public ModelAndView showAllByPage(@PathVariable int i, @PathVariable int j) { Page<Personne> personnes = personneRepository.findAll( PageRequest.of(i, j)); ModelAndView mv = new ModelAndView(); mv.setViewName("result"); mv.addObject("personnes", personnes.getContent()); return mv; } Les variables de chemin i et j i : le numéro de la page (première page d’indice 0) j : le nombre de personnes par page H & H: Research and Training 57 / 76
  • 68. Le modèle Spring Boot Considérons le contenu suivant de la table Personne Personne num nom prenom 1 Durand Philippe 2 Leberre Bernard 3 Benammar Pierre 4 Hadad Karim 5 Wick John H & H: Research and Training 58 / 76
  • 69. Le modèle Spring Boot Considérons le contenu suivant de la table Personne Personne num nom prenom 1 Durand Philippe 2 Leberre Bernard 3 Benammar Pierre 4 Hadad Karim 5 Wick John En allant sur l’URL localhost:8080/firstspringmvc/showAllByPage/1/2, le résultat est Personne num nom prenom 3 Benammar Pierre 4 Hadad Karim H & H: Research and Training 58 / 76
  • 70. Le modèle Spring Boot On peut aussi récupérer une liste de personnes triée @GetMapping(value = "/showAllSorted") public ModelAndView showAllSorted() { List<Personne> personnes = personneRepository.findAll( Sort.by("nom").descending()); ModelAndView mv = new ModelAndView(); mv.setViewName("result"); mv.addObject("personnes", personnes); return mv; } Explication Ici on trie le résultat selon la colonne nom dans l’ordre décroissant H & H: Research and Training 59 / 76
  • 71. Le modèle Spring Boot Les méthodes personnalisées du repository On peut aussi définir nos propres méthodes personnalisées dans le repository et sans les implémenter. H & H: Research and Training 60 / 76
  • 72. Le modèle Spring Boot Le repository package org.eclipse.FirstSpringMvc.dao; import java.util.List; import org.springframework.data.jpa.repository. JpaRepository; import org.eclipse.FirstSpringMvc.model.Personne; public interface PersonneRepository extends JpaRepository <Personne, Long> { List<Personne> findByNomAndPrenom(String nom, String prenom); } nom et prenom : des attributs qui doivent exister dans l’entité Personne. Il faut respecter le CamelCase H & H: Research and Training 61 / 76
  • 73. Le modèle Spring Boot Le contrôleur @GetMapping(value = "/showSome") public ModelAndView showSome(@RequestParam(value = "nom") String nom, @RequestParam(value = "prenom" ) String prenom) { ArrayList <Personne> personnes =(ArrayList< Personne>) personneRepository. findByNomAndPrenom(nom, prenom); ModelAndView mv = new ModelAndView(); mv.setViewName("result"); mv.addObject("personnes", personnes); return mv; } H & H: Research and Training 62 / 76
  • 74. Le modèle Spring Boot Dans la méthode précédente on a utilisé l’opérateur logique And Mais, on peut aussi utiliser Or, Between, Like, IsNull... StartingWith, EndingWith, Containing, IgnoreCase After, Before pour les dates OrderBy, Not, In, NotIn ... H & H: Research and Training 63 / 76
  • 75. Le modèle Spring Boot Dans la méthode précédente on a utilisé l’opérateur logique And Mais, on peut aussi utiliser Or, Between, Like, IsNull... StartingWith, EndingWith, Containing, IgnoreCase After, Before pour les dates OrderBy, Not, In, NotIn ... Pour plus de détails : https://docs.spring.io/spring-data /jpa/docs/current/reference/html/ H & H: Research and Training 63 / 76
  • 76. Le modèle Spring Boot On peut également écrire des requêtes HQL (Hiberenate Query Language) avec l’annotation Query package org.eclipse.firstspringmvc.dao; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import java.util.List; import org.eclipse.firstspringmvc.model.Personne; public interface PersonneRepository extends JpaRepository< Personne, Long> { @Query("select p from Personne p where p.nom = ?1") List<Personne> chercherSelonLeNom(String nom); List<Personne> findByNomAndPrenom(String nom, String prenom); } H & H: Research and Training 64 / 76
  • 77. Thymeleaf Spring Boot Intégrer Thymeleaf sous Eclipse Faire clic droit sur le projet Aller à Spring > Edit Starters Cocher les cases respectives de Thymeleaf H & H: Research and Training 65 / 76
  • 78. Thymeleaf Spring Boot Intégrer Thymeleaf sous Eclipse Faire clic droit sur le projet Aller à Spring > Edit Starters Cocher les cases respectives de Thymeleaf Ou ajouter la dépendance Maven suivante <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</ artifactId> </dependency> H & H: Research and Training 65 / 76
  • 79. Thymeleaf Spring Boot Gestion de vues Créer deux répertoires : jsp et thymeleaf dans le répertoire views de webapp Déplacer et placer toutes les pages JSP dans jsp Placer les vues Thymeleaf dans thymeleaf H & H: Research and Training 66 / 76
  • 80. Thymeleaf Spring Boot Gestion de vues Créer deux répertoires : jsp et thymeleaf dans le répertoire views de webapp Déplacer et placer toutes les pages JSP dans jsp Placer les vues Thymeleaf dans thymeleaf Configurons application.properties spring.view.view-names=jsp/* spring.thymeleaf.prefix=/views/ spring.thymeleaf.suffix=.html spring.thymeleaf.view-names=thymeleaf/* H & H: Research and Training 66 / 76
  • 81. Thymeleaf JSP et Thymeleaf Dans les contrôleurs, remplacer chaque appel d’une page JSP return "nomVue"; H & H: Research and Training 67 / 76
  • 82. Thymeleaf JSP et Thymeleaf Dans les contrôleurs, remplacer chaque appel d’une page JSP return "nomVue"; Par return "jsp/nomVue"; H & H: Research and Training 67 / 76
  • 83. Thymeleaf JSP et Thymeleaf Dans les contrôleurs, remplacer chaque appel d’une page JSP return "nomVue"; Par return "jsp/nomVue"; Pour appeler une page Thymeleaf return "thymeleaf/nomVue"; H & H: Research and Training 67 / 76
  • 84. Thymeleaf Spring Boot Pour tester, créer un contrôleur ThymeleafController @Controller public class ThymeleafController { @GetMapping(value = "/thymeleaf") public String displayMessage(Model model) { model.addAttribute("message", "Hello World!"); return "thymeleaf/index"; } } H & H: Research and Training 68 / 76
  • 85. Thymeleaf Spring Boot La vue index.html <!DOCTYPE html> <html xmlns:th="www.thymeleaf.org"> <head> <meta charset="ISO-8859-1"> <title>First Thymeleaf Page</title> </head> <body> <p th:text = "${ message }"></p> </body> </html> H & H: Research and Training 69 / 76
  • 86. Thymeleaf Spring Boot La vue index.html <!DOCTYPE html> <html xmlns:th="www.thymeleaf.org"> <head> <meta charset="ISO-8859-1"> <title>First Thymeleaf Page</title> </head> <body> <p th:text = "${ message }"></p> </body> </html> En allant , Hello World! est affiché H & H: Research and Training 69 / 76
  • 87. L’internationalisation (i18n) L’internationalisation (i18n) Préciser les sources et l’encodage de messages dans application.properties spring.messages.encoding=UTF-8 spring.messages.basename=messages H & H: Research and Training 70 / 76
  • 88. L’internationalisation (i18n) L’internationalisation (i18n) Préciser les sources et l’encodage de messages dans application.properties spring.messages.encoding=UTF-8 spring.messages.basename=messages Contenu de messages.properties (dans src/main/resources) welcome.text=Bonjour tout le monde H & H: Research and Training 70 / 76
  • 89. L’internationalisation (i18n) L’internationalisation (i18n) Préciser les sources et l’encodage de messages dans application.properties spring.messages.encoding=UTF-8 spring.messages.basename=messages Contenu de messages.properties (dans src/main/resources) welcome.text=Bonjour tout le monde Contenu de messages en.properties (dans src/main/resources) welcome.text=Hello world H & H: Research and Training 70 / 76
  • 90. L’internationalisation (i18n) L’internationalisation (i18n) Préciser les sources et l’encodage de messages dans application.properties spring.messages.encoding=UTF-8 spring.messages.basename=messages Contenu de messages.properties (dans src/main/resources) welcome.text=Bonjour tout le monde Contenu de messages en.properties (dans src/main/resources) welcome.text=Hello world Dans une vue (Thymeleaf), ajouter <h1 th:text = "#{ welcome.text }"></h1> H & H: Research and Training 70 / 76
  • 91. L’internationalisation (i18n) Créons la classe de configuration MvcConfig dans com.example.demo.configuration @Configuration public class MvcConfig implements WebMvcConfigurer{ @Bean public LocaleResolver localeResolver() { SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver(); sessionLocaleResolver.setDefaultLocale(Locale.FRANCE); return sessionLocaleResolver; } @Bean public LocaleChangeInterceptor localeChangeInterceptor() { LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); localeChangeInterceptor.setParamName("language"); return localeChangeInterceptor; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(localeChangeInterceptor()); } } H & H: Research and Training 71 / 76
  • 92. L’internationalisation (i18n) L’internationalisation (i18n) En allant sur http://localhost:8080/thymeleaf?language=en , le résultat est : Hello world H & H: Research and Training 72 / 76
  • 93. L’internationalisation (i18n) L’internationalisation (i18n) En allant sur http://localhost:8080/thymeleaf?language=en , le résultat est : Hello world En allant sur http://localhost:8080/thymeleaf?language=fr , le résultat est : Bonjour tout le monde H & H: Research and Training 72 / 76
  • 94. L’internationalisation (i18n) L’internationalisation (i18n) En allant sur http://localhost:8080/thymeleaf?language=en , le résultat est : Hello world En allant sur http://localhost:8080/thymeleaf?language=fr , le résultat est : Bonjour tout le monde En allant sur http://localhost:8080/thymeleaf?language=it , le résultat est toujours le même : Bonjour tout le monde H & H: Research and Training 72 / 76
  • 95. Les services web Rest Spring Boot Considérons le contrôleur PersonneRestController @RestController public class PersonneRestController { @Autowired private PersonneRepository personneRepository; @GetMapping("/personnes") public List<Personne> getPersonnes() { return personneRepository.findAll(); } @GetMapping("/personnes/{id}") public Personne getPersonne(@PathVariable("id") long id) { return personneRepository.findById(id).orElse(null); } @PostMapping("/personnes") public Personne addPersonne(@RequestBody Personne personne) { System.out.println(personne); return personneRepository.save(personne); } } H & H: Research and Training 73 / 76
  • 96. Les services web Rest Spring Boot Modifions le point d’entrée (qui implémentera l’interface ApplicationRunner) pour ajouter des tuples dans la base de données avant d’appeler nos services REST @SpringBootApplication public class FirstSpringBootApplication implements ApplicationRunner { @Autowired private PersonneRepository personneRepository; public static void main(String[] args) { SpringApplication.run(FirstSpringBootApplication.class, args); } @Override public void run(ApplicationArguments args) throws Exception { // TODO Auto-generated method stub Personne personne1 = new Personne("wick", "john"); Personne personne2 = new Personne("dalton", "jack"); personneRepository.save(personne1); personneRepository.save(personne2); } } H & H: Research and Training 74 / 76
  • 97. Les services web Rest Spring Boot Pour tester Aller sur localhost:8080/personnes Ou sur localhost:8080/personnes/1 H & H: Research and Training 75 / 76
  • 98. Les services web Rest Spring Boot Pour tester Aller sur localhost:8080/personnes Ou sur localhost:8080/personnes/1 Pour ajouter une personne utiliser Postman en précisant la méthode POST et l’url localhost:8080/personne dans Headers, préciser la clé Accept et la valeur application/json dans Body, cocher raw et sélectionner JSON(application/json) H & H: Research and Training 75 / 76
  • 99. Les services web Rest Spring Boot Propriété server.servlet.context-path de application.properties Elle sert à définir un chemin de contexte pour un projet Spring Boot (comme dans les applications JEE et Spring MVC) Si on lui affecte la valeur /firstspringboot, il faudra utiliser l’URL localhost:8080/firstspringboot/personnes pour récupérer la liste de personnes H & H: Research and Training 76 / 76
  • 100. Les services web Rest Spring Boot Propriété server.servlet.context-path de application.properties Elle sert à définir un chemin de contexte pour un projet Spring Boot (comme dans les applications JEE et Spring MVC) Si on lui affecte la valeur /firstspringboot, il faudra utiliser l’URL localhost:8080/firstspringboot/personnes pour récupérer la liste de personnes On peut aussi modifier le chemin de contexte à partir de la classe de démarrage @SpringBootApplication public class FirstSpringBootApplication { public static void main(String[] args) { System.setProperty("server.servlet.context-path", "/firstspringboot "); SpringApplication.run(FirstSpringBootApplication.class, args); } } H & H: Research and Training 76 / 76