SPRING MVC
UP ASI
Bureau E204
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 1
Plan du Cours
– Spring MVC
– Concepts de base (DispatcherServlet, Controller, Model, View,
ViewResolver, ...)
– Cycle de vie d’une requête.
– TP Spring Boot + Spring Data JPA + Spring MVC (REST)
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 2
Introduction
• Un Conteneur de Servlets (Servlet container en anglais) ou Conteneur Web
(web container en anglais) est un logiciel qui exécute des servlets.
• Un ou une Servlet est une classe Java qui permet de créer
dynamiquement des données au sein d'un serveur HTTP.
• Il existe plusieurs conteneurs de servlets, dont Apache Tomcat ou encore
Jetty. Le serveur d'application JBoss Application Server(Wildfly) utilise
Apache Tomcat.
• Nous allons nous intéresser au développent de la couche Web (Web
Services REST + Contrôleur + Service + Repository) dans ce cours.
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 3
Spring WEB
• Plusieurs Projets Spring permettent d’implémenter des applications Web :
• Framework Spring (qui contient Spring MVC)
• Spring Web Flow (Implémenter les navigations Stateful).
• Spring mobile (Détecter le type de l’appareil connecté).
• Spring Social (Facebook, Twitter, LinkedIn).
• …
• Nous allons nos intéresser à Spring MVC.
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 4
SPRING MVC
• Spring MVC est un Framework Web basé sur le design pattern MVC (Model
/ View / Controller).
• Spring MVC fait partie du projet “Spring Framework”.
• Spring MVC s'intègre avec les différentes technologies de vue tel que JSF,
JSP, Velocity, Thymeleaf...
• Spring MVC s'intègre avec les autres Frameworks Web tel que JSF, Struts, ...
• Spring MVC n’offre pas une technologie de vue.
• Spring MVC est construit en se basant sur la spécification JavaEE : Java
Servlet.
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 5
Les Concepts de Base
• DispatcherServlet
• Controller
• Model
• View
• ViewResolver
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 6
DispatcherServlet
• DispatcherServlet est un servlet qui hérite de HttpServlet.
• DispatcherServlet joue le rôle du “Front Controller”. Le bean Spring que vous créez
et qui est annoté @Controller est le “Controller”.
• DispatcherServlet gère toutes les requêtes et invoque les beans adéquats.
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 7
Controller
@Controller
public class UserControlImpl {
@Autowired
IUserService userService;
@RequestMapping("/sayHello")
public String welcome(Map<String, Object> model, @RequestParam("myName") String
name) {
model.put("receivedName", name);
return "helloPage";
}
@RequestMapping(value = "/", method = RequestMethod.GET)
public String users(User user, Model model) {
model.addAttribute("user", new User());
model.addAttribute("users", userService.retrieveAllUsers());
return "users";
}
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 8
View
• Une View (Vue) génère un output web, c.à.d., du code compréhensible par le
navigateur.
• Exemple de technologie de vue : JSF, JSP, Velocity, Thymeleaf.
• Le Controller retourne généralement le nom de la vue.
• Le ViewResolver doit sélectionner la vue en se basant sur son nom.
• Exemple : une vue en JSP :
<html>
<head>
<title>Calculateur de Poids idéal!!</title>
</head>
<body>
<div>
<p>DETERMINEZ VOTRE POIDS IDEAL:</p>
<form method="POST" name="monForm"action="${pageContext.request.contextPath}/calculate">
<p>Votre Taille en Centimètres: <input type="text" name="height" required /> <br/></p>
<input type="submit" class="button" value="CalculerPoids" /> <br/>
</form>
</div>
</body>
</html>
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 9
ViewResolver
• Le ViewResolver prend le nom de la vue “index” par exemple, et génère le chemin (path)
relatif à webapp: /views/index.jsp
@EnableWebMvc
@ComponentScan(basePackages={"…", "…"})
public class MvcConfig {
@Bean
public ViewResolver simpleViewResolver(){
InternalResourceViewResolver vr = new InternalResourceViewResolver();
vr.setPrefix("/views/"); //Relatif a webapp
vr.setSuffix(".jsp");
return vr;
}
}
• Avec Spring Boot, il suffit d mettre à jour application.properties (pas besoin de créer le bean
de configuration MvcConfig ci-dessus) :
• #Web configuration
• spring.mvc.view.prefix=/views/
• spring.mvc.view.suffix=.jsp
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 10
Url de notre Application Web
• Dans ce fichier de properties ajouter les lignes suivantes, pour définir l’url de
notre application :
• #http://localhost:8081/SpringMVC/servlet/sayHello?myName=Walid
• #Server configuration
• server.port=8081
• server.servlet.context-path=/SpringMVC
• spring.mvc.servlet.path=/servlet
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 11
Cycle de Vie d’une requête HTTP
• Exemple : http://localhost:8081/SpringMVC/servlet/sayHello
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 12
TP - Spring : Boot – Core – Data JPA – MVC (REST)
• Nous allons commencer par exposer des Web Service REST : Spring :
Boot – Core – Data JPA – MVC (REST)
• (Par la suite, nous allons étudier les JSF, et donc nous allons pouvoir à
ce moment là créer une application une complète : Spring : Boot –
Core – Data JPA – MVC (JSF)).
• Vous avez déjà créé un projet : Spring (Boot – Core – Data JPA)
avec un CRUD sur l’entité User. Ce projet a été test avec JUnit.
• Nous allons reprendre le même projet et exposer ces méthodes
(CRUD) avec des Web Servie REST.
• Ces Web Services seront testé avec Postman.
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 13
TP - Spring : Boot – Core – Data JPA – MVC (REST)
• Installation de Postman :
• L’exécutable est sur le Drive du cours Spring (dossier Outils), à
télécharger et à installer.
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 14
TP - Spring : Boot – Core – Data JPA – MVC (REST)
• Vérifier que le fichier de properties contient les propriétés nécessaires (web, base
de données, log4j, …) :
• #http://localhost:8081/SpringMVC/servlet/sayHello?myName=Walid
• #Server configuration
• server.servlet.context-path=/SpringMVC
• spring.mvc.servlet.path=/servlet
• server.port=8081
• ### DATABASE ###
• #spring.datasource.driver-class-name=com.mysql.jdbc.Driver
• spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&useJDBCCompliantTime
zoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
• spring.datasource.username=root
• spring.datasource.password=
• ### JPA / HIBERNATE ###
• spring.jpa.show-sql=true
• spring.jpa.hibernate.ddl-auto=update
• spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
•
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 15
TP - Spring : Boot – Core – Data JPA – MVC (REST)
• #Web configuration
• spring.mvc.view.prefix=/views/
• spring.mvc.view.suffix=.jsp
• #logging configuration
• logging.file=C:\logs\springboot.log
• logging.level.root=INFO
• logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %-5level - %logger{36} - %msg%n
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 16
TP - Spring : Boot – Core – Data JPA – MVC (REST)
• Créer les package tn.esprit.spring.control
• Créer le bean Spring UserRestController annoté @RestController
• Créer les méthodes nécessaires pour exposer le CRUD (voir pages
suivantes) :
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 17
TP - Spring : Boot – Core – Data JPA – MVC (REST)
• @RestController
• public class UserRestControlImpl {
• @Autowired
• IUserService userService;
•
• // http://localhost:8081/SpringMVC/servlet/retrieve-all-users
• @GetMapping("/retrieve-all-users")
• @ResponseBody
• public List<User> getUsers() {
• List<User> list = userService.retrieveAllUsers();
• return list;
• }
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 18
TP - Spring : Boot – Core – Data JPA – MVC (REST)
• // http://localhost:8081/SpringMVC/servlet/retrieve-user/{user-id}
• @GetMapping("/retrieve-user/{user-id}")
• @ResponseBody
• public User retrieveUser(@PathVariable("user-id") String userId) {
• return userService.retrieveUser(userId);
• }
• // Ajouter User : http://localhost:8081/SpringMVC/servlet/add-user
• @PostMapping("/add-user")
• @ResponseBody
• public User addUser(@RequestBody User u) {
• User user = userService.addUser(u);
• return user;
• }
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 19
TP - Spring : Boot – Core – Data JPA – MVC (REST)
• // http://localhost:8081/SpringMVC/servlet/remove-user/{user-id}
• @DeleteMapping("/remove-user/{user-id}")
• @ResponseBody
• public void removeUser(@PathVariable("user-id") String userId) {
• userService.deleteUser(userId);
• }
•
• // http://localhost:8081/SpringMVC/servlet/modify-user
• @PutMapping("/modify-user")
• @ResponseBody
• public User modifyUser(@RequestBody User user) {
• return userService.updateUser(user);
• }
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 20
TP - Spring : Boot – Core – Data JPA – MVC (REST)
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 21
TP - Spring : Boot – Core – Data JPA – MVC (REST)
• Tester l’ensemble des méthodes exposées avec Postman
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 22
SPRING MVC
Si vous avez des questions, n’hésitez pas à nous
contacter :
Département Informatique
UP ASI
Bureau E204
© 2020-2021 – ESPRIT – Module Architecture des SI II (Spring + JavaEE) – Spring MVC 23