SlideShare une entreprise Scribd logo
Spring Boot : les 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
Mai 2018, M2I Aix en Provence 1 / 72
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
Mai 2018, M2I Aix en Provence 2 / 72
Introduction
Spring Boot : Introduction
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...)
Mai 2018, M2I Aix en Provence 3 / 72
Introduction
Spring Boot : Introduction
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.
Mai 2018, M2I Aix en Provence 4 / 72
Introduction
Spring Boot : Introduction
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>
Mai 2018, M2I Aix en Provence 5 / 72
Introduction
Spring Boot : Introduction
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-*
Mai 2018, M2I Aix en Provence 5 / 72
Introduction
Spring Boot : Introduction
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
Mai 2018, M2I Aix en Provence 5 / 72
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>
Mai 2018, M2I Aix en Provence 6 / 72
Introduction
Spring Boot : Introduction
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
...
Mai 2018, M2I Aix en Provence 7 / 72
Un premier projet Spring Boot
Spring Boot : les fondamentaux
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
FirstSpringBoot dans Name,
com.spring dans Group,
FirstSpringBoot dans Artifact
com.spring.demo dans Package
Cliquer sur Next >
Chercher et cocher les cases correspondantes aux Web puis cliquer sur Next >
Valider en cliquant sur Finish
Mai 2018, M2I Aix en Provence 8 / 72
Un premier projet Spring Boot
Spring Boot : les fondamentaux
Pourquoi a-t-on coché la case 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>
Mai 2018, M2I Aix en Provence 9 / 72
Un premier projet Spring Boot
Spring Boot : les fondamentaux
Pour la compatibilité d’Apache Tomcat avec les JSP, on ajoute la
dépendance suivante
<!-- https://mvnrepository.com/artifact/org.apache.
tomcat/tomcat-jasper -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jasper</artifactId>
<version>9.0.12</version>
</dependency>
La version d’Apache Tomcat doit être la même que celles qui existent
dans Maven Dependencies
Mai 2018, M2I Aix en Provence 10 / 72
Un premier projet Spring Boot
Spring Boot : les fondamentaux
Remarques
Le package contenant le point d’entrée de notre applica-
tion (la classe contenant le public static void main) est
com.spring.demo
Tous les autres packages dao, model... doivent être dans le pa-
ckage demo.
Mai 2018, M2I Aix en Provence 11 / 72
Un premier projet Spring Boot
Spring Boot : les fondamentaux
Le point de démarrage de l’application
package com.spring.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);
}
}
Mai 2018, M2I Aix en Provence 12 / 72
Un premier projet Spring Boot
Spring Boot : les fondamentaux
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
Mai 2018, M2I Aix en Provence 13 / 72
Un premier projet Spring Boot
Spring Boot : les fondamentaux
Pour exécuter
Faire un clic droit sur FirstSpringBoot dans Package
Explorer
Aller dans Run As et cliquer sur Spring Boot App
Mai 2018, M2I Aix en Provence 14 / 72
Un premier projet Spring Boot
Spring Boot : les fondamentaux
Pour exécuter
Faire un clic droit sur FirstSpringBoot dans Package
Explorer
Aller dans Run As et cliquer sur Spring Boot App
La console nous indique
Tomcat started on port(s): 8080 (http) with context
path ’’
Mai 2018, M2I Aix en Provence 14 / 72
Un premier projet Spring Boot
Spring Boot : les fondamentaux
Pour exécuter
Faire un clic droit sur FirstSpringBoot dans Package
Explorer
Aller dans Run As et cliquer sur Spring Boot App
La console nous indique
Tomcat started on port(s): 8080 (http) with context
path ’’
Allons donc à http://localhost:8080/
Mai 2018, M2I Aix en Provence 14 / 72
Un premier projet Spring Boot
Spring Boot : les fondamentaux
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.
Mai 2018, M2I Aix en Provence 15 / 72
Le contrôleur
Le contrôleur
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
Mai 2018, M2I Aix en Provence 16 / 72
Le contrôleur
Le contrôleur
Création du contrôleur
Faire clic droit sur le projet
Aller dans new > class
Choisir le package com.spring.demo.controller
Saisir HomeController comme nom de classe
Ensuite valider
Mai 2018, M2I Aix en Provence 17 / 72
Le contrôleur
Le contrôleur
Remplaçons le contenu du HomeController par le code suivant :
package com.spring.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!");
}
}
Mai 2018, M2I Aix en Provence 18 / 72
Le contrôleur
Le contrôleur
Explication
La première ligne indique que notre contrôleur se trouve dans le
package com.spring.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")
Mai 2018, M2I Aix en Provence 19 / 72
Le contrôleur
Le contrôleur
Remplaçons le contenu du HomeController par le code suivant :
package com.spring.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!");
}
}
Mai 2018, M2I Aix en Provence 20 / 72
Le contrôleur
Le contrôleur
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)
Mai 2018, M2I Aix en Provence 21 / 72
Le contrôleur
Le contrôleur
Remarque
On peut aussi annoter le contrôleur par le @RequestMapping
@Controller
@RequestMapping("/hello")
public class HelloController {
...
}
Mai 2018, M2I Aix en Provence 22 / 72
DevTools
DevTools
DevTools
outil de développement
fonctionnant en mode développement
permettant de redémarrer le projet après chaque changement
Mai 2018, M2I Aix en Provence 23 / 72
DevTools
DevTools
DevTools
outil de développement
fonctionnant en mode développement
permettant de redémarrer le projet après chaque changement
Dépendance Maven à ajouter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
Mai 2018, M2I Aix en Provence 23 / 72
DevTools
Devtools
Avant utilisation, il faut
vider le cache du projet
le mettre à jour
Mai 2018, M2I Aix en Provence 24 / 72
La vue
Les vues
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
Mai 2018, M2I Aix en Provence 25 / 72
La vue
Les vues
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...
Mai 2018, M2I Aix en Provence 26 / 72
La vue
Les vues
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.
Mai 2018, M2I Aix en Provence 27 / 72
La vue
Les vues
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"%>
<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>
</body>
</html>
Mai 2018, M2I Aix en Provence 27 / 72
La vue
Les vues
Appelons hello.jsp à partir du contrôleur
package com.spring.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)
Mai 2018, M2I Aix en Provence 28 / 72
La vue
Les vues
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
Mai 2018, M2I Aix en Provence 29 / 72
La vue
Les vues
Nouveau contenu du contrôleur
package com.spring.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
Mai 2018, M2I Aix en Provence 30 / 72
La vue Model, ModelMap et ModelAndView
Les vues
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?
Mai 2018, M2I Aix en Provence 31 / 72
La vue Model, ModelMap et ModelAndView
Les vues
Comment le contrôleur envoie des données à la vue?
package com.spring.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
Mai 2018, M2I Aix en Provence 32 / 72
La vue Model, ModelMap et ModelAndView
Les vues
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
Mai 2018, M2I Aix en Provence 33 / 72
La vue Model, ModelMap et ModelAndView
Les vues
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
Mai 2018, M2I Aix en Provence 33 / 72
La vue Model, ModelMap et ModelAndView
Les vues
Une deuxième façon en utilisant ModelAndView
package com.spring.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";
}
}
Mai 2018, M2I Aix en Provence 34 / 72
La vue Model, ModelMap et ModelAndView
Les vues
Une troisième façon en utilisant ModelAndView
package com.spring.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;
}
}
Mai 2018, M2I Aix en Provence 35 / 72
La vue Model, ModelMap et ModelAndView
Les vues
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.
Mai 2018, M2I Aix en Provence 36 / 72
La vue Paramètres de requête et variables de chemin
Les paramètres de requête et les variables de chemin
Les paramètres de requête
Ce sont les paramètres qui s’écrivent sous la forme
/chemin?param1=value1&param2=value2
Mai 2018, M2I Aix en Provence 37 / 72
La vue Paramètres de requête et variables de chemin
Les paramètres de requête et les variables de chemin
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
Mai 2018, M2I Aix en Provence 37 / 72
La vue Paramètres de requête et variables de chemin
Les paramètres de requête et les variables de chemin
Comment le contrôleur récupère les paramètres de requête?
package com.spring.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";
}
}
Mai 2018, M2I Aix en Provence 38 / 72
La vue Paramètres de requête et variables de chemin
Les paramètres de requête et les variables de chemin
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.
Mai 2018, M2I Aix en Provence 39 / 72
La vue Paramètres de requête et variables de chemin
Les paramètres de requête et les variables de chemin
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";
}
}
Mai 2018, M2I Aix en Provence 40 / 72
La vue Paramètres de requête et variables de chemin
Les paramètres de requête et les variables de chemin
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";
}
}
Mai 2018, M2I Aix en Provence 41 / 72
La vue Paramètres de requête et variables de chemin
Les paramètres de requête et les variables de chemin
Comment le contrôleur récupère une variable de chemin?
package com.spring.demo.controller;
import org.springframework.web.bind.annotation.PathVariable;
@Controller
public class HomeController {
@GetMapping(value = "/hello/{nom}")
public void sayHello(@PathVariable String nom, Model model) {
model.addAttribute("nom", nom);
return "hello";
}
}
Pour tester, il faut aller sur l’URL localhost:8080/hello/wick
Mai 2018, M2I Aix en Provence 42 / 72
La vue Paramètres de requête et variables de chemin
Les vues
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)
...
Mai 2018, M2I Aix en Provence 43 / 72
Le modèle
Le modèle
Modèle : accès et traitement de données
Utilisation de JPA et Hibernate
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.spring.demo.model dans
src/main/java où nous placerons les entités JPA
Créons un deuxième répertoire com.spring.demo.dao dans
src/main/java où nous placerons les classes DAO (ou ce qu’on
appelle Repository dans Spring)
Mai 2018, M2I Aix en Provence 44 / 72
Le modèle
Le modèle
On commence par 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>
Mai 2018, M2I Aix en Provence 45 / 72
Le modèle
Le modèle
On commence par 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>
Et si on veut intégrer le modèle dès la création du projet
Dans ce cas, il faut cocher les cases respectives de MySQL et JPA et Web
Mai 2018, M2I Aix en Provence 45 / 72
Le modèle
Le modèle
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/myBase?useUnicode=
true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=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
Cette partie (?useUnicode=true&useJDBCCompliantTimezoneShift=true
&useLegacyDatetimeCode=false&serverTimezone=UTC) dans la chaı̂ne de connexion
est ajoutée pour éviter un bug du connecteur MySQL concernant l’heure système.
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.
Mai 2018, M2I Aix en Provence 46 / 72
Le modèle
L’entité Personne
package com.spring.demo.model;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.
GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "personnes")
public class Personne implements
Serializable {
@Id @GeneratedValue
private Long num;
private String nom;
private String prenom;
private static final long
serialVersionUID = 1L;
public Personne() { }
public Personne(String nom,
String prenom) {
this.nom = nom;
this.prenom = prenom;
}
public Long getNum() {
return num;
}
public void setNum(Long num) {
this.num = num;
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public String getPrenom() {
return prenom;
}
public void setPrenom(String
prenom) {
this.prenom = prenom;
}
}
Mai 2018, M2I Aix en Provence 47 / 72
Le modèle
Le modèle
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.
Mai 2018, M2I Aix en Provence 48 / 72
Le modèle
Le modèle
Le repository
package com.spring.demo.dao;
import java.util.List;
import org.springframework.data.jpa.repository.
JpaRepository;
import com.spring.demo.model.Personne;
public interface PersonneRepository extends
JpaRepository <Personne, Long> {
}
Long est le type de la clé primaire (Id) de la table (entité) personnes
Mai 2018, M2I Aix en Provence 49 / 72
Le modèle
Le modèle
Préparons le formulaire dans addPerson.jsp
<%@ page language="java" contentType="text/html;
charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<title>Index page</title>
</head>
<body>
<h2>To add new person</h2>
<form action="add" method="post">
Nom : <input type="text" name="nom">
Prenom : <input type="text" name="prenom">
<button type="submit">Envoyer</button>
</form>
</body>
</html>
Mai 2018, M2I Aix en Provence 50 / 72
Le modèle
Le modèle
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;
}
}
Mai 2018, M2I Aix en Provence 51 / 72
Le modèle
Le modèle
Préparons la vue confirm.jsp
<%@ page language="java" contentType="text/html;
charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<title>Confirm page</title>
</head>
<body>
<h1>Welcome</h1>
Person named ${ nom } ${ prenom } has been
successfully added in our database.
</body>
</html>
Mai 2018, M2I Aix en Provence 52 / 72
Le modèle
Le modèle
Et si on veut récupérer la liste de toutes les personnes?
@RequestMapping(value="/show")
public ModelAndView showAll() {
ArrayList <Personne> al =(ArrayList<Personne>)
personneRepository.findAll();
ModelAndView mv = new ModelAndView();
mv.setViewName("result");
mv.addObject("tab", al);
return mv;
}
Mai 2018, M2I Aix en Provence 53 / 72
Le modèle
Le modèle
Et la vue result.jsp :
<%
ArrayList <Personne> al = (ArrayList <Personne>)
request.getAttribute("tab");
for(Personne p: al){
out.print("Hello " + p.getNom() + " " + p.
getPrenom());
}
%>
Mai 2018, M2I Aix en Provence 54 / 72
Le modèle
Le modèle
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()...
Mai 2018, M2I Aix en Provence 55 / 72
Le modèle
Le modèle
On peut aussi récupérer la liste de personnes par page
@RequestMapping(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("tab", 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
Mai 2018, M2I Aix en Provence 56 / 72
Le modèle
Le modèle
On peut aussi récupérer une liste de personnes triée
@RequestMapping(value="/showAllSorted")
public ModelAndView showAllSorted() {
List<Personne> personnes = personneRepository.findAll(
Sort.by("nom").descending());
ModelAndView mv = new ModelAndView();
mv.setViewName("result");
mv.addObject("tab", personnes);
return mv;
}
Explication
Ici on trie le résultat selon la colonne nom dans l’ordre décroissant
Mai 2018, M2I Aix en Provence 57 / 72
Le modèle
Le modèle
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.
Mai 2018, M2I Aix en Provence 58 / 72
Le modèle
Le modèle
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
Mai 2018, M2I Aix en Provence 59 / 72
Le modèle
Le modèle
Le contrôleur
@RequestMapping(value="/showSome")
public ModelAndView showSome(@RequestParam(value =
"nom") String nom, @RequestParam(value = "prenom"
) String prenom) {
ArrayList <Personne> al =(ArrayList<Personne>)
personneRepository.findByNomAndPrenom(nom,
prenom);
ModelAndView mv = new ModelAndView();
mv.setViewName("result");
mv.addObject("tab", al);
return mv;
}
Mai 2018, M2I Aix en Provence 60 / 72
Le modèle
Le modèle
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
...
Mai 2018, M2I Aix en Provence 61 / 72
Le modèle
Le modèle
On peut également écrire des requêtes HQL (Hiberenate Query
Language) avec l’annotation Query
package com.spring.demo.dao;
import java.util.List;
import org.springframework.data.jpa.repository.
JpaRepository;
import com.spring.demo.model.Personne;
public interface PersonneRepository extends
JpaRepository <Personne, Long> {
@Query("select p from Personne p where p.nom = ?1"
)
Personne findByNom(String nom);
}
Mai 2018, M2I Aix en Provence 62 / 72
Thymeleaf
Thymeleaf
Dépendance Maven à ajouter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</
artifactId>
</dependency>
Mai 2018, M2I Aix en Provence 63 / 72
Thymeleaf
Thymeleaf
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
Mai 2018, M2I Aix en Provence 64 / 72
Thymeleaf
Thymeleaf
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/*
Mai 2018, M2I Aix en Provence 64 / 72
Thymeleaf
JSP et Thymeleaf
Dans les contrôleurs, remplacer chaque appel d’une page JSP
return "nomVue";
Mai 2018, M2I Aix en Provence 65 / 72
Thymeleaf
JSP et Thymeleaf
Dans les contrôleurs, remplacer chaque appel d’une page JSP
return "nomVue";
Par
return "jsp/nomVue";
Mai 2018, M2I Aix en Provence 65 / 72
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";
Mai 2018, M2I Aix en Provence 65 / 72
Thymeleaf
Thymeleaf
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";
}
}
Mai 2018, M2I Aix en Provence 66 / 72
Thymeleaf
Thymeleaf
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>
Mai 2018, M2I Aix en Provence 67 / 72
Thymeleaf
Thymeleaf
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é
Mai 2018, M2I Aix en Provence 67 / 72
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
Mai 2018, M2I Aix en Provence 68 / 72
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
Mai 2018, M2I Aix en Provence 68 / 72
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
Mai 2018, M2I Aix en Provence 68 / 72
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>
Mai 2018, M2I Aix en Provence 68 / 72
L’internationalisation (i18n)
Créons la classe de configuration MvcConfig dans com.spring.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());
}
}
Mai 2018, M2I Aix en Provence 69 / 72
L’internationalisation (i18n)
L’internationalisation (i18n)
En allant sur http://localhost:8080/thymeleaf?language=en , le résultat
est :
Hello world
Mai 2018, M2I Aix en Provence 70 / 72
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
Mai 2018, M2I Aix en Provence 70 / 72
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
Mai 2018, M2I Aix en Provence 70 / 72
Les services web Rest
Spring Boot & REST
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") int id) {
return personneRepository.findById(id).orElse(null);
}
@PostMapping("/personnes")
public Personne addPersonne(@RequestBody Personne personne) {
System.out.println(personne);
return personneRepository.save(personne);
}
}
Mai 2018, M2I Aix en Provence 71 / 72
Les services web Rest
Spring Boot & REST
Pour tester
Aller sur localhost:8080/personnes
Ou sur localhost:8080/personnes/1
Mai 2018, M2I Aix en Provence 72 / 72
Les services web Rest
Spring Boot & REST
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)
Mai 2018, M2I Aix en Provence 72 / 72

Contenu connexe

Tendances

Introduction à Angular
Introduction à AngularIntroduction à Angular
Introduction à Angular
Jean-Baptiste Vigneron
 
Support POO Java Deuxième Partie
Support POO Java Deuxième PartieSupport POO Java Deuxième Partie
Support POO Java Deuxième Partie
ENSET, Université Hassan II Casablanca
 
Fondamentaux java
Fondamentaux javaFondamentaux java
Fondamentaux java
Ines Ouaz
 
Support de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfiSupport de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfi
ENSET, Université Hassan II Casablanca
 
Servlets et JSP
Servlets et JSPServlets et JSP
Servlets et JSP
Heithem Abbes
 
Support Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFISupport Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFI
ENSET, Université Hassan II Casablanca
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring Boot
DNG Consulting
 
Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdf
slimyaich3
 
Support JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.YoussfiSupport JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.Youssfi
ENSET, Université Hassan II Casablanca
 
Rapport j2ee: Gestion d’un compte bancaire En utilisant les EJB 3.0
Rapport j2ee: Gestion d’un compte bancaire En utilisant les EJB 3.0Rapport j2ee: Gestion d’un compte bancaire En utilisant les EJB 3.0
Rapport j2ee: Gestion d’un compte bancaire En utilisant les EJB 3.0
Ayoub Rouzi
 
Support POO Java première partie
Support POO Java première partieSupport POO Java première partie
Support POO Java première partie
ENSET, Université Hassan II Casablanca
 
Tp1 - WS avec JAXWS
Tp1 - WS avec JAXWSTp1 - WS avec JAXWS
Tp1 - WS avec JAXWS
Lilia Sfaxi
 
Support de cours entrepise java beans ejb m.youssfi
Support de cours entrepise java beans ejb m.youssfiSupport de cours entrepise java beans ejb m.youssfi
Support de cours entrepise java beans ejb m.youssfi
ENSET, Université Hassan II Casablanca
 
React-cours.pdf
React-cours.pdfReact-cours.pdf
React-cours.pdf
Jaouad Assabbour
 
A la découverte de vue.js
A la découverte de vue.jsA la découverte de vue.js
A la découverte de vue.js
Bruno Bonnin
 
Mini projet individuel php
Mini projet individuel phpMini projet individuel php
Mini projet individuel phpKhadim Mbacké
 
Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4
ENSET, Université Hassan II Casablanca
 
Support JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVCSupport JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVC
ENSET, Université Hassan II Casablanca
 
Sécurité des Applications WEB -LEVEL1
 Sécurité des Applications WEB-LEVEL1 Sécurité des Applications WEB-LEVEL1
Sécurité des Applications WEB -LEVEL1Tarek MOHAMED
 
Support Java Avancé Troisième Partie
Support Java Avancé Troisième PartieSupport Java Avancé Troisième Partie
Support Java Avancé Troisième Partie
ENSET, Université Hassan II Casablanca
 

Tendances (20)

Introduction à Angular
Introduction à AngularIntroduction à Angular
Introduction à Angular
 
Support POO Java Deuxième Partie
Support POO Java Deuxième PartieSupport POO Java Deuxième Partie
Support POO Java Deuxième Partie
 
Fondamentaux java
Fondamentaux javaFondamentaux java
Fondamentaux java
 
Support de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfiSupport de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfi
 
Servlets et JSP
Servlets et JSPServlets et JSP
Servlets et JSP
 
Support Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFISupport Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFI
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring Boot
 
Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdf
 
Support JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.YoussfiSupport JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.Youssfi
 
Rapport j2ee: Gestion d’un compte bancaire En utilisant les EJB 3.0
Rapport j2ee: Gestion d’un compte bancaire En utilisant les EJB 3.0Rapport j2ee: Gestion d’un compte bancaire En utilisant les EJB 3.0
Rapport j2ee: Gestion d’un compte bancaire En utilisant les EJB 3.0
 
Support POO Java première partie
Support POO Java première partieSupport POO Java première partie
Support POO Java première partie
 
Tp1 - WS avec JAXWS
Tp1 - WS avec JAXWSTp1 - WS avec JAXWS
Tp1 - WS avec JAXWS
 
Support de cours entrepise java beans ejb m.youssfi
Support de cours entrepise java beans ejb m.youssfiSupport de cours entrepise java beans ejb m.youssfi
Support de cours entrepise java beans ejb m.youssfi
 
React-cours.pdf
React-cours.pdfReact-cours.pdf
React-cours.pdf
 
A la découverte de vue.js
A la découverte de vue.jsA la découverte de vue.js
A la découverte de vue.js
 
Mini projet individuel php
Mini projet individuel phpMini projet individuel php
Mini projet individuel php
 
Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4
 
Support JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVCSupport JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVC
 
Sécurité des Applications WEB -LEVEL1
 Sécurité des Applications WEB-LEVEL1 Sécurité des Applications WEB-LEVEL1
Sécurité des Applications WEB -LEVEL1
 
Support Java Avancé Troisième Partie
Support Java Avancé Troisième PartieSupport Java Avancé Troisième Partie
Support Java Avancé Troisième Partie
 

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

cours-gratuit.com--id-12477.pdf
cours-gratuit.com--id-12477.pdfcours-gratuit.com--id-12477.pdf
cours-gratuit.com--id-12477.pdf
ssuser192642
 
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
 
spring-boot-fr.pdf
spring-boot-fr.pdfspring-boot-fr.pdf
spring-boot-fr.pdf
seydou4devops
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
Atsé François-Xavier KOBON
 
Le Développement d’une Application Web
Le Développement d’une Application WebLe Développement d’une Application Web
Le Développement d’une Application WebMalick Mbaye
 
Developpement dun site_web_developpement
Developpement dun site_web_developpementDeveloppement dun site_web_developpement
Developpement dun site_web_developpement
mosalah38
 
Developpement_dun_site_web_Developpement.pdf
Developpement_dun_site_web_Developpement.pdfDeveloppement_dun_site_web_Developpement.pdf
Developpement_dun_site_web_Developpement.pdf
SofianeHassine2
 
Utilisation d'une api web avec asp
Utilisation d'une api web avec aspUtilisation d'une api web avec asp
Utilisation d'une api web avec aspNovencia Groupe
 
Presentation Spring, Spring MVC
Presentation Spring, Spring MVCPresentation Spring, Spring MVC
Presentation Spring, Spring MVCNathaniel Richand
 
Geek Time Mai 2017 : Vue.js
Geek Time Mai 2017 : Vue.jsGeek Time Mai 2017 : Vue.js
Geek Time Mai 2017 : Vue.js
OLBATI
 
Sécurisation des applications ASP.NET
Sécurisation des applications ASP.NETSécurisation des applications ASP.NET
Sécurisation des applications ASP.NET
Mohammed Amine Mostefai
 
[Tuto] Big datatrack : Web Tracker
[Tuto] Big datatrack : Web Tracker[Tuto] Big datatrack : Web Tracker
[Tuto] Big datatrack : Web Tracker
Microsoft Technet France
 
gestion Comptes Bancaire SpringBoot-Exemple.pdf
gestion Comptes Bancaire SpringBoot-Exemple.pdfgestion Comptes Bancaire SpringBoot-Exemple.pdf
gestion Comptes Bancaire SpringBoot-Exemple.pdf
MohamedHassoun11
 
Formation gwt
Formation gwtFormation gwt
Formation gwt
Francois ANDRE
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven
Arnaud Héritier
 
VueJS.pptx
VueJS.pptxVueJS.pptx
VueJS.pptx
BouaggadAmine
 
Paul valery et les Web components
Paul valery et les Web componentsPaul valery et les Web components
Paul valery et les Web components
Francois ANDRE
 
Support cours angular
Support cours angularSupport cours angular
Support cours angular
Nizar MAATOUG -ISET Sidi Bouzid
 
Integration continue et déploiement automatisé
Integration continue et déploiement automatiséIntegration continue et déploiement automatisé
Integration continue et déploiement automatisé
Jérémie Campari
 
Introduction aux web components
Introduction aux web componentsIntroduction aux web components
Introduction aux web components
Francois ANDRE
 

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

cours-gratuit.com--id-12477.pdf
cours-gratuit.com--id-12477.pdfcours-gratuit.com--id-12477.pdf
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"
 
spring-boot-fr.pdf
spring-boot-fr.pdfspring-boot-fr.pdf
spring-boot-fr.pdf
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
 
Le Développement d’une Application Web
Le Développement d’une Application WebLe Développement d’une Application Web
Le Développement d’une Application Web
 
Developpement dun site_web_developpement
Developpement dun site_web_developpementDeveloppement dun site_web_developpement
Developpement dun site_web_developpement
 
Developpement_dun_site_web_Developpement.pdf
Developpement_dun_site_web_Developpement.pdfDeveloppement_dun_site_web_Developpement.pdf
Developpement_dun_site_web_Developpement.pdf
 
Utilisation d'une api web avec asp
Utilisation d'une api web avec aspUtilisation d'une api web avec asp
Utilisation d'une api web avec asp
 
Presentation Spring, Spring MVC
Presentation Spring, Spring MVCPresentation Spring, Spring MVC
Presentation Spring, Spring MVC
 
Geek Time Mai 2017 : Vue.js
Geek Time Mai 2017 : Vue.jsGeek Time Mai 2017 : Vue.js
Geek Time Mai 2017 : Vue.js
 
Sécurisation des applications ASP.NET
Sécurisation des applications ASP.NETSécurisation des applications ASP.NET
Sécurisation des applications ASP.NET
 
[Tuto] Big datatrack : Web Tracker
[Tuto] Big datatrack : Web Tracker[Tuto] Big datatrack : Web Tracker
[Tuto] Big datatrack : Web Tracker
 
gestion Comptes Bancaire SpringBoot-Exemple.pdf
gestion Comptes Bancaire SpringBoot-Exemple.pdfgestion Comptes Bancaire SpringBoot-Exemple.pdf
gestion Comptes Bancaire SpringBoot-Exemple.pdf
 
Formation gwt
Formation gwtFormation gwt
Formation gwt
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven
 
VueJS.pptx
VueJS.pptxVueJS.pptx
VueJS.pptx
 
Paul valery et les Web components
Paul valery et les Web componentsPaul valery et les Web components
Paul valery et les Web components
 
Support cours angular
Support cours angularSupport cours angular
Support cours angular
 
Integration continue et déploiement automatisé
Integration continue et déploiement automatiséIntegration continue et déploiement automatisé
Integration continue et déploiement automatisé
 
Introduction aux web components
Introduction aux web componentsIntroduction aux web components
Introduction aux web components
 

cours-gratuit.com--id-4422.pdf

  • 1. Spring Boot : les 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 Mai 2018, M2I Aix en Provence 1 / 72
  • 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 Mai 2018, M2I Aix en Provence 2 / 72
  • 3. Introduction Spring Boot : Introduction 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...) Mai 2018, M2I Aix en Provence 3 / 72
  • 4. Introduction Spring Boot : Introduction 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. Mai 2018, M2I Aix en Provence 4 / 72
  • 5. Introduction Spring Boot : Introduction 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> Mai 2018, M2I Aix en Provence 5 / 72
  • 6. Introduction Spring Boot : Introduction 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-* Mai 2018, M2I Aix en Provence 5 / 72
  • 7. Introduction Spring Boot : Introduction 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 Mai 2018, M2I Aix en Provence 5 / 72
  • 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> Mai 2018, M2I Aix en Provence 6 / 72
  • 9. Introduction Spring Boot : Introduction 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 ... Mai 2018, M2I Aix en Provence 7 / 72
  • 10. Un premier projet Spring Boot Spring Boot : les fondamentaux 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 FirstSpringBoot dans Name, com.spring dans Group, FirstSpringBoot dans Artifact com.spring.demo dans Package Cliquer sur Next > Chercher et cocher les cases correspondantes aux Web puis cliquer sur Next > Valider en cliquant sur Finish Mai 2018, M2I Aix en Provence 8 / 72
  • 11. Un premier projet Spring Boot Spring Boot : les fondamentaux Pourquoi a-t-on coché la case 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> Mai 2018, M2I Aix en Provence 9 / 72
  • 12. Un premier projet Spring Boot Spring Boot : les fondamentaux Pour la compatibilité d’Apache Tomcat avec les JSP, on ajoute la dépendance suivante <!-- https://mvnrepository.com/artifact/org.apache. tomcat/tomcat-jasper --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jasper</artifactId> <version>9.0.12</version> </dependency> La version d’Apache Tomcat doit être la même que celles qui existent dans Maven Dependencies Mai 2018, M2I Aix en Provence 10 / 72
  • 13. Un premier projet Spring Boot Spring Boot : les fondamentaux Remarques Le package contenant le point d’entrée de notre applica- tion (la classe contenant le public static void main) est com.spring.demo Tous les autres packages dao, model... doivent être dans le pa- ckage demo. Mai 2018, M2I Aix en Provence 11 / 72
  • 14. Un premier projet Spring Boot Spring Boot : les fondamentaux Le point de démarrage de l’application package com.spring.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); } } Mai 2018, M2I Aix en Provence 12 / 72
  • 15. Un premier projet Spring Boot Spring Boot : les fondamentaux 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 Mai 2018, M2I Aix en Provence 13 / 72
  • 16. Un premier projet Spring Boot Spring Boot : les fondamentaux Pour exécuter Faire un clic droit sur FirstSpringBoot dans Package Explorer Aller dans Run As et cliquer sur Spring Boot App Mai 2018, M2I Aix en Provence 14 / 72
  • 17. Un premier projet Spring Boot Spring Boot : les fondamentaux Pour exécuter Faire un clic droit sur FirstSpringBoot dans Package Explorer Aller dans Run As et cliquer sur Spring Boot App La console nous indique Tomcat started on port(s): 8080 (http) with context path ’’ Mai 2018, M2I Aix en Provence 14 / 72
  • 18. Un premier projet Spring Boot Spring Boot : les fondamentaux Pour exécuter Faire un clic droit sur FirstSpringBoot dans Package Explorer Aller dans Run As et cliquer sur Spring Boot App La console nous indique Tomcat started on port(s): 8080 (http) with context path ’’ Allons donc à http://localhost:8080/ Mai 2018, M2I Aix en Provence 14 / 72
  • 19. Un premier projet Spring Boot Spring Boot : les fondamentaux 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. Mai 2018, M2I Aix en Provence 15 / 72
  • 20. Le contrôleur Le contrôleur 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 Mai 2018, M2I Aix en Provence 16 / 72
  • 21. Le contrôleur Le contrôleur Création du contrôleur Faire clic droit sur le projet Aller dans new > class Choisir le package com.spring.demo.controller Saisir HomeController comme nom de classe Ensuite valider Mai 2018, M2I Aix en Provence 17 / 72
  • 22. Le contrôleur Le contrôleur Remplaçons le contenu du HomeController par le code suivant : package com.spring.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!"); } } Mai 2018, M2I Aix en Provence 18 / 72
  • 23. Le contrôleur Le contrôleur Explication La première ligne indique que notre contrôleur se trouve dans le package com.spring.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") Mai 2018, M2I Aix en Provence 19 / 72
  • 24. Le contrôleur Le contrôleur Remplaçons le contenu du HomeController par le code suivant : package com.spring.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!"); } } Mai 2018, M2I Aix en Provence 20 / 72
  • 25. Le contrôleur Le contrôleur 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) Mai 2018, M2I Aix en Provence 21 / 72
  • 26. Le contrôleur Le contrôleur Remarque On peut aussi annoter le contrôleur par le @RequestMapping @Controller @RequestMapping("/hello") public class HelloController { ... } Mai 2018, M2I Aix en Provence 22 / 72
  • 27. DevTools DevTools DevTools outil de développement fonctionnant en mode développement permettant de redémarrer le projet après chaque changement Mai 2018, M2I Aix en Provence 23 / 72
  • 28. DevTools DevTools DevTools outil de développement fonctionnant en mode développement permettant de redémarrer le projet après chaque changement Dépendance Maven à ajouter <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> Mai 2018, M2I Aix en Provence 23 / 72
  • 29. DevTools Devtools Avant utilisation, il faut vider le cache du projet le mettre à jour Mai 2018, M2I Aix en Provence 24 / 72
  • 30. La vue Les vues 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 Mai 2018, M2I Aix en Provence 25 / 72
  • 31. La vue Les vues 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... Mai 2018, M2I Aix en Provence 26 / 72
  • 32. La vue Les vues 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. Mai 2018, M2I Aix en Provence 27 / 72
  • 33. La vue Les vues 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"%> <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> </body> </html> Mai 2018, M2I Aix en Provence 27 / 72
  • 34. La vue Les vues Appelons hello.jsp à partir du contrôleur package com.spring.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) Mai 2018, M2I Aix en Provence 28 / 72
  • 35. La vue Les vues 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 Mai 2018, M2I Aix en Provence 29 / 72
  • 36. La vue Les vues Nouveau contenu du contrôleur package com.spring.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 Mai 2018, M2I Aix en Provence 30 / 72
  • 37. La vue Model, ModelMap et ModelAndView Les vues 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? Mai 2018, M2I Aix en Provence 31 / 72
  • 38. La vue Model, ModelMap et ModelAndView Les vues Comment le contrôleur envoie des données à la vue? package com.spring.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 Mai 2018, M2I Aix en Provence 32 / 72
  • 39. La vue Model, ModelMap et ModelAndView Les vues 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 Mai 2018, M2I Aix en Provence 33 / 72
  • 40. La vue Model, ModelMap et ModelAndView Les vues 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 Mai 2018, M2I Aix en Provence 33 / 72
  • 41. La vue Model, ModelMap et ModelAndView Les vues Une deuxième façon en utilisant ModelAndView package com.spring.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"; } } Mai 2018, M2I Aix en Provence 34 / 72
  • 42. La vue Model, ModelMap et ModelAndView Les vues Une troisième façon en utilisant ModelAndView package com.spring.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; } } Mai 2018, M2I Aix en Provence 35 / 72
  • 43. La vue Model, ModelMap et ModelAndView Les vues 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. Mai 2018, M2I Aix en Provence 36 / 72
  • 44. La vue Paramètres de requête et variables de chemin Les paramètres de requête et les variables de chemin Les paramètres de requête Ce sont les paramètres qui s’écrivent sous la forme /chemin?param1=value1&param2=value2 Mai 2018, M2I Aix en Provence 37 / 72
  • 45. La vue Paramètres de requête et variables de chemin Les paramètres de requête et les variables de chemin 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 Mai 2018, M2I Aix en Provence 37 / 72
  • 46. La vue Paramètres de requête et variables de chemin Les paramètres de requête et les variables de chemin Comment le contrôleur récupère les paramètres de requête? package com.spring.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"; } } Mai 2018, M2I Aix en Provence 38 / 72
  • 47. La vue Paramètres de requête et variables de chemin Les paramètres de requête et les variables de chemin 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. Mai 2018, M2I Aix en Provence 39 / 72
  • 48. La vue Paramètres de requête et variables de chemin Les paramètres de requête et les variables de chemin 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"; } } Mai 2018, M2I Aix en Provence 40 / 72
  • 49. La vue Paramètres de requête et variables de chemin Les paramètres de requête et les variables de chemin 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"; } } Mai 2018, M2I Aix en Provence 41 / 72
  • 50. La vue Paramètres de requête et variables de chemin Les paramètres de requête et les variables de chemin Comment le contrôleur récupère une variable de chemin? package com.spring.demo.controller; import org.springframework.web.bind.annotation.PathVariable; @Controller public class HomeController { @GetMapping(value = "/hello/{nom}") public void sayHello(@PathVariable String nom, Model model) { model.addAttribute("nom", nom); return "hello"; } } Pour tester, il faut aller sur l’URL localhost:8080/hello/wick Mai 2018, M2I Aix en Provence 42 / 72
  • 51. La vue Paramètres de requête et variables de chemin Les vues 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) ... Mai 2018, M2I Aix en Provence 43 / 72
  • 52. Le modèle Le modèle Modèle : accès et traitement de données Utilisation de JPA et Hibernate 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.spring.demo.model dans src/main/java où nous placerons les entités JPA Créons un deuxième répertoire com.spring.demo.dao dans src/main/java où nous placerons les classes DAO (ou ce qu’on appelle Repository dans Spring) Mai 2018, M2I Aix en Provence 44 / 72
  • 53. Le modèle Le modèle On commence par 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> Mai 2018, M2I Aix en Provence 45 / 72
  • 54. Le modèle Le modèle On commence par 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> Et si on veut intégrer le modèle dès la création du projet Dans ce cas, il faut cocher les cases respectives de MySQL et JPA et Web Mai 2018, M2I Aix en Provence 45 / 72
  • 55. Le modèle Le modèle 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/myBase?useUnicode= true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=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 Cette partie (?useUnicode=true&useJDBCCompliantTimezoneShift=true &useLegacyDatetimeCode=false&serverTimezone=UTC) dans la chaı̂ne de connexion est ajoutée pour éviter un bug du connecteur MySQL concernant l’heure système. 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. Mai 2018, M2I Aix en Provence 46 / 72
  • 56. Le modèle L’entité Personne package com.spring.demo.model; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence. GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "personnes") public class Personne implements Serializable { @Id @GeneratedValue private Long num; private String nom; private String prenom; private static final long serialVersionUID = 1L; public Personne() { } public Personne(String nom, String prenom) { this.nom = nom; this.prenom = prenom; } public Long getNum() { return num; } public void setNum(Long num) { this.num = num; } public String getNom() { return nom; } public void setNom(String nom) { this.nom = nom; } public String getPrenom() { return prenom; } public void setPrenom(String prenom) { this.prenom = prenom; } } Mai 2018, M2I Aix en Provence 47 / 72
  • 57. Le modèle Le modèle 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. Mai 2018, M2I Aix en Provence 48 / 72
  • 58. Le modèle Le modèle Le repository package com.spring.demo.dao; import java.util.List; import org.springframework.data.jpa.repository. JpaRepository; import com.spring.demo.model.Personne; public interface PersonneRepository extends JpaRepository <Personne, Long> { } Long est le type de la clé primaire (Id) de la table (entité) personnes Mai 2018, M2I Aix en Provence 49 / 72
  • 59. Le modèle Le modèle Préparons le formulaire dans addPerson.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <html> <head> <title>Index page</title> </head> <body> <h2>To add new person</h2> <form action="add" method="post"> Nom : <input type="text" name="nom"> Prenom : <input type="text" name="prenom"> <button type="submit">Envoyer</button> </form> </body> </html> Mai 2018, M2I Aix en Provence 50 / 72
  • 60. Le modèle Le modèle 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; } } Mai 2018, M2I Aix en Provence 51 / 72
  • 61. Le modèle Le modèle Préparons la vue confirm.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <html> <head> <title>Confirm page</title> </head> <body> <h1>Welcome</h1> Person named ${ nom } ${ prenom } has been successfully added in our database. </body> </html> Mai 2018, M2I Aix en Provence 52 / 72
  • 62. Le modèle Le modèle Et si on veut récupérer la liste de toutes les personnes? @RequestMapping(value="/show") public ModelAndView showAll() { ArrayList <Personne> al =(ArrayList<Personne>) personneRepository.findAll(); ModelAndView mv = new ModelAndView(); mv.setViewName("result"); mv.addObject("tab", al); return mv; } Mai 2018, M2I Aix en Provence 53 / 72
  • 63. Le modèle Le modèle Et la vue result.jsp : <% ArrayList <Personne> al = (ArrayList <Personne>) request.getAttribute("tab"); for(Personne p: al){ out.print("Hello " + p.getNom() + " " + p. getPrenom()); } %> Mai 2018, M2I Aix en Provence 54 / 72
  • 64. Le modèle Le modèle 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()... Mai 2018, M2I Aix en Provence 55 / 72
  • 65. Le modèle Le modèle On peut aussi récupérer la liste de personnes par page @RequestMapping(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("tab", 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 Mai 2018, M2I Aix en Provence 56 / 72
  • 66. Le modèle Le modèle On peut aussi récupérer une liste de personnes triée @RequestMapping(value="/showAllSorted") public ModelAndView showAllSorted() { List<Personne> personnes = personneRepository.findAll( Sort.by("nom").descending()); ModelAndView mv = new ModelAndView(); mv.setViewName("result"); mv.addObject("tab", personnes); return mv; } Explication Ici on trie le résultat selon la colonne nom dans l’ordre décroissant Mai 2018, M2I Aix en Provence 57 / 72
  • 67. Le modèle Le modèle 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. Mai 2018, M2I Aix en Provence 58 / 72
  • 68. Le modèle Le modèle 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 Mai 2018, M2I Aix en Provence 59 / 72
  • 69. Le modèle Le modèle Le contrôleur @RequestMapping(value="/showSome") public ModelAndView showSome(@RequestParam(value = "nom") String nom, @RequestParam(value = "prenom" ) String prenom) { ArrayList <Personne> al =(ArrayList<Personne>) personneRepository.findByNomAndPrenom(nom, prenom); ModelAndView mv = new ModelAndView(); mv.setViewName("result"); mv.addObject("tab", al); return mv; } Mai 2018, M2I Aix en Provence 60 / 72
  • 70. Le modèle Le modèle 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 ... Mai 2018, M2I Aix en Provence 61 / 72
  • 71. Le modèle Le modèle On peut également écrire des requêtes HQL (Hiberenate Query Language) avec l’annotation Query package com.spring.demo.dao; import java.util.List; import org.springframework.data.jpa.repository. JpaRepository; import com.spring.demo.model.Personne; public interface PersonneRepository extends JpaRepository <Personne, Long> { @Query("select p from Personne p where p.nom = ?1" ) Personne findByNom(String nom); } Mai 2018, M2I Aix en Provence 62 / 72
  • 72. Thymeleaf Thymeleaf Dépendance Maven à ajouter <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</ artifactId> </dependency> Mai 2018, M2I Aix en Provence 63 / 72
  • 73. Thymeleaf Thymeleaf 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 Mai 2018, M2I Aix en Provence 64 / 72
  • 74. Thymeleaf Thymeleaf 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/* Mai 2018, M2I Aix en Provence 64 / 72
  • 75. Thymeleaf JSP et Thymeleaf Dans les contrôleurs, remplacer chaque appel d’une page JSP return "nomVue"; Mai 2018, M2I Aix en Provence 65 / 72
  • 76. Thymeleaf JSP et Thymeleaf Dans les contrôleurs, remplacer chaque appel d’une page JSP return "nomVue"; Par return "jsp/nomVue"; Mai 2018, M2I Aix en Provence 65 / 72
  • 77. 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"; Mai 2018, M2I Aix en Provence 65 / 72
  • 78. Thymeleaf Thymeleaf 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"; } } Mai 2018, M2I Aix en Provence 66 / 72
  • 79. Thymeleaf Thymeleaf 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> Mai 2018, M2I Aix en Provence 67 / 72
  • 80. Thymeleaf Thymeleaf 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é Mai 2018, M2I Aix en Provence 67 / 72
  • 81. 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 Mai 2018, M2I Aix en Provence 68 / 72
  • 82. 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 Mai 2018, M2I Aix en Provence 68 / 72
  • 83. 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 Mai 2018, M2I Aix en Provence 68 / 72
  • 84. 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> Mai 2018, M2I Aix en Provence 68 / 72
  • 85. L’internationalisation (i18n) Créons la classe de configuration MvcConfig dans com.spring.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()); } } Mai 2018, M2I Aix en Provence 69 / 72
  • 86. L’internationalisation (i18n) L’internationalisation (i18n) En allant sur http://localhost:8080/thymeleaf?language=en , le résultat est : Hello world Mai 2018, M2I Aix en Provence 70 / 72
  • 87. 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 Mai 2018, M2I Aix en Provence 70 / 72
  • 88. 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 Mai 2018, M2I Aix en Provence 70 / 72
  • 89. Les services web Rest Spring Boot & REST 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") int id) { return personneRepository.findById(id).orElse(null); } @PostMapping("/personnes") public Personne addPersonne(@RequestBody Personne personne) { System.out.println(personne); return personneRepository.save(personne); } } Mai 2018, M2I Aix en Provence 71 / 72
  • 90. Les services web Rest Spring Boot & REST Pour tester Aller sur localhost:8080/personnes Ou sur localhost:8080/personnes/1 Mai 2018, M2I Aix en Provence 72 / 72
  • 91. Les services web Rest Spring Boot & REST 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) Mai 2018, M2I Aix en Provence 72 / 72