43 1 847KB
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