Cours Spring Boot Fondamentaux [PDF]

  • 0 0 0
  • Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen! Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau

Spring Boot : fondamentaux Achref El Mouelhi Docteur de l’universite´ d’Aix-Marseille Chercheur en programmation par contrainte (IA) ´ ´ Ingenieur en genie logiciel [email protected]

H & H: Research and Training

1 / 81

Plan 1

Introduction

2

Premier projet Spring Boot

3

ˆ Controleur

4

DevTools

5

Vue Model, ModelMap et ModelAndView ` ˆ et variables de chemin Parametres de requete

6

` et persistence de donnees ´ Modele

7

Thymeleaf

8

Internationalisation (i18n)

9

Service Web

H & H: Research and Training

2 / 81

Introduction

Spring Boot Spring MVC un des framework Spring

© I H L ´ permettant de simplifier le developpement d’applications web en E U respectant le patron de conception O M MVC 2 L E f e r ch A © base´ sur l’API Servlet de Java JEE

H & H: Research and Training

3 / 81

Introduction

Spring Boot Spring MVC un des framework Spring

© I H L ´ permettant de simplifier le developpement d’applications web en E U respectant le patron de conception O M MVC 2 L E f e r ch A ` Problemes © base´ sur l’API Servlet de Java JEE

´ ´ ` trop de dependance a` gerer (ce qui pose souvent un probleme d’incompatibilite´ entre les versions) ´ ´ controleurs, ˆ beaucoup de configuration (JPA, securit e, vues...) H & H: Research and Training

3 / 81

Introduction

Spring Boot

Spring Boot : encore de l’abstraction

© I H ´ ´ ´ EestL une dependance, Les demarreurs (starter) : un demarreur U O ´ ´ contenant un paquet de dependance, permettant de r ealiser un M L ´ type de projet (Web, Rest...). n’a plus a` E Ainsi, le developpeur f e r ´ ˆ ` ´ gerer, lui meme le probl eme d’incompatibilit e entre les versions. ch A © ` l’auto-configuration : c’est-a-dire laisser Spring Boot configurer le

´ ` Pour eviter les problemes de Spring MVC, Spring Boot propose :

´ ´ par le developpeur. ´ projet a` partir de dependances ajoutees

H & H: Research and Training

4 / 81

Introduction

Spring Boot ´ un projet web, il faut ajouter la dependance ´ Exemple, pour creer Maven suivante :

org.springframework.boot spring-boot-starter-web

O LM

© I H EL

U

E f e r ch

©A

H & H: Research and Training

5 / 81

Introduction

Spring Boot ´ un projet web, il faut ajouter la dependance ´ Exemple, pour creer Maven suivante :

org.springframework.boot spring-boot-starter-web

O LM

© I H EL

U

´ ´ edente ´ ´ Starter forme gen ´ erale ´ La dependance Maven prec est appelee

E f e r ch

spring-boot-starter-*

©A

H & H: Research and Training

5 / 81

Introduction

Spring Boot ´ un projet web, il faut ajouter la dependance ´ Exemple, pour creer Maven suivante :

org.springframework.boot spring-boot-starter-web

O LM

© I H EL

U

´ ´ edente ´ ´ Starter forme gen ´ erale ´ La dependance Maven prec est appelee

E f e r ch

spring-boot-starter-*

©A

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 / 81

Introduction

´ ´ La dependance spring-boot-starter-web inclut les six dependances suivantes :

org.springframework.boot spring-boot-starter

org.springframework.boot spring-boot-starter-json

org.springframework.boot spring-boot-starter-tomcat

org.hibernate.validator hibernate-validator

org.springframework spring-web

org.springframework spring-webmvc

O LM

© I H EL

U

E f e r ch

©A

H & H: Research and Training

6 / 81

Introduction

Spring Boot

´ ´ La dependance spring-boot-starter-web permet donc de creer un projet web contenant : un serveur Apache Tomcat

O LM

Spring Framework et Spring MVC

© I H EL

U

E f e r ch

les validateurs d’Hibernate

©A

´ au format JSON jackson pour les donnees ...

H & H: Research and Training

7 / 81

Premier projet Spring Boot

Spring Boot ´ Creation de projet Spring Boot Aller dans File > New > Other ´ Chercher Spring, dans Spring Boot selectionner Spring Starter Project et cliquer sur Next > Saisir

© I H EL

OU M L com.example dans Group, E f e firstspringboot chr dans Artifact A © com.example.demo dans Package first-spring-boot dans Name,

Cliquer sur Next > Chercher et cocher la case correspondante a` Spring Web, choisir la version 2.3.3 puis cliquer sur Next > Valider en cliquant sur Finish H & H: Research and Training

8 / 81

Premier projet Spring Boot

Spring Boot ´ Pourquoi a-t-on coche´ la case Spring Web a` la creation du projet ? ´ pour ajouter la dependance spring-boot-starter-web

© I H EL

Contenu de la section dependencies de pom.xml

O LM

U

org.springframework.boot spring-boot-starter-web

org.springframework.boot spring-boot-starter-test test

E f e r ch

©A

H & H: Research and Training

9 / 81

Premier projet Spring Boot

Spring Boot

Remarques

© I H EL

´ de notre applicaLe package contenant le point d’entree tion (la classe contenant le public static void main) est com.example.demo

O LM

U

E f e r ch

ˆ Tous les autres packages dao, model... doivent etre dans le package demo.

©A

H & H: Research and Training

10 / 81

Premier projet Spring Boot

Spring Boot

´ Le point de demarrage de l’application package com.example.demo;

© I H EL

import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;

O LM

U

@SpringBootApplication public class FirstSpringBootApplication {

E f e r ch

©A

public static void main(String[] args) { SpringApplication.run(FirstSpringBootApplication.class, args); } }

H & H: Research and Training

11 / 81

Premier projet Spring Boot

Spring Boot Explication ´ ´ SpringApplication : la classe de demarrage d’une application Spring et qui va creer une instance de la classe ApplicationContext ApplicationContext : l’interface centrale d’une application Spring permettant de fournir des informations de configuration a` l’application.

© I H EL

@SpringBootApplication : englobe les 3 annotations suivantes :

O LM

U

@Configuration : fait partie du noyau de Spring Framework et ´ ´ indique que la classe annote´ peut contenir des methodes annotees ´ erer ´ par @Bean. Ainsi,Spring Container peut traiter la classe et gen ´ par l’application. des beans qui seront utilises

E f e r ch

A © ´ @EnableAutoConfiguration : permet, au demarrage de ´ erer ´ Spring, de gen automatiquement les configurations ´ ´ ´ necessaires en fonction des dependances ajoutees.

@ComponentScan : permet de scanner les package contenant des composants H & H: Research and Training

12 / 81

Premier projet Spring Boot

Spring Boot ´ Pour executer Faire un clic droit sur le projet et aller dans Run As et cliquer sur Spring Boot App

© I H EL

Ou faire un clic droit sur la classe FirstSpringBootApplication dans Package Explorer, aller dans Run As et cliquer sur Java Application

O LM

U

E f e r ch

©A

H & H: Research and Training

13 / 81

Premier projet Spring Boot

Spring Boot ´ Pour executer Faire un clic droit sur le projet et aller dans Run As et cliquer sur Spring Boot App

© I H EL

Ou faire un clic droit sur la classe FirstSpringBootApplication dans Package Explorer, aller dans Run As et cliquer sur Java Application

O LM

U

E f e r ch La console nous indique A © Tomcat started on port(s): 8080 (http) with context path ’’

H & H: Research and Training

13 / 81

Premier projet Spring Boot

Spring Boot ´ Pour executer Faire un clic droit sur le projet et aller dans Run As et cliquer sur Spring Boot App

© I H EL

Ou faire un clic droit sur la classe FirstSpringBootApplication dans Package Explorer, aller dans Run As et cliquer sur Java Application

O LM

U

E f e r ch La console nous indique A © Tomcat started on port(s): 8080 (http) with context path ’’ Allons donc a` http://localhost:8080/

H & H: Research and Training

13 / 81

Premier projet Spring Boot

Spring Boot

© I H On a cre´ e´ un projet web, mais on n’a aucune ELpage HTML ni JSP. U O ´ M Spring Boot, comme Spring MVC, implemente patron de L Eil nous faut au moins un lecontr f ˆ conception MVC 2,re donc oleur et h une vue. Ac ©

´ Resultat : message d’erreur

H & H: Research and Training

14 / 81

ˆ Controleur

Spring Boot

ˆ Le controleur ` MVC un des composants du modele

O LM

© I H EL

U

´ par Controller (ou une classe Java annotee RestController)

E f e r ˆ du controleur ˆ Il rec¸oit une requ frontal et communique avec le chete A ` © ´ ´ modele pour preparer et retourner une reponse

H & H: Research and Training

15 / 81

ˆ Controleur

Spring Boot

´ ˆ Creation du controleur Faire clic droit sur le projet

© I H EL

OU M L Choisir le package com.example.demo.controller E f e chr comme nom de classe Saisir HomeController A © Ensuite valider Aller dans New > Class

H & H: Research and Training

16 / 81

ˆ Controleur

Spring Boot Remplac¸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 {

O LM

© I H EL

U

E f e r @RequestMapping(value ch ={"/hello", method = RequestMethod.GET) A public void sayHello() © System.out.println("Hello World!"); }

}

H & H: Research and Training

17 / 81

ˆ Controleur

Spring Boot

Explication ` ligne indique que notre controleur ˆ La premiere se trouve dans le package com.example.demo.controller

© I H EL

OU M L ´ L’annotation @Controller permet de declarer que la classe E f e ˆ suivante est un contr Spring chr oleur A ©de l’annotation @RequestMapping indique la route La valeur Les trois imports concernent l’utilisation des annotations

´ ´ (/hello ici) et la methode indique la methode HTTP (GET ici, ´ ´ c’est la methode par defaut).

H & H: Research and Training

18 / 81

ˆ Controleur

Spring Boot Attributs de @RequestMapping ` path : accepte une chaˆıne de caracteres correspondant a` la route value : alias de path

© I H EL

OU M ´ method : verbe ou methode HTTP L E f e ` ´ params : contient accepte´ par la methode chle rtableau de parametre A © ´ les el´ ements ´ ˆ headers : specifie de l’entete name : permet d’attribuer un nom a` la route

´ accepte´ par la methode ´ consumes : indique le format de donnees ´ retourne´ par la methode ´ produces : indique le format de donnees H & H: Research and Training

19 / 81

ˆ Controleur

Spring Boot @RequestMapping(value = "/hello", method = RequestMethod.GET) ˆ peut etre remplace´ par @GetMapping(value = "/hello") package com.example.demo.controller;

© I H EL

import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class HomeController {

O LM

U

E f e r @GetMapping(value ch= "/hello") A public void sayHello() { ©

System.out.println("Hello World!"); } }

H & H: Research and Training

20 / 81

ˆ Controleur

Spring Boot

Testons tout cela

© I H EL

OU M L ´ Aller sur l’url http://localhost:8080/hello et verifier qu’un E f e ´ ´ ´ Hello World! a bien et e affich e dans la console (d’Eclipse) chr A © ´ Demarrer le serveur Apache Tomcat

H & H: Research and Training

21 / 81

ˆ Controleur

Spring Boot

Remarque

© I H EL

ˆ On peut aussi annoter le controleur par le @RequestMapping

O LM

U

@Controller @RequestMapping("/hello") public class HelloController { ... }

E f e r ch

©A

H & H: Research and Training

22 / 81

ˆ Controleur

Spring Boot ´ ˆ ˆ ´ a` plusieurs routes La methode d’un controleur peut etre associee @Controller public class HomeController { @GetMapping(value = {"/hello", "/"}) public void sayHello() { System.out.println("Hello World!"); }

O LM

}

© I H EL

U

E f e r ch

©A

H & H: Research and Training

23 / 81

ˆ Controleur

Spring Boot ´ ˆ ˆ ´ a` plusieurs routes La methode d’un controleur peut etre associee @Controller public class HomeController { @GetMapping(value = {"/hello", "/"}) public void sayHello() { System.out.println("Hello World!"); }

O LM

}

© I H EL

U

E f e r ch

A © ´ La methode sayHello est accessible via les deux routes suivantes localhost:8080/firstspringmvc/ localhost:8080/firstspringmvc/hello

H & H: Research and Training

23 / 81

DevTools

Spring Boot

DevTools ´ outil de developpement

O LM

´ fonctionnant en mode developpement

© I H EL

U

E f e r ch

´ ` chaque changement permettant de redemarrer le projet apres (sauvegarde)

©A

H & H: Research and Training

24 / 81

DevTools

Spring Boot ´ Integrer DevTools sous Eclipse Faire clic droit sur le projet

© I H EL

Aller a` Spring > Add DevTools

O LM

U

E f e r ch

©A

H & H: Research and Training

25 / 81

DevTools

Spring Boot ´ Integrer DevTools sous Eclipse Faire clic droit sur le projet

© I H EL

Aller a` Spring > Add DevTools

O LM

U

E f e r ch

´ Ou ajouter la dependance Maven suivante

©A

org.springframework.boot spring-boot-devtools

H & H: Research and Training

25 / 81

DevTools

Spring Boot

© I H EL

Avant utilisation, il faut

O LM

vider le cache du projet

U

E f e r ch

le mettre a` jour

©A

H & H: Research and Training

26 / 81

Vue

Spring Boot

Constats

© I H EL

ˆ du controleur ˆ Dans une application web Spring MVC, le role n’est ´ dans la console pas d’afficher des donnees

O LM

U

E f e r ch

ˆ de communiquer avec les differents ´ C’est plutot composants

©A

´ ˆ de la vue Afficher la reponse est le role

H & H: Research and Training

27 / 81

Vue

Spring Boot

Les vues avec Spring

© I H EL

´ Permettent d’afficher des donnees

O LM

U

ˆ ´ ´ ´ Communiquent avec le controleur pour recup erer ces donnees

E f e r ch

ˆ ´ dans le repertoire ´ Doivent etre cre´ ees views dans WEB-INF

©A

ˆ ´ avec un simple code JSP, JSTL ou en Peuvent etre cre´ ees utilisant un moteur de templates comme Thymeleaf...

H & H: Research and Training

28 / 81

Vue

Spring Boot ´ Par defaut ´ Spring Boot cherche les vues dans un repertoire webapp situe´ dans src/main. ´ ´ Le repertoire n’existe pas, il faut le creer.

O LM

© I H EL

U

E f e r ch

©A

H & H: Research and Training

29 / 81

Vue

Spring Boot ´ Par defaut ´ Spring Boot cherche les vues dans un repertoire webapp situe´ dans src/main. ´ ´ Le repertoire n’existe pas, il faut le creer.

O LM

© I H EL

U

´ ` vue que nous appelons hello.jsp dans webapp Creons une premiere

E f e r ch



first jsp called from controller

first jsp called from controller

©A

H & H: Research and Training

29 / 81

Vue

Spring Boot ˆ Appelons hello.jsp a` partir du controleur package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping ;

O LM

© I H EL

U

@Controller public class HomeController { @GetMapping(value = "/hello") public String sayHello() { return "hello.jsp"; } }

E f e r ch

©A

´ Dans le return, on precise le nom de la vue a` afficher (ici c’est hello.jsp)

H & H: Research and Training

30 / 81

Vue

Spring Boot

Remarque

© I H EL

En allant a` l’URL http://localhost:8080/hello, un message d’erreur est affiche´ (circular view).

U O M ´ ´ par Spring Boot pour Apache En effet, la dependance ajout Lee E ` Tomcat sert seulement a lancer un projet web. f e r h Ac la dependance ´ Il faut donc ajouter qui permet a` Apache Tomcat © de lire les pages JSP

H & H: Research and Training

31 / 81

Vue

Spring Boot Pour la compatibilite´ d’Apache Tomcat avec les JSP, on ajoute la ´ dependance suivante

org.apache.tomcat.embed tomcat-embed-jasper

O LM

© I H EL

U

E f e r ch

©A

H & H: Research and Training

32 / 81

Vue

Spring Boot Pour la compatibilite´ d’Apache Tomcat avec les JSP, on ajoute la ´ dependance suivante

org.apache.tomcat.embed tomcat-embed-jasper

O LM

© I H EL

U

E f e r chon ajoute la dependance ´ Pour utiliser la JSTL, suivante A ©

javax.servlet jstl

H & H: Research and Training

32 / 81

Vue

Spring Boot

Avant de tester

© I H EL

U O M Allez dans Maven > Update L Project... E f re Relancez le projet h c ©A Faites un clic droit sur le projet

H & H: Research and Training

33 / 81

Vue

Spring Boot Remarques ´ ´ On peut preciser un autre repertoire pour les vues (a` placer aussi dans webapp) ´ ´ Pour eviter de preciser chaque fois l’extension et l’emplacement de la vue, on peut l’indiquer dans application.properties situe´ dans src/main/resources

O LM

© I H EL

U

E f e r ch

©A

H & H: Research and Training

34 / 81

Vue

Spring Boot Remarques ´ ´ On peut preciser un autre repertoire pour les vues (a` placer aussi dans webapp) ´ ´ Pour eviter de preciser chaque fois l’extension et l’emplacement de la vue, on peut l’indiquer dans application.properties situe´ dans src/main/resources

O LM

© I H EL

U

E f e r ch

Nouveau contenu d’application.properties

©A

spring.mvc.view.prefix=/views/ spring.mvc.view.suffix=.jsp

H & H: Research and Training

34 / 81

Vue

Spring Boot Remarques ´ ´ On peut preciser un autre repertoire pour les vues (a` placer aussi dans webapp) ´ ´ Pour eviter de preciser chaque fois l’extension et l’emplacement de la vue, on peut l’indiquer dans application.properties situe´ dans src/main/resources

O LM

© I H EL

U

E f e r ch

Nouveau contenu d’application.properties

©A

spring.mvc.view.prefix=/views/ spring.mvc.view.suffix=.jsp

´ es ´ possibles de application.properties sont ici : Toutes les propriet https://docs.spring.io/spring-boot/docs/current/reference/ html/common-application-properties.html H & H: Research and Training

34 / 81

Vue

Spring Boot ˆ Nouveau contenu du controleur package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping ;

O LM

© I H EL

U

@Controller public class HomeController { @GetMapping(value = "/hello") public String sayHello() { return "hello"; } }

E f e r ch

©A

´ ´ dans N’oublions pas de deplacer hello.jsp dans views qu’il faut le creer webapp H & H: Research and Training

35 / 81

Vue

Model, ModelMap et ModelAndView

Spring Boot

© I H EL

Deux questions

U

´ d’une vue a` un controleur ˆ Comment passer des donnees et d’un ˆ controleur a` une vue ?

O LM

E f e r ch

ˆ Une vue peut-elle appeler un controleur ?

©A

H & H: Research and Training

36 / 81

Vue

Model, ModelMap et ModelAndView

Spring Boot ˆ ´ Comment le controleur envoie des donnees a` 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"; } }

O LM

© I H EL

U

E f e r ch

©A

´ ´ Dans la declaration de la methode, on injecte l’interface Model qui nous permettra d’envoyer des attributs a` la vue H & H: Research and Training

37 / 81

Vue

Model, ModelMap et ModelAndView

Spring Boot ´ ` les donnees ´ ´ ˆ Comment la vue recup ere envoyees par le controleur ?



first jsp called from controller

first jsp called from controller Je m’appelle ${ nom }

O LM

© I H EL

U

E f e r ch

©A

Exactement comme dans la plateforme JEE H & H: Research and Training

38 / 81

Vue

Model, ModelMap et ModelAndView

Spring Boot ` ´ Une deuxieme methode en utilisant ModelAndView package com.example.demo.controller; import import import import

org.springframework.stereotype.Controller; org.springframework.web.bind.annotation.RequestMapping; org.springframework.web.bind.annotation.RequestMethod; org.springframework.ui.ModelMap;

@Controller public class HomeController {

O LM

© I H EL

U

E f e r ch

©A

@RequestMapping(value = "/hello") public String sayHello(ModelMap model) { model.addAttribute("nom", "Wick"); return "hello"; } } H & H: Research and Training

39 / 81

Vue

Model, ModelMap et ModelAndView

Spring Boot ` ´ Une troisieme methode 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 {

O LM

© I H EL

U

E f e r ch

@RequestMapping(value = "/hello") public ModelAndView sayHello(ModelAndView mv) {

©A

mv.setViewName("hello"); mv.addObject("nom", "wick"); return mv; } } H & H: Research and Training

40 / 81

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 a` la vue

© I H EL

U

´ ModelMap : est une classe implementant l’interface Map et permettant d’ajouter des attributs sous forme de key - value ´ ement ´ et de les passer a` la vue. On peut donc chercher un el selon la valeur de la cle´ ou de la valeur

O LM

E f e r ch

©A

ModelAndView : est un conteneur a` la fois d’un ModelMap pour ˆ les attributs et d’un View Object. Le controleur pourra ainsi retourner une seule valeur.

H & H: Research and Training

41 / 81

Vue

` ˆ et variables de chemin Parametres de requete

Spring Boot

` ˆ Les parametres de requete

© I H EL

` ´ Ce sont les parametres qui s’ecrivent sous la forme /chemin?param1=value1¶m2=value2

O LM

U

E f e r ch

©A

H & H: Research and Training

42 / 81

Vue

` ˆ et variables de chemin Parametres de requete

Spring Boot

` ˆ Les parametres de requete

© I H EL

` ´ Ce sont les parametres qui s’ecrivent sous la forme /chemin?param1=value1¶m2=value2

O LM

U

E f e r ch

©A

Les variables de chemin

` ´ Ce sont les parametres qui s’ecrivent sous la forme /chemin/value

H & H: Research and Training

42 / 81

Vue

` ˆ et variables de chemin Parametres de requete

Spring Boot ˆ ´ ` les parametres ` ˆ ? Comment le controleur recup ere de requete package com.example.demo.controller; import import import import

org.springframework.stereotype.Controller; org.springframework.ui.Model; org.springframework.web.bind.annotation.GetMapping; org.springframework.web.bind.annotation.RequestParam;

@Controller public class HomeController {

O LM

© I H EL

U

E f e r ch

©A

@GetMapping(value = "/hello") public String sayHello(@RequestParam(value = "nom") String nom, Model model) { model.addAttribute("nom", nom); return "hello"; } } H & H: Research and Training

43 / 81

Vue

` ˆ et variables de chemin Parametres de requete

Spring Boot

Explication Pour tester, il faut aller sur l’URL localhost:8080/hello?nom=wick

© I H EL

OU M @RequestParam(value =L"nom") String nom : permet de E f e rdu parametre ´ ´ ` ˆ HTTP est de recup erer la valeur de la requete h c A ` ´ l’affecter© au parametre nom de la methode.

H & H: Research and Training

44 / 81

Vue

` ˆ et variables de chemin Parametres de requete

Question ´ ´ ` Peut-on acceder a` localhost:8080/hello sans preciser le parametre nom ?

O LM

© I H EL

U

E f e r ch

©A

H & H: Research and Training

45 / 81

Vue

` ˆ et variables de chemin Parametres de requete

Question ´ ´ ` Peut-on acceder a` localhost:8080/hello sans preciser le parametre nom ?

´ Reponse

© I H EL

´ Non, une erreur sera affichee.

O LM

U

E f e r ch

©A

H & H: Research and Training

45 / 81

Vue

` ˆ et variables de chemin Parametres de requete

Question ´ ´ ` Peut-on acceder a` localhost:8080/hello sans preciser le parametre nom ?

´ Reponse

© I H EL

´ Non, une erreur sera affichee.

O LM

` Mais, il est possible de rendre ce parametre facultatif

U

E f e r ch

@Controller public class HomeController {

©A

@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

45 / 81

Vue

` ˆ et variables de chemin Parametres de requete

Spring Boot ´ ´ Il est possible aussi de preciser une valeur par defaut @Controller public class HomeController {

© I H EL

@GetMapping(value = "/hello") public String sayHello(@RequestParam(value = "nom", required = false, defaultValue = "wick") String nom, Model model) {

O LM

U

E f e r ch

©A

model.addAttribute("nom", nom); return "hello"; } }

H & H: Research and Training

46 / 81

Vue

` ˆ et variables de chemin Parametres de requete

Spring Boot ˆ ´ ` une variable de chemin ? Comment le controleur recup ere package com.example.demo.controller; import import import import

org.springframework.stereotype.Controller; org.springframework.ui.Model; org.springframework.web.bind.annotation.GetMapping; org.springframework.web.bind.annotation.PathVariable;

@Controller public class HomeController {

O LM

© I H EL

U

E f e r ch

@GetMapping(value = "/hello/{nom}") public String sayHello(@PathVariable String nom, Model model) {

©A

model.addAttribute("nom", nom); return "hello";

} }

Pour tester, il faut aller sur l’URL localhost:8080/hello/wick H & H: Research and Training

47 / 81

Vue

` ˆ et variables de chemin Parametres de requete

Spring Boot

´ ˆ Comment une vue peut faire appel a` une methode d’un controleur ?

© I H EL

´ Soit en utilisant les formulaires et on precise la route dans l’attribut ´ action et la methode dans l’attribut method

OU M L (dans ce cas le verbe HTTP est Soit en utilisant un lien hypertexte E f e GET) chr A © ...

H & H: Research and Training

48 / 81

` et persistence de donnees ´ Modele

Spring Boot

` : acces ` et traitement de donnees ´ Modele

© I H EL

Utilisation de

U

´ MySQL pour le stockage de donnees

O LM

Hibernate pour le mapping

E f e r ch

´ eration ´ Spring-Data-JPA pour la gen du DAO

©A

´ ´ de connexion dans Precision de donnees application.properties

H & H: Research and Training

49 / 81

` et persistence de donnees ´ Modele

Spring Boot

Organisation du projet

© I H EL

´ ´ Creons un premier repertoire com.example.demo.model dans ´ JPA src/main/java ou` nous placerons les entites

OU M ´ ` ´f EL com.example.demo.dao dans Creons un deuxieme repertoire e src/main/javahoru` nous placerons les classes DAO (ou ce c qu’on appelle © ARepository dans Spring)

H & H: Research and Training

50 / 81

` et persistence de donnees ´ Modele

Spring Boot ´ Pour ajouter les dependances MySQL et Spring-Data-JPA Faire clic droit sur le projet et aller dans Spring > Edit Starters Cocher les cases respectives de MySQL Driver et Spring Data JPA

O LM

© I H EL

U

E f e r ch

©A

H & H: Research and Training

51 / 81

` et persistence de donnees ´ Modele

Spring Boot ´ Pour ajouter les dependances MySQL et Spring-Data-JPA Faire clic droit sur le projet et aller dans Spring > Edit Starters Cocher les cases respectives de MySQL Driver et Spring Data JPA

O LM

´ Ou ajouter les dependances suivantes

© I H EL

U

E f e r ch

org.springframework.boot spring-boot-starter-data-jpa

mysql mysql-connector-java runtime

©A

H & H: Research and Training

51 / 81

` et persistence de donnees ´ Modele

Spring Boot ´ Dans application.properties, on ajoute les donnees concernant la connexion a` la ´ base de donnees et la configuration de Hibernate spring.datasource.url = jdbc:mysql://localhost:3306/boot?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. MySQL8Dialect

O LM

© I H EL

U

E f e r ch

©A

´ e´ spring.jpa.hibernate.naming.physical-strategy = L’ajout de la propriet org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl ˆ permet de forcer Hibernate a` utiliser les memes noms pour les tables et les colonnes que les ´ et les attributs. entites

H & H: Research and Training

52 / 81

` et persistence de donnees ´ Modele

Spring Boot L’entite´ Personne package com.example.demo.model; import import import import

javax.persistence.Entity; javax.persistence.GeneratedValue; javax.persistence.GenerationType; javax.persistence.Id;

© I H EL

U

@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 }

O LM

E f e r ch

©A

H & H: Research and Training

53 / 81

` et persistence de donnees ´ Modele

Spring Boot

´ une interface qui etend ´ Pour obtenir le DAO, il faut creer

© I H EL

´ soit CrudRepository : fournit les methodes principales pour le CRUD

O LM

U

´ soit PagingAndSortingRepository : herite de ´ CrudRepository et fournit en plus des methodes de pagination et de tri sur les enregistrements

E f e r ch

©A

´ soit JpaRepository : herite de PagingAndSortingRepository en plus de certaines autres ´ methodes JPA.

H & H: Research and Training

54 / 81

` et persistence de donnees ´ Modele

Spring Boot Le repository package com.example.demo.dao;

© I H EL

import org.springframework.data.jpa.repository. JpaRepository;

U O M import com.example.demo.model.Personne; L E f e r chPersonneRepository public interface extends A © JpaRepository { }

´ Personne Long est le type de la cle´ primaire (Id) de la table (entite) H & H: Research and Training

55 / 81

` et persistence de donnees ´ Modele

Spring Boot ´ Preparons une vue addPerson.jsp



Adding a new person

Adding a new person
Nom :
Pr´ enom : Envoyer



O LM

© I H EL

U

E f e r ch

©A

H & H: Research and Training

56 / 81

` et persistence de donnees ´ Modele

Spring Boot ´ ˆ Preparons le controleur @Controller public class PersonneController { @Autowired private PersonneRepository personneRepository; @GetMapping(value = "/addPerson") public String addPerson() { return "addPerson"; }

O LM

© I H EL

U

E f e r ch

@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; }

©A

} H & H: Research and Training

57 / 81

` et persistence de donnees ´ Modele

Spring Boot La vue confirm.jsp



Confirm page

Welcome Person named ${ nom } ${ prenom } has been successfully added.

O LM

© I H EL

U

E f e r ch

©A

H & H: Research and Training

58 / 81

` et persistence de donnees ´ Modele

Spring Boot

´ ´ Pour recup erer la liste de personnes @GetMapping(value = "/showAll") public ModelAndView showAll() { ArrayList personnes =(ArrayList< Personne>) personneRepository.findAll(); ModelAndView mv = new ModelAndView(); mv.setViewName("result"); mv.addObject("personnes", personnes); return mv; }

O LM

© I H EL

U

E f e r ch

©A

H & H: Research and Training

59 / 81

` et persistence de donnees ´ Modele

Spring Boot La vue result.jsp



Result page

List of persons





O LM

© I H EL

U

E f e r ch

©A

H & H: Research and Training

60 / 81

` et persistence de donnees ´ Modele

Spring Boot

´ Autres methodes du repository

© I H findAllById() : recherche selon un tableau EL de cle´ primaire U MO deleteById() : Supprimer selon la valeur de la cle´ primaire L E f tout e deleteAll() : h supprimer r Ac ©: modifier flush() findById() : recherche selon la valeur de la cle´ primaire

count(), exists(), existsById()...

H & H: Research and Training

61 / 81

` et persistence de donnees ´ Modele

Spring Boot ´ ´ On peut aussi recup erer la liste de personnes par page @GetMapping(value = "/showAllByPage/{i}/{j}") public ModelAndView showAllByPage(@PathVariable int i, @PathVariable int j) { Page personnes = personneRepository.findAll( PageRequest.of(i, j)); ModelAndView mv = new ModelAndView(); mv.setViewName("result"); mv.addObject("personnes", personnes.getContent()); return mv; }

O LM

© I H EL

U

E f e r ch

©A

Les variables de chemin i et j ´ de la page (premiere ` page d’indice 0) i : le numero j : le nombre de personnes par page H & H: Research and Training

62 / 81

` et persistence de donnees ´ Modele

Spring Boot ´ Considerons le contenu suivant de la table Personne num 1 2 3 4 5

Personne nom prenom Durand Philippe Leberre Bernard Benammar Pierre Hadad Karim Wick John

O LM

© I H EL

U

E f e r ch

©A

H & H: Research and Training

63 / 81

` et persistence de donnees ´ Modele

Spring Boot ´ Considerons le contenu suivant de la table Personne num 1 2 3 4 5

Personne nom prenom Durand Philippe Leberre Bernard Benammar Pierre Hadad Karim Wick John

O LM

© I H EL

U

E f e r ch

©A

En allant sur l’URL localhost:8080/firstspringmvc/showAllByPage/1/2, ´ le resultat est num 3 4

H & H: Research and Training

Personne nom prenom Benammar Pierre Hadad Karim

63 / 81

` et persistence de donnees ´ Modele

Spring Boot ´ ´ ´ On peut aussi recup erer une liste de personnes triee @GetMapping(value = "/showAllSorted") public ModelAndView showAllSorted() { List personnes = personneRepository.findAll( Sort.by("nom").descending()); ModelAndView mv = new ModelAndView(); mv.setViewName("result"); mv.addObject("personnes", personnes); return mv; }

O LM

© I H EL

U

E f e r ch

©A

Explication ´ ´ Ici on trie le resultat selon la colonne nom dans l’ordre decroissant H & H: Research and Training

64 / 81

` et persistence de donnees ´ Modele

Spring Boot

´ ´ du repository Les methodes personnalisees

O LM

© I H EL

U

´ ´ ´ dans le On peut aussi definir nos propres methodes personnalisees ´ repository et sans les implementer.

E f e r ch

©A

H & H: Research and Training

65 / 81

` et persistence de donnees ´ Modele

Spring Boot Le repository package org.eclipse.FirstSpringMvc.dao; import java.util.List; import org.springframework.data.jpa.repository. JpaRepository;

© I H EL

U O M import org.eclipse.FirstSpringMvc.model.Personne; L E f e r public interface extends chPersonneRepository A JpaRepository { © List findByNomAndPrenom(String nom, String prenom); } nom et prenom : des attributs qui doivent exister dans l’entite´ Personne. Il faut respecter le CamelCase H & H: Research and Training

66 / 81

` et persistence de donnees ´ Modele

Spring Boot ˆ Le controleur @GetMapping(value = "/showSome") public ModelAndView showSome(@RequestParam(value = "nom") String nom, @RequestParam(value = "prenom" ) String prenom) { ArrayList personnes =(ArrayList< Personne>) personneRepository. findByNomAndPrenom(nom, prenom); ModelAndView mv = new ModelAndView(); mv.setViewName("result"); mv.addObject("personnes", personnes); return mv; }

O LM

© I H EL

U

E f e r ch

©A

H & H: Research and Training

67 / 81

` et persistence de donnees ´ Modele

Spring Boot ´ ´ edente ´ ´ Dans la methode prec on a utilise´ l’operateur logique And Mais, on peut aussi utiliser

© I H StartingWith, EndingWith, Containing, EL IgnoreCase U MO After, Before pour les dates L E f e r OrderBy, Not, In, NotIn ch A © ... Or, Between, Like, IsNull...

H & H: Research and Training

68 / 81

` et persistence de donnees ´ Modele

Spring Boot ´ ´ edente ´ ´ Dans la methode prec on a utilise´ l’operateur logique And Mais, on peut aussi utiliser

© I H StartingWith, EndingWith, Containing, EL IgnoreCase U MO After, Before pour les dates L E f e r OrderBy, Not, In, NotIn ch A © ... Or, Between, Like, IsNull...

´ Pour plus de details : https://docs.spring.io/spring-data /jpa/docs/current/reference/html/ H & H: Research and Training

68 / 81

` et persistence de donnees ´ Modele

Spring Boot ´ ´ ˆ On peut egalement ecrire des requetes 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;

© I H EL

OU M L import org.eclipse.firstspringmvc.model.Personne; E f e chr public interface PersonneRepository extends JpaRepository< A Personne,© Long> { @Query("select p from Personne p where p.nom = ?1") import java.util.List;

List chercherSelonLeNom(String nom); List findByNomAndPrenom(String nom, String prenom); }

H & H: Research and Training

69 / 81

Thymeleaf

Spring Boot ´ Integrer Thymeleaf sous Eclipse Faire clic droit sur le projet Aller a` Spring > Edit Starters

© I H EL

Cocher les cases respectives de Thymeleaf

O LM

U

E f e r ch

©A

H & H: Research and Training

70 / 81

Thymeleaf

Spring Boot ´ Integrer Thymeleaf sous Eclipse Faire clic droit sur le projet Aller a` Spring > Edit Starters

© I H EL

Cocher les cases respectives de Thymeleaf

O LM

U

E f e r ´ ch Ou ajouter la dependance Maven suivante A ©

org.springframework.boot spring-boot-starter-thymeleaf

H & H: Research and Training

70 / 81

Thymeleaf

Spring Boot Gestion de vues ´ deux repertoires ´ ´ Creer : jsp et thymeleaf dans le repertoire views de webapp

© I H EL

´ Deplacer et placer toutes les pages JSP dans jsp

O LM

U

Placer les vues Thymeleaf dans thymeleaf

E f e r ch

©A

H & H: Research and Training

71 / 81

Thymeleaf

Spring Boot Gestion de vues ´ deux repertoires ´ ´ Creer : jsp et thymeleaf dans le repertoire views de webapp

© I H EL

´ Deplacer et placer toutes les pages JSP dans jsp

O LM

U

Placer les vues Thymeleaf dans thymeleaf

E f e r ch

©A

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

71 / 81

Thymeleaf

JSP et Thymeleaf ˆ Dans les controleurs, remplacer chaque appel d’une page JSP return "nomVue";

O LM

© I H EL

U

E f e r ch

©A

H & H: Research and Training

72 / 81

Thymeleaf

JSP et Thymeleaf ˆ Dans les controleurs, remplacer chaque appel d’une page JSP return "nomVue";

O LM

Par

© I H EL

U

E f e r ch

return "jsp/nomVue";

©A

H & H: Research and Training

72 / 81

Thymeleaf

JSP et Thymeleaf ˆ Dans les controleurs, remplacer chaque appel d’une page JSP return "nomVue";

O LM

Par

© I H EL

U

E f e r ch

return "jsp/nomVue";

©A

Pour appeler une page Thymeleaf return "thymeleaf/nomVue";

H & H: Research and Training

72 / 81

Thymeleaf

Spring Boot ´ un controleur ˆ Pour tester, creer ThymeleafController @Controller public class ThymeleafController {

O LM

© I H EL

U

@GetMapping(value = "/thymeleaf") public String displayMessage(Model model) {

E f e r model.addAttribute("message", "Hello World!"); ch A return ©"thymeleaf/index";

} }

H & H: Research and Training

73 / 81

Thymeleaf

Spring Boot La vue index.html



First Thymeleaf Page



O LM

© I H EL

U

E f e r ch

©A

H & H: Research and Training

74 / 81

Thymeleaf

Spring Boot La vue index.html



First Thymeleaf Page



O LM

© I H EL

U

E f e r ch

©A

En allant a` http://localhost:8080/thymeleaf, Hello World! est affiche´ H & H: Research and Training

74 / 81

Internationalisation (i18n)

L’internationalisation (i18n) ´ Preciser les sources et l’encodage de messages dans application.properties spring.messages.encoding=UTF-8 spring.messages.basename=messages

O LM

© I H EL

U

E f e r ch

©A

H & H: Research and Training

75 / 81

Internationalisation (i18n)

L’internationalisation (i18n) ´ Preciser les sources et l’encodage de messages dans application.properties spring.messages.encoding=UTF-8 spring.messages.basename=messages

© I H Contenu de messages.properties (dans src/main/resources) EL U welcome.text=Bonjour tout le monde MO L E f e r ch A ©

H & H: Research and Training

75 / 81

Internationalisation (i18n)

L’internationalisation (i18n) ´ Preciser les sources et l’encodage de messages dans application.properties spring.messages.encoding=UTF-8 spring.messages.basename=messages

© I H Contenu de messages.properties (dans src/main/resources) EL U welcome.text=Bonjour tout le monde MO L E f e r h Contenu de messagesc en.properties (dans src/main/resources) A © world welcome.text=Hello

H & H: Research and Training

75 / 81

Internationalisation (i18n)

L’internationalisation (i18n) ´ Preciser les sources et l’encodage de messages dans application.properties spring.messages.encoding=UTF-8 spring.messages.basename=messages

© I H Contenu de messages.properties (dans src/main/resources) EL U welcome.text=Bonjour tout le monde MO L E f e r h Contenu de messagesc en.properties (dans src/main/resources) A © world welcome.text=Hello Dans une vue (Thymeleaf), ajouter

H & H: Research and Training

75 / 81

Internationalisation (i18n)

´ Creons 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; }

O LM

© I H EL

U

@Bean public LocaleChangeInterceptor localeChangeInterceptor() { LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); localeChangeInterceptor.setParamName("language"); return localeChangeInterceptor; }

E f e r ch

©A

@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(localeChangeInterceptor()); } } H & H: Research and Training

76 / 81

Internationalisation (i18n)

L’internationalisation (i18n) ´ En allant sur http://localhost:8080/thymeleaf?language=en , le resultat est : Hello world

O LM

© I H EL

U

E f e r ch

©A

H & H: Research and Training

77 / 81

Internationalisation (i18n)

L’internationalisation (i18n) ´ En allant sur http://localhost:8080/thymeleaf?language=en , le resultat est : Hello world

O LM

© I H EL

U

´ En allant sur http://localhost:8080/thymeleaf?language=fr , le resultat est :

E f e r ch

Bonjour tout le monde

©A

H & H: Research and Training

77 / 81

Internationalisation (i18n)

L’internationalisation (i18n) ´ En allant sur http://localhost:8080/thymeleaf?language=en , le resultat est : Hello world

O LM

© I H EL

U

´ En allant sur http://localhost:8080/thymeleaf?language=fr , le resultat est :

E f e r ch

Bonjour tout le monde

©A

´ En allant sur http://localhost:8080/thymeleaf?language=it , le resultat ˆ est toujours le meme : Bonjour tout le monde

H & H: Research and Training

77 / 81

Service Web

Spring Boot ´ ˆ Considerons le controleur PersonneRestController @RestController public class PersonneRestController { @Autowired private PersonneRepository personneRepository; @GetMapping("/personnes") public List getPersonnes() { return personneRepository.findAll(); }

O LM

© I H EL

U

E f e r ch

@GetMapping("/personnes/{id}") public Personne getPersonne(@PathVariable("id") long id) { return personneRepository.findById(id).orElse(null); }

©A

@PostMapping("/personnes") public Personne addPersonne(@RequestBody Personne personne) { System.out.println(personne); return personneRepository.save(personne); } } H & H: Research and Training

78 / 81

Service Web

Spring Boot ´ (qui implementera ´ Modifions le point d’entree l’interface ApplicationRunner) pour ´ ajouter des tuples dans la base de donnees avant d’appeler nos services REST @SpringBootApplication public class FirstSpringBootApplication implements ApplicationRunner {

© I H EL

@Autowired private PersonneRepository personneRepository;

O LM

U

public static void main(String[] args) { SpringApplication.run(FirstSpringBootApplication.class, args); }

E f e r ch

©A

@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

79 / 81

Service Web

Spring Boot Pour tester Aller sur localhost:8080/personnes

© I H EL

Ou sur localhost:8080/personnes/1

O LM

U

E f e r ch

©A

H & H: Research and Training

80 / 81

Service Web

Spring Boot Pour tester Aller sur localhost:8080/personnes

© I H EL

Ou sur localhost:8080/personnes/1

O LM

U

E f e r h precisant ´ ´ utiliser Postman la methode POST et l’url cen A localhost:8080/personne ©

Pour ajouter une personne

´ dans Headers, preciser la cle´ Accept et la valeur application/json ´ dans Body, cocher raw et selectionner JSON(application/json) H & H: Research and Training

80 / 81

Service Web

Spring Boot ´ e´ server.servlet.context-path de application.properties Propriet ´ Elle sert a` definir 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 recup erer la liste de personnes

O LM

© I H EL

U

E f e r ch

©A

H & H: Research and Training

81 / 81

Service Web

Spring Boot ´ e´ server.servlet.context-path de application.properties Propriet ´ Elle sert a` definir 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 recup erer la liste de personnes

O LM

E f e r ch

© I H EL

U

´ On peut aussi modifier le chemin de contexte a` partir de la classe de demarrage

©A

@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

81 / 81