SlideShare a Scribd company logo
1 of 122
Download to read offline
AArchitecturesrchitectures
LLogiciellesogicielles
DDistribuéesistribuées basées sur lesbasées sur les
MMicroicro--ServicesServices
Exemple d’implémentation avec:
- Spring Boot
MohamedYoussfi
Laboratoire Signaux Systèmes Distribués et Intelligence Artificielle (SSDIA)
ENSET, Université Hassan II Casablanca, Maroc
Email : med@youssfi.net
Supports de cours : http://fr.slideshare.net/mohamedyoussfi9
Chaîne vidéo : http://youtube.com/mohamedYoussfi
https://www.youtube.com/watch?v=zBLXWIhrg7U
Exemple d’implémentation avec:
- Spring Boot
- AngulatrJS
- BootStrap
PlanPlan
Evolution des approches de programmation
Industrialisation du génie logiciel
Exigences des systèmes logiciels
Principe de de l’inversion de contrôle
Exemples d’architectures logicielles modernesExemples d’architectures logicielles modernes
Problème des applications monolithiques
Architectures logicielles basées sur les Micro-
services
Mise en œuvre des architectures basées sur
les Micro-services : Spring Boot
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Evolution des techniques de programmationEvolution des techniques de programmation
Programmation Procédurale
Programmation Orientée
Objet
Sous programmes: Procédures, fonctions
(Basic, Pascal, C, Fortran,..)
Objet = Etat+ Comportement + Identité
Concepts fondamentaux : Objet, classe, Héritage,
polymorphisme, encapsulation (C++, JAVA, C#, ..)
Programmation Orientée Objets distribués sur plusieurs machines
Langage Machine
Assembleur Langage bas niveau
Chaque famille de CPU possède son
porophore jeu d’instructions
Programmation Orientée
Objet Distribués
Objets distribués sur plusieurs machines
Middlewares : (RMI, CORBA, JMS, …)
Programmation Orientée
composants
Objets distribués, réutilisables, configurables,
Interchangeables, évolutifs, mobiles, surveillable à
chaud : Conteneur (EJB, Spring) :AOP
Programmation Orientée
Services
Programmation Orientée
Agents
? Service + Intelligence + Apprentissage+ …
Composant disponibles à d’autres applications
distantes hétérogènes via des protocoles (http)
transportant des données: XML, JSON => SOAP
et REST
Industrialisation du génie logicielIndustrialisation du génie logiciel
Le processus du développement logiciel est,
aujourd'hui complètement industrialisé.
Un logiciel est construit à base de composants
◦ Réutilisables
◦ Interchangeable◦ Interchangeable
◦ Évolutifs
◦ Reconfigurables
◦ Mobiles
◦ Surveillables à chaud
◦ …
med@youssfi.net
Avènement des technologies Open SourceAvènement des technologies Open Source
En dix ans le développement logiciel a évolué en
grande partie grâce aux technologies Open
Sources.
Celles ci permettent aux développeurs
◦ de ne pas réinventer la roue
◦ et de se concentrer plus sur les aspects métiers des
applicationsapplications
◦ et utiliser les Framework pour résoudre les aspects
techniques.
Exemples :
◦ Spring, Struts, Hibernate (Coté Serveur)
◦ AngularJS, BootStrap (Coté Client)
◦ RMI, CORBA, JMS, JAXWS, JAXRS (Systèmes
Distribués)
med@youssfi.net
Avènement des méthodologies AgileAvènement des méthodologies Agile
Les méthodes Agile de gestion projet et de
développement comme Scrum ou
l'eXtreme Programming (XP) partent du
constat que le cycle de développement en
cascade est un échec.cascade est un échec.
Développement en cascade:
◦ spécifier pendant X mois,
◦ puis ensuite coderY mois,
◦ tester Z mois,
◦ pour livrer au client un projet qui ne correspond
plus tout à fait à ses attentes.
med@youssfi.net
Avènement des méthodologies AgileAvènement des méthodologies Agile
Les méthodes Agile prônent
◦ Les tests avant le développement (Test Driven
Development :TDD)
◦ Des cycles de développement itératifs,
◦ L’implication du client final tout au long du projet,◦ L’implication du client final tout au long du projet,
◦ Des spécifications réduites en début de projet,
◦ etc.
Les méthodologies Agile sont pragmatiques,
Ont fait leurs preuves et sont prisées par de
grands industriels de logiciels.
med@youssfi.net
Industrialiser le cycle de vie : améliorations,Industrialiser le cycle de vie : améliorations,
maintenance, correctionsmaintenance, corrections
Pour industrialiser les composants logiciels, il est
nécessaire d’utiliser des outils qui permettent
d’automatiser le processus de fabrication des logiciels
◦ Frameworks de tests : JUnit
Automatiser lesTests Unitaires
◦ Outils d'intégration continue : Maven
Ils jouent le rôle de chef d'orchestre pour piloter et automatiser leIls jouent le rôle de chef d'orchestre pour piloter et automatiser le
processus de développement logiciel :
Gérer les dépendances
Lancer la compilation des sources
Lancer lesTest Unitaires
Générer les packages (jar, war,ear)
Installer les packages dans le repository
Déployer l’application dans le serveur
Générer la documentation du projet
…
med@youssfi.net
Exigences d’un projet informatiqueExigences d’un projet informatique
Exigences fonctionnelles:
◦ Une application est créée pour répondre , tout d’abord, aux
besoins fonctionnels des entreprises.
ExigencesTechniques :
◦ Les performances:
Montée en charge
Haute disponibilité et tolérance aux pannes
◦ La maintenance:
med@youssfi.net | ENSET Université
Hassan II
◦ La maintenance:
Fermée à la modification et Ouverte à l’extension
◦ Sécurité
◦ Portabilité
◦ Distribution
◦ Capacité de communiquer avec d’autres applications distantes.
◦ Capacité de fournir le service à différents type de clients (DeskTOP, Mobile, SMS, http…)
◦ …..
Exigences financières : Coût du logiciel
9
Comment faire surmonter toutes contraintesComment faire surmonter toutes contraintes
Il est très difficile de développer un système logiciel qui respecte ces
exigences sans utiliser l’expérience des autres :
◦ Bâtir l’application sur une architecture d’entreprise: (JEE,. Net )
◦ Framework pour l’Inversion de contrôle:
Permettre au développeur de se concentrer sur le code métier (Exigences fonctionnelles)
Le Framework s’occupe du codeTechnique (ExigenceTechnique)
Grâce à la Programmation Orientée Aspect (AOP)
Exemple : Spring, EJB pour l’architecture JEE
◦ Utiliser des modèles de conceptions confirmés : Design Patterns◦ Utiliser des modèles de conceptions confirmés : Design Patterns
◦ Frameworks :
Mapping objet relationnel (ORM ) : JPA, Hibernate,Toplink, …
ApplicationsWeb coté serveur : Struts, JSF, SpringMVC
Applications web coté client : AngylarJS, BootStrap
…
◦ Middlewares pour les applications Distribuées :
RMI, CORBA :Applications distribuées
JAXWS pourWeb services basés SOAP (HTTP+XML)
JAXRS pour les Web services RESTful (HTTP+(JSON/XML,…) )
JMS : Communication asynchrone entre les application
…
Exemple : sans utiliser d’inversion de contrôleExemple : sans utiliser d’inversion de contrôle
public void virement(int c1, int c2, double mt) {
/* Création d’une transaction */
EntityTransaction transaction=entityManager.getTransaction();
/* Démarrer la transaction */
transaction.begin();
try {
/* Code métier */
retirer(c1,mt);
Code Métier
CodeTechnique
retirer(c1,mt);
verser(c2,mt);
/* Valider la transaction */
transaction.commit();
} catch (Exception e) {
/* Annuler la transaction en cas d’exception */
transaction.rollback();
e.printStackTrace();
}
}
med@youssfi.net | ENSET Université
Hassan II
Code Métier
CodeTechnique
Exemple : en utilisant l’inversion de contrôleExemple : en utilisant l’inversion de contrôle
@Transactional
public void virement(int c1, int c2, double mt) {
retirer(c1,mt);
verser(c2,mt);
}
Code Métier
Ici, avec l’annotation @Transactional, nous avons
med@youssfi.net | ENSET Université
Hassan II
Ici, avec l’annotation @Transactional, nous avons
délégué la gestion des transaction au conteneur
Spring IOC
Evolution des techniques de programmationEvolution des techniques de programmation
Programmation Procédurale
Programmation Orientée
Objet
Sous programmes: Procédures, fonctions
(Basic, Pascal, C, Fortran,..)
Objet = Etat+ Comportement + Identité
Concepts fondamentaux : Objet, classe, Héritage,
polymorphisme, encapsulation (C++, JAVA, C#, ..)
Programmation Orientée Objets distribués sur plusieurs machines
Langage Machine
Assembleur Langage bas niveau
Chaque famille de CPU possède son
porophore jeu d’instructions
Programmation Orientée
Objet Distribués
Objets distribués sur plusieurs machines
Middlewares : (RMI, CORBA, JMS, …)
Programmation Orientée
composants
Objets distribués, réutilisables, configurables,
Interchangeables, évolutifs, mobiles, surveillable à
chaud : Conteneur (EJB, Spring) :AOP
Programmation Orientée
Services
Programmation Orientée
Agents
? Service + Intelligence + Apprentissage+ …
Composant disponibles à d’autres applications
distantes hétérogènes via des protocoles (http)
transportant des données: XML, JSON => SOAP
et REST
ArchitecturesArchitectures
DistribuésDistribués
SGBD
Serveur d’application J2EE
Couche DAO
Mapping Objet Relationnel (JPA, Hibernate)
Couche métier
Couche Service
RMI, JMS
CORBA,SOAPApp Java
Application .Net SOAP (HTTP+XML)
ou CORBA
App Mobile
REST (HTTP+JSON)
Couche webCouche Service
MiddleWares :
- RMI
- CORBA
- EJB Session
- SOAP (Web Sevices)
- JMS
-SMSLib
Client HTTP
- HTML, CSS, JavaScript
- AngulatJS,Jquery
- BootStrap
HTTP
Services d’infrastructure
Aplication PHP
SOAP (HTTP+XML)
Client JMS
JMS
Client SMS
SMS
Couche web
-Servlet
- JSP
- FrameWorks
-Struts
-Spring MVC
- JSF
Serveur d’application J2EE
Web Container
(Couche Web)
Architecture J2EEArchitecture J2EE
Spring ou EJB
Container
(Couche Métier)
Servlet, JSP
Service
Client Java
RMI,
JMS
Client http
Client SOAP
Java, .Net, PHP, Cobol
HTTP
HTML
SOAP
XML
Services de
l’infrastructure
JTA
JaxWS, Jax RS
Jersey, CXF, AXIS
JNDI
Spring MVC, JSF
Composants
SGBD
Data BaseData Base
Service
SOAP
Service
RESTful
Java, .Net, PHP, Cobol
JDBC
JPA
Hibernate
Client HTTP
Mobile, JQuery, Flash
HTTP
JSON, XML, ..
JNDI
….AXIS, CXF
Jersey, CXF
Entity Entity
Composants
Métier
(Traitements)
JMS
JMX
De l'application monolithique auxDe l'application monolithique aux
architectures micro servicesarchitectures micro services
Une application monolithique est une application qui est développée en
un seul bloc (war, jar, Ear) et déployée d’une manière unitaire dans un
serveur d’application
Serveur d’application
Application.war
med@youssfi.net | ENSET Université
Hassan II de Casablanca
CoucheWeb et Service
Couche Métier
Couche DAO
IOC Containner
Application.war
Client
Client
Client
HTTP
RMI
SOAP, REST
SGBD
Problèmes des applications monolithiquesProblèmes des applications monolithiques
Les principaux problème des applications
monolithiques sont :
◦ Elles centralisent tous les besoins fonctionnels
◦ Elles sont réalisées dans une seule technologie.
◦ Chaque modification nécessite de :◦ Chaque modification nécessite de :
Tester les régressions
Redéployer toute l’application
◦ Difficile à faire évoluer au niveau fonctionnel
◦ Livraison en bloc (Le client attend beaucoup de
temps pour commencer à voir les premières
versions )
Les Micro servicesLes Micro services
Les micro services sont une approche d’architecture et de
développement d’une application composées de petits
services.
L’idée étant de découper un grand problème en petites
unités implémentée sous forme de micro-services
Chaque service est responsable d’une fonctionnalité,
Chaque micro-service est développé, testé et déployéChaque micro-service est développé, testé et déployé
séparément des autres.
Chaque service tourne dans un processus séparé.
La seule relation entre les différents micro services est
l’échange de données effectué à travers les différentes APIs
qu’ils exposent. ( SOAP, REST, RMI, CORBA, JMS,…)
Lorsqu’on les combinent, ces micro services peuvent
réaliser des opérations très complexes.
Aspects clef des micro servicesAspects clef des micro services
Chaque micro service peut être conçu à l’aide
de n’importe quel outil et développé avec
n’importe quel langage et technologie.
Ils sont faiblement couplés puisque chaque
micro service est physiquement séparé des
autres,autres,
Indépendance relative entre les différentes
équipes qui développement les différents micro
services (en partant du principe que les APIs
qu’ils exposent sont définis à l’avance).
Facilité des tests et du déploiement ou de la
livraison continue.
med@youssfi.net | ENSET Université
Hassan II de Casablanca
MicroMicro serviceservice
Un micro service combine les trois couches « métier,
technique et données » en une seule, accessible via des
API.
MISE EN ŒUVRE DESMISE EN ŒUVRE DES
ARCHITECTURES BASÉESARCHITECTURES BASÉESARCHITECTURES BASÉESARCHITECTURES BASÉES
SUR LES MICROSUR LES MICRO--SERVICESSERVICES
SpringSpring BootBoot
Spring Boot est un Framework qui permet de créer
des applications basées sur des micro services.
Atouts de Spring Boot :
◦ Faciliter le développement d’applications complexes.
◦ Faciliter à l’extrême l’injection des dépendances
◦ Réduire à l’extrême les fichier de configurationsRéduire à l’extrême les fichier de configurations
◦ Faciliter la gestion des dépendances Maven.
◦ Auto Configuration : la plupart des beans sont créés si
le ou les jar(s) adéquats sont dans le classpath.
◦ Fournir un conteneur de servlet embarqué (Tomcat,
Jetty)
◦ Créer une application autonome (jar ou war)
med@youssfi.net | ENSET Université
Hassan II de Casablanca
EXEMPLEEXEMPLE
D’APPLICATIOND’APPLICATIOND’APPLICATIOND’APPLICATION
SPRINGSPRING BOOTBOOT
med@youssfi.net | ENSET Université
Hassan II de Casablanca
https://www.youtube.com/watch?v=zBLXWIhrg7U
Premier Exemple d’applicationPremier Exemple d’application
On souhaite créer une application qui permet de gérer des produits.
Chaque produit est défini par :
◦ Sa référence de type String
◦ Sa désignation de type String
◦ Son prix
L’applications de permettre de :
◦ Ajouter de nouveaux produits
◦ Consulter les produits
◦ Chercher les produits par mot clé
◦ Consulter un produit◦ Consulter un produit
◦ Mettre à jour un produit
◦ Supprimer un produit
Les données sont stockées dans une base de données MySQL
L’application est un service Restful basée sur Spring Boot
La couche web respecte MVC coté Client et basée sur :
◦ HTML5
◦ CSS, Bootstrap
◦ Angular JS
med@youssfi.net | ENSET Université
Hassan II de Casablanca
ArchitectureArchitecture
DAODAO
ServeurTomcat : 8080
Spring Boot IOC Containner
HTML 5
<<Entity>><<Entity>>
Produit
ServiceService
HTML 5
Angular JS
Boot Strap
Client Mobile
Androïde
HTTP, JSON
SGBDSpring DataSpring Data
ProduitProduit
<<interface>>
ProduitRepository
JPAJPA
HibernateHibernate
JDBCJDBC
<<service>>
CatService
HTTP, JSON
Exemple deExemple deVue à implémenterVue à implémenter
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Création d’un projetCréation d’un projet SpringSpring BootBoot
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Création d’un projetCréation d’un projet SpringSpring BootBoot
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Structure du projetStructure du projet
med@youssfi.net | ENSET Université
Hassan II de Casablanca
MavenMaven
Maven, géré par l'organisation Apache Software Foundation. (
Jakarta Project), est un outil pour la gestion et l'automatisation de
production des projets logiciels Java en général et Java EE en
particulier.
L'objectif recherché est de
◦ produire un logiciel à partir de ses sources,
◦ en optimisant les tâches réalisées à cette fin
◦ et en garantissant le bon ordre de fabrication.◦ et en garantissant le bon ordre de fabrication.
Compiler,Tester, Contrôler, produire les packages livrables
Publier la documentation et les rapports sur la qualité
Apports :
◦ Simplification du processus de construction d’une application
◦ Fournit les bonnes pratique de développement
◦ Tend à uniformiser le processus de construction logiciel
◦ Vérifier la qualité du code
◦ Faciliter la maintenance d’un projet
med@youssfi.net | ENSET Université
Hassan II
Maven : POMMaven : POM
Maven utilise un paradigme connu sous le nom de Project Object
Model (POM) afin de :
◦ Décrire un projet logiciel,
◦ Ses dépendances avec des modules externes
◦ et l'ordre à suivre pour sa production.
Il est livré avec un grand nombre de tâches (GOLS) prédéfinies,
comme la compilation du code Java ou encore sa modularisation.
med@youssfi.net | ENSET Université
Hassan II
pom.xmlpom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.sid</groupId>
<artifactId>cats</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>cats</name>
<description>Demo project for Spring Boot</description>
<parent><parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<start-class>cats.CatsApplication</start-class>
<java.version>1.7</java.version>
</properties>
med@youssfi.net | ENSET Université
Hassan II de Casablanca
pom.xmlpom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency></dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
pom.xmlpom.xml
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins></plugins>
</build>
</project>
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Structure du projetStructure du projet
med@youssfi.net | ENSET Université
Hassan II de Casablanca
application.propertiesapplication.properties
# DataSource settings:
spring.datasource.url = jdbc:mysql://localhost:3306/db_boot_cat5
spring.datasource.username = root
spring.datasource.password =
spring.datasource.driverClassName = com.mysql.jdbc.Driver
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
med@youssfi.net | ENSET Université
Hassan II de Casablanca
SpringSpring Boot ApplicationBoot Application
package cat;
import org.springframework.boot.SpringApplication;
import
org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class CatApplication {public class CatApplication {
public static void main(String[] args) {
SpringApplication.run(CatApplication.class, args);
}
}
med@youssfi.net | ENSET Université
Hassan II de Casablanca
ENTITÉSENTITÉS
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Entité ProduitEntité Produit
package cat.entities;
@Entity
public class Produit implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long reference;private Long reference;
private String designation;
private double prix;
// getters et Setters
// Constructeurs
}
med@youssfi.net | ENSET Université
Hassan II de Casablanca
COUCHE DAOCOUCHE DAO
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Tester les entitésTester les entités
Démarrer l’application et vérifier si la
tables produits a été bien créée.
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Couche DAOCouche DAO
package cat.dao;
public interface IProduitRepository extends JpaRepository<Produit, Long> {
@Query("select p from Produit p where p.designation like :x")
public Page<Produit> produitParMC(@Param("x")String mc,Pageable p);
public List<Produit> findByDesignation(String des);
public Page<Produit> findByDesignation(String des,Pageable p);
}
med@youssfi.net | ENSET Université
Hassan II de Casablanca
COUCHE WEBCOUCHE WEB
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Le contrôleurLe contrôleur RestRest
package cat.controllers;
@RestController
public class CatalogueController {
@Autowired
private IProduitRepository produitRepository;
@RequestMapping("/save")
public Produit saveProduit(Produit p){public Produit saveProduit(Produit p){
produitRepository.save(p);
return p;
}
@RequestMapping("/all")
public List<Produit> getProduits(){
return produitRepository.findAll();
}
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Le contrôleurLe contrôleur RestRest
@RequestMapping("/produits")
public Page<Produit> getProduits(int page){
return produitRepository.findAll(new PageRequest(page, 5));
}
@RequestMapping("/produitsParMC")
public Page<Produit> getProduits(String mc,int page){
return produitRepository.produitParMC("%"+mc+"%", new
PageRequest(page, 5));PageRequest(page, 5));
}
@RequestMapping("/get")
public Produit getProduit(Long ref){
return produitRepository.findOne(ref);
}
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Le contrôleurLe contrôleur RestRest
@RequestMapping("/delete")
public boolean delete(Long ref){
produitRepository.delete(ref);
return true;
}
@RequestMapping("/update")
public Produit update(Produit p){
produitRepository.saveAndFlush(p);
return p;
}
}
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Ajouter un produitAjouter un produit
Coté Client
med@youssfi.net | ENSET Université
Hassan II de Casablanca
@RequestMapping("/save")
public Produit saveProduit(Produit p){
produitRepository.save(p);
return p;
}
Coté Service
Consulter tous les produitsConsulter tous les produits
Coté Client
med@youssfi.net | ENSET Université
Hassan II de Casablanca
@RequestMapping("/all")
public List<Produit> getProduits(){
return produitRepository.findAll();
}
Coté Service
Consulter une page de produitsConsulter une page de produits
Coté Client
med@youssfi.net | ENSET Université
Hassan II de Casablanca
@RequestMapping("/produits")
public Page<Produit> getProduits(int page){
return produitRepository.findAll(new PageRequest(page, 5));
}
Coté Service
Consulter une page de produitsConsulter une page de produits
Coté Client
med@youssfi.net | ENSET Université
Hassan II de Casablanca
@RequestMapping("/produits")
public Page<Produit> getProduits(int page){
return produitRepository.findAll(new PageRequest(page, 5));
}
Coté Service
Chercher les produits par mot cléChercher les produits par mot clé
Coté Client
med@youssfi.net | ENSET Université
Hassan II de Casablanca
@RequestMapping("/produitsParMC")
public Page<Produit> getProduits(String mc,int page){
return produitRepository.produitParMC("%"+mc+"%", new PageRequest(page, 5));
}
Coté Service
Consulter un produitConsulter un produit
Coté Client
med@youssfi.net | ENSET Université
Hassan II de Casablanca
@RequestMapping("/get")
public Produit getProduit(Long ref){
return produitRepository.findOne(ref);
}
Coté Service
Mettre à jour à produitMettre à jour à produit
Coté Client
med@youssfi.net | ENSET Université
Hassan II de Casablanca
@RequestMapping("/update")
public Produit update(Produit p){
produitRepository.saveAndFlush(p);
return p;
}
Coté Service
Supprimer un produitSupprimer un produit
Coté Client
med@youssfi.net | ENSET Université
Hassan II de Casablanca
@RequestMapping("/delete")
public boolean delete(Long ref){
produitRepository.delete(ref);
return true;
}
Coté Service
Couche PrésentationWeb Coté ClientCouche PrésentationWeb Coté Client
HTML5
Java Script avec le framework Angular JS
CSS avec le framework BootStrap
med@youssfi.net | ENSET Université
Hassan II de Casablanca
index.htmlindex.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Catalogue</title>
<link rel="stylesheet" type="text/css" href="bootstrap-3.3.4-
dist/css/bootstrap.min.css"/>
<link rel="stylesheet" type="text/css" href="css/style.css"/>
</head>
<body ng-app="MyCat" ng-controller="CatController" >
<div class="container spacer">
<form>
<label>Mot Clé:</label>
<input type="text" ng-model="motCle">
<button ng-click="charger()">Chercher</button>
</form>
</div>
med@youssfi.net | ENSET Université
Hassan II de Casablanca
index.htmlindex.html
<div class="container spacer">
<table class="table table-striped">
<thead>
<tr>
<th>REF</th><th>DES</th><th>PRIX</th>
</tr>
</thead>
<tbody><tbody>
<tr ng-repeat="p in produits.content">
<td>{{p.reference}}</td>
<td>{{p.designation}}</td>
<td>{{p.prix}}</td>
</tr>
</tbody>
</table>
</div>
med@youssfi.net | ENSET Université
Hassan II de Casablanca
index.htmlindex.html
<div class="container">
<ul class="nav nav-pills">
<li ng-class="{active:$index==pageCourante}"
class="clickable" ng-repeat="p in pages track by $index">
<a ng-click="gotoPage($index)">{{$index}}</a>
</li>
</ul>
</div></div>
<script type="text/javascript"
src="angular/angular.min.js"></script>
<script type="text/javascript" src="js/app.js"></script>
</body>
</html>
med@youssfi.net | ENSET Université
Hassan II de Casablanca
app.jsapp.js
var app=angular.module("MyCat",[]);
app.controller("CatController",function($scope,$http){
$scope.produits=[];
$scope.motCle=null;
$scope.pageCourante=0;
$scope.charger=function(){
$http.get("/produitsParMC?mc="+$scope.motCle+"&page="+$scope.pageCourante)
.success(function(data){
$scope.produits=data;
$scope.pages=new Array(data.totalPages)$scope.pages=new Array(data.totalPages)
});
};
$scope.gotoPage=function(p){
$scope.pageCourante=p;
$scope.charger();
};
});
med@youssfi.net | ENSET Université
Hassan II de Casablanca
style.cssstyle.css
.spacer{
margin-top: 30px;
}
.clickable{
cursor: pointer;
}}
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Deuxième ApplicationDeuxième Application
Supposant que l’on souhaite créer créer une application qui permet de
gérer le catalogue des produits appartenant à des catégories.
Chaque produit est définit par :
◦ Sa référence de type String
◦ Sa désignation de type String
◦ Son prix de type double
◦ Sa quantité de type int
◦ Sa disponibilité de type boolean
◦ Sa photo
Une catégorie est définie par :Une catégorie est définie par :
◦ Son code de type Long (Auto Increment)
◦ Son nom de type String
L’application doit permettre
◦ D’ajouter une nouvelle catégorie
◦ Ajouter un produit appartenant à une catégorie
◦ Consulter toutes les catégories
◦ Consulter les produits dont le nom contient un mot clé
◦ Consulter les produits d’une catégorie
◦ Consulter un produit
◦ Mettre à jour un produit
◦ Supprimer une catégorie
L’injection des dépendances sera assurée par Spring IOC
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Création d’un projetCréation d’un projet SpringSpring StarterStarter
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Création d’un projetCréation d’un projet
SpringSpring StarterStarter
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Création d’un projetCréation d’un projet
SpringSpring StarterStarter
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Structure du projetStructure du projet
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Pom.xmlPom.xml
<modelVersion>4.0.0</modelVersion>
<groupId>org.sid</groupId>
<artifactId>catalogue</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>catalogue</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Pom.xmlPom.xml
<properties>
<project.build.sourceEncoding>UTF-
8</project.build.sourceEncoding>
<start-class>org.sid.CatalogueApplication</start-class>
<java.version>1.7</java.version>
</properties>
<dependencies>
<dependency><dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Pom.xmlPom.xml
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope><scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> med@youssfi.net | ENSET Université
Hassan II de Casablanca
application.propertiesapplication.properties
# DataSource settings:
spring.datasource.url = jdbc:mysql://localhost:3306/db_boot
spring.datasource.username = root
spring.datasource.password =
spring.datasource.driverClassName = com.mysql.jdbc.Driver
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = truespring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
# View Resolver
spring.view.prefix: /WEB-INF/views/
spring.view.suffix: .jsp
med@youssfi.net | ENSET Université
Hassan II de Casablanca
SpringBootApplicationSpringBootApplication
package org.sid;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class CatalogueApplication {
public static void main(String[] args) {
SpringApplication.run(CatalogueApplication.class, args);
}
}
med@youssfi.net | ENSET Université
Hassan II de Casablanca
PremierPremier ControleurControleur SpringSpring
package org.sid.controllers;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class CatalogueController {
@RequestMapping(value="/index")
@ResponseBody@ResponseBody
public String index(){
return "Test";
}
@RequestMapping(value="/test")
public String test(){
return "Test";
}
}
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Exécuter l’applicationExécuter l’application SpringBootSpringBoot
Run As > Java ApplicationRun As > Java Application
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Tester l’applicationTester l’application
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Tomcat : 8080
SpringBoot (IOC)
DispatcherServlet
SpringMVC
CatalogueController
HTTP
Travailler Coté serveur avec JSP et JSTLTravailler Coté serveur avec JSP et JSTL
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId><artifactId>jstl</artifactId>
</dependency>
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Exemple d’applicationExemple d’application
Supposant que l’on souhaite créer créer une application qui permet de
gérer le catalogue des produits appartenant à des catégories.
Chaque produit est définit par :
◦ Sa référence de type String
◦ Sa désignation de type String
◦ Son prix de type double
◦ Sa quantité de type int
◦ Sa disponibilité de type boolean
◦ Sa photo
Une catégorie est définie par :Une catégorie est définie par :
◦ Son code de type Long (Auto Increment)
◦ Son nom de type String
L’application doit permettre
◦ D’ajouter une nouvelle catégorie
◦ Ajouter un produit appartenant à une catégorie
◦ Consulter toutes les catégories
◦ Consulter les produits dont le nom contient un mot clé
◦ Consulter les produits d’une catégorie
◦ Consulter un produit
◦ Mettre à jour un produit
◦ Supprimer une catégorie
L’injection des dépendances sera assurée par Spring IOC
med@youssfi.net | ENSET Université
Hassan II de Casablanca
ENTITÉSENTITÉS
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Entités : Produit etEntités : Produit et CategorieCategorie
Diagramme de classes : Modèle Objet
@OneToMany@ManyToOne
med@youssfi.net | ENSET Université
Hassan II de Casablanca
MLDR : Modèle Relationnel
- CATEGORIES (ID_CAT, NOM_CAT)
- PRODUITS (REF, DES, PRIX, QTE, DISPO, PHOTO, #ID_CAT)
Entité : ProduitEntité : Produitpackage dao;
import java.io.Serializable; import javax.persistence.*;
@Entity
public class Produit implements Serializable {
@Id
private String reference;
private String designation; private double prix; private int quantite;
private boolean disponible; private String photo;
@ManyToOne
@JoinColumn(name="ID_CAT")@JoinColumn(name="ID_CAT")
private Categorie categorie;
public Produit() { }
public Produit(String reference, String designation, double prix, int
quantite, boolean disponible, String photo) {
this.reference = reference; this.designation = designation;
this.prix = prix; this.quantite = quantite; this.disponible = disponible;
this.photo = photo;
}
// Getters et Setters
} med@youssfi.net | ENSET Université
Hassan II de Casablanca
Entité :Entité : CategorieCategorie
package dao;
import java.io.Serializable; import java.util.Collection;
import javax.persistence.*;
@Entity
public class Categorie implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long idCategorie;
private String nomCategorie;
@OneToMany(mappedBy="categorie",fetch=FetchType.LAZY)
private Collection<Produit> produits;
public Categorie() { }
public Categorie(String nomCategorie) {
this.nomCategorie = nomCategorie;
}
// Getters et Setters
@JsonIgnore
@XmlTransient
public Collection<Produit> getProduits() {
return produits;
}
}
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Redémarrer l’applicationRedémarrer l’application SpringSpring BootBoot
Les tables devraient être générées
Table Categories :
Table Produits :
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Table Produits :
Couche DAOCouche DAO
package org.sid.dao;
import org.sid.entities.Categorie;
import org.springframework.data.jpa.repository.JpaRepository;
public interface CategorieRepository extends JpaRepository<Categorie, Long> {
}
package org.sid.dao;
import java.util.List;
med@youssfi.net | ENSET Université
Hassan II de Casablanca
import java.util.List;
import org.sid.entities.*;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param;
public interface ProduitRepository extends JpaRepository<Produit, String> {
public List<Produit> findByDesignation(@Param("mc")String mc);
public Page<Produit> findByCategorie(Categorie categorie,Pageable pageable);
}
MVC CLIENTMVC CLIENT SIDESIDE
-- HTML, CSS, JAVA SCRIPTHTML, CSS, JAVA SCRIPT-- HTML, CSS, JAVA SCRIPTHTML, CSS, JAVA SCRIPT
-- ANDROÏDE CLIENTANDROÏDE CLIENT
-- IOSIOS CLIENTCLIENT
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Contrôleur : Gestion des produits et des catégoriesContrôleur : Gestion des produits et des catégories
package org.sid.controllers;
import java.util.List;
import org.sid.dao.CategorieRepository; import org.sid.dao.ProduitRepository;
import org.sid.entities.Categorie; import org.sid.entities.Produit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class MyCatalogueController {public class MyCatalogueController {
@Autowired
private CategorieRepository categorieRepository;
@Autowired
private ProduitRepository produitRepository;
@RequestMapping(value="/saveCat")
@ResponseBody
public Categorie saveCategorie(Categorie c){
return categorieRepository.save(c);
}
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Contrôleur : Gestion des produits et des catégoriesContrôleur : Gestion des produits et des catégories
@RequestMapping(value="/allCat")
@ResponseBody
public List<Categorie> allCategories(){
return categorieRepository.findAll();
}
@RequestMapping(value="/saveProduit")
@ResponseBody
public Produit saveProduit(Produit p){public Produit saveProduit(Produit p){
return produitRepository.save(p);
}
@RequestMapping(value="/allProduits")
@ResponseBody
public List<Produit> allProduits(){
return produitRepository.findAll();
}
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Contrôleur : Gestion des produits et des catégoriesContrôleur : Gestion des produits et des catégories
@RequestMapping(value="/pageProduits")
@ResponseBody
public Page<Produit> pageProduits(int page){
return produitRepository.findAll(new PageRequest(page, 3));
}
@RequestMapping(value="/produitsParCat")
@ResponseBody
public Page<Produit> produitsParCat(Categorie c,int page){public Page<Produit> produitsParCat(Categorie c,int page){
return produitRepository.findByCategorie(c, new
PageRequest(page, 3));
}
@RequestMapping(value="/produitsParMC")
@ResponseBody
public List<Produit> produitsParCat(String mc){
return produitRepository.findByDesignation(mc);
}
} med@youssfi.net | ENSET Université
Hassan II de Casablanca
Ajouter une catégorieAjouter une catégorie
med@youssfi.net | ENSET Université
Hassan II de Casablanca
@RequestMapping(value="/saveCat")
@ResponseBody
public Categorie saveCategorie(Categorie c){
return categorieRepository.save(c);
}
Consulter toutes les catégoriesConsulter toutes les catégories
med@youssfi.net | ENSET Université
Hassan II de Casablanca
@RequestMapping(value="/allCat")
@ResponseBody
public List<Categorie> allCategories(){
return categorieRepository.findAll();
}
Ajouter un produitAjouter un produit
@RequestMapping(value="/saveProduit")
med@youssfi.net | ENSET Université
Hassan II de Casablanca
@RequestMapping(value="/saveProduit")
@ResponseBody
public Produit saveProduit(Produit p){
return produitRepository.save(p);
}
Consulter tous les produitsConsulter tous les produits
med@youssfi.net | ENSET Université
Hassan II de Casablanca
@RequestMapping(value="/allProduits")
@ResponseBody
public List<Produit> allProduits(){
return produitRepository.findAll();
}
Consulter une page de produitsConsulter une page de produits
med@youssfi.net | ENSET Université
Hassan II de Casablanca
@RequestMapping(value="/pageProduits")
@ResponseBody
public Page<Produit> pageProduits(int page){
return produitRepository.findAll(new PageRequest(page, 3));
}
Consulter une page de produitsConsulter une page de produits
med@youssfi.net | ENSET Université
Hassan II de Casablanca
@RequestMapping(value="/produitsParCat")
@ResponseBody
public Page<Produit> produitsParCat(Categorie c,int page){
return produitRepository.findByCategorie(c, new PageRequest(page, 3));
}
Produits parProduits par designationdesignation
med@youssfi.net | ENSET Université
Hassan II de Casablanca
@RequestMapping(value="/produitsParMC")
@ResponseBody
public List<Produit> produitsParCat(String mc){
return produitRepository.findByDesignation(mc);
}
Structure du projetStructure du projet
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Application web avec HTML,Application web avec HTML,
AngularJSAngularJS etet BootStrapBootStrap coté clientcoté client
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Structure du projetStructure du projet
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Catal.jsCatal.js
angular.module("catalogue",[])
.controller("Catcontroller",function($scope,$http,$location){
$scope.categories=[];
$scope.produits=[];
$scope.selectedCategorie=null;
$scope.pages=new Array();
$scope.pageCourante=0;
$scope.chargerCategories=function(){
$http.get("/allCat")
.success(function(data){
$scope.categories=data;
});
};
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Catal.jsCatal.js
$scope.chargerProduits=function(){
$http.get("/produitsParCat?page="+$scope.pageCourante+"&idCategorie
="+$scope.selectedCategorie)
.success(function(data){
$scope.produits=data;
$scope.pages=new Array(data.totalPages);
});
};};
$scope.chargerCategories();
$scope.gotoURL=function(){
$scope.pageCourante=0;
$location.path("/"+$scope.selectedCategorie);
};
$scope.gotoPage=function(page){
$scope.pageCourante=page;
$location.path("/"+$scope.selectedCategorie+"/"+page);
}; med@youssfi.net | ENSET Université
Hassan II de Casablanca
Catal.jsCatal.js
$scope.$watch(
function(){return $location.path();},
function(newPath){
//console.log(newPath);
var tabPath=newPath.split("/");
$scope.pageCourante=0;
if(tabPath.length==2){
$scope.selectedCategorie=tabPath[1];
$scope.chargerProduits();$scope.chargerProduits();
}
else if(tabPath.length==3){
$scope.selectedCategorie=tabPath[1];
$scope.pageCourante=tabPath[2];
$scope.chargerProduits();
};
});
});
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Cat.htmlCat.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Catalogue de produits</title>
<link rel="stylesheet" href="bootstrap-3.3.4-dist/css/bootstrap.min.css" />
<link rel="stylesheet"
href="bootstrap-3.3.4-dist/css/bootstrap-theme.min.css" />
<link rel="stylesheet" href="css/style2.css" />
</head></head>
<body ng-app="catalogue" ng-controller="Catcontroller">
<div class="container spacer">
<form>
<label>Catégories:</label> <select ng-model="selectedCategorie"
ng-change="gotoURL()">
<option ng-repeat="cat in categories" value="{{cat.idCategorie}}">
{{cat.nomCategorie}}</option>
</select>
</form>
</div>
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Cat.htmlCat.html
<div class="container">
<table class="table table-striped table-hover spacer">
<thead>
<tr>
<th>REF</th>
<th>DES</th>
<th>PRIX</th>
<th>QTE</th>
</tr>
</thead></thead>
<tbody>
<tr ng-repeat="p in produits.content">
<td>{{p.reference}}</td>
<td>{{p.designation}}</td>
<td>{{p.prix}}</td>
<td>{{p.quantite}}</td>
</tr>
</tbody>
</table>
</div>
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Cat.htmlCat.html
<ul ng-show="produits.totalPages>1" class="container nav nav-pills">
<li class="clickable" ng-repeat="p in pages track by $index" ng-
class="{active:$index==pageCourante}" >
<a ng-click="gotoPage($index)">{{$index}}</a>
</li>
</ul>
<script type="text/javascript" src="js/angular.min.js"></script>
<script type="text/javascript" src="js/catal.js"></script>
</body>
</html>
med@youssfi.net | ENSET Université
Hassan II de Casablanca
MVC SERVERMVC SERVER SIDESIDE
-- JSPJSP-- JSPJSP
-- JSTLJSTL
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Structure du projetStructure du projet
Catalogue.jsp
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Le contrôleurLe contrôleur
package org.sid.controllers;
import org.sid.dao.CategorieRepository;import org.sid.dao.ProduitRepository;
import org.sid.entities.Categorie; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ServerSideCatalogueController {
@Autowired
private CategorieRepository categorieRepository;
@Autowired
private ProduitRepository produitRepository;
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Le contrôleurLe contrôleur
@RequestMapping("/catalogue")
public String catalogue(Model model){
model.addAttribute("categories",categorieRepository.findAll());
model.addAttribute("categorie", new Categorie());
return "catalogue";
}
@RequestMapping("/produits")
public String produits(@ModelAttribute Categorie categorie,Modelpublic String produits(@ModelAttribute Categorie categorie,Model
model,int page){
model.addAttribute("categories",categorieRepository.findAll());
model.addAttribute("pageProduits",produitRepository.findByCategorie
(categorie,new PageRequest(page, 3)));
return "catalogue";
}
}
med@youssfi.net | ENSET Université
Hassan II de Casablanca
catalogue.jspcatalogue.jsp
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="f" %>
<!DOCTYPE html>
<html>
<head>
<title>Catalogue de produits</title>
<link rel="stylesheet" type="text/css"
href="<%=request.getContextPath()%>/css/style.css"/>
</head>
<body>
<div><div>
<f:form modelAttribute="categorie" action="produits?page=0">
<table>
<tr>
<td>Catérogies:</td>
<td><f:select path="idCategorie" items="${categories}"
itemLabel="nomCategorie" itemValue="idCategorie"></f:select></td>
<td><input type="submit" value="OK"/></td>
</tr>
</table>
</f:form>
</div> med@youssfi.net | ENSET Université
Hassan II de Casablanca
catalogue.jspcatalogue.jsp
<div>
<div>
<table class="table1">
<tr>
<th>REF</th><th>DES</th><th>PRIX</th><th>QTE</th> <th>DISPO</th>
<th>PHOTO</th>
</tr>
<c:forEach items="${pageProduits.getContent()}" var="p">
<tr>
<td>${p.getReference() }</td><td>${p.getReference() }</td>
<td>${p.designation }</td>
<td>${p.prix }</td>
<td>${p.quantite }</td>
<td>${p.disponible }</td>
<td>${p.photo }</td>
</tr>
</c:forEach>
</table>
</div>
med@youssfi.net | ENSET Université
Hassan II de Casablanca
catalogue.jspcatalogue.jsp
<div>
<c:if test="${ not empty pageProduits and
pageProduits.getTotalPages()>=2}">
<c:forEach begin="0" end="${pageProduits.getTotalPages() -1}"
var="p">
<span class="autrePage">
<c:if test="${pageProduits.getNumber()!=p }">
<a
href="produits?page=${p}&idCategorie=${categorie.idCategorie}" >Page ${p
}</a>
</c:if></c:if>
<c:if test="${pageProduits.getNumber()==p }">
Page ${p }
</c:if>
</span>
</c:forEach>
</c:if>
</div>
</div>
</body>
</html>
med@youssfi.net | ENSET Université
Hassan II de Casablanca
style.cssstyle.css
body{
font-family: cursive;
font-size: 12px;
}
div{
border: 1px dotted gray;
padding: 5px;
margin: 5px;
}
.table1 th{.table1 th{
border: 1px dotted gray;
padding: 5px;
margin: 5px;
background: pink;
}
.table1 td{
border: 1px dotted gray;
padding: 5px;
margin: 5px;
background: white;
}
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Web Service SOAPWeb Service SOAP
package org.sid.services;
import java.util.List; import javax.jws.WebMethod; import javax.jws.WebParam;
import javax.jws.WebService; import org.sid.dao.CategorieRepository;
import org.sid.dao.ProduitRepository; import org.sid.entities.Categorie;
import org.sid.entities.Produit; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@WebService
public class CatalogueService {
@Autowired
private ProduitRepository produitRepository;
@Autowired
private CategorieRepository categorieRepository;
@WebMethod
public List<Categorie> allCategories(){
return categorieRepository.findAll();
}
@WebMethod
public List<Produit> produits(@WebParam(name="idCat")Long idCat){
Categorie c=new Categorie(); c.setIdCategorie(idCat);
return produitRepository.findByCategorie(c, null).getContent();
}
}
Déployer le web service avecDéployer le web service avec springspring
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter">
<property name="baseAddress" value="http://0.0.0.0:8787/services/"></property>
</bean></bean>
</beans>
med@youssfi.net | ENSET Université
Hassan II de Casablanca
L’applicationL’application SpringSpring BootBoot
package org.sid;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportResource;
@SpringBootApplication
@ComponentScan@ComponentScan
@ImportResource("classpath:spring-config.xml")
@EnableAutoConfiguration
public class CatalogueApplication {
public static void main(String[] args) {
SpringApplication.run(CatalogueApplication.class, args);
}
}
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Tester le web serviceTester le web service
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Consulter les catégoriesConsulter les catégories
<SOAP-ENV:Envelope xmlns:SOAP-
ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<allCategories xmlns="http://services.sid.org/"/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
med@youssfi.net | ENSET Université
Hassan II de Casablanca
<S:Body>
<ns2:allCategoriesResponse xmlns:ns2="http://services.sid.org/">
<return>
<idCategorie>1</idCategorie>
<nomCategorie>Ordinateurs</nomCategorie>
</return>
<return>
<idCategorie>2</idCategorie>
<nomCategorie>Imprimantes</nomCategorie>
</return>
</ns2:allCategoriesResponse>
</S:Body>
</S:Envelope>
Consulter les produits d’une catégorieConsulter les produits d’une catégorie
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<produits xmlns="http://services.sid.org/">
<idCat xmlns="">2</idCat>
</produits>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:produitsResponse xmlns:ns2="http://services.sid.org/">
<return>
<categorie>
med@youssfi.net | ENSET Université
Hassan II de Casablanca
<categorie>
<idCategorie>2</idCategorie> <nomCategorie>Imprimantes</nomCategorie>
</categorie>
<designation>IMP</designation> <disponible>false</disponible>
<prix>1200.0</prix> <quantite>5</quantite>
<reference>B</reference>
</return>
<return>
<categorie>
<idCategorie>2</idCategorie> <nomCategorie>Imprimantes</nomCategorie>
</categorie>
<designation>C</designation> <disponible>false</disponible>
<prix>1200.0</prix> <quantite>5</quantite>
<reference>C</reference>
</return>
</ns2:produitsResponse>
</S:Body>
</S:Envelope>
SERVICE RMISERVICE RMI
med@youssfi.net | ENSET Université
Hassan II de Casablanca
InterfaceInterface RemoteRemote
package org.sid.rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;
import org.sid.entities.Categorie;
import org.sid.entities.Produit;
public interface CatalogueRemote extends Remote {
public List<Categorie> listCategories()throws RemoteException;
public List<Produit> produitsParCategories(Long idCat)throws RemoteException;
}
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Implémentation du service RMIImplémentation du service RMI
package org.sid.rmi;
import java.rmi.RemoteException; import java.util.List;
import org.sid.dao.CategorieRepository; import org.sid.dao.ProduitRepository;
import org.sid.entities.Categorie; import org.sid.entities.Produit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class CatalogueRmiService implements CatalogueRemote {
@Autowired private ProduitRepository produitRepository;
@Autowired private CategorieRepository categorieRepository;
@Override
public List<Categorie> listCategories() throws RemoteException {
return categorieRepository.findAll();
}
@Override
public List<Produit> produitsParCategories(Long idCat)
throws RemoteException { return produitRepository.findByCategorie(new
Categorie(idCat), null).getContent();
}
}
Déploiement du service RMIDéploiement du service RMI
package org.sid;
import org.sid.rmi.CatalogueRemote; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter;
import org.springframework.remoting.rmi.RmiServiceExporter;
@Configuration
public class MyConfiguration {
@Autowired
CatalogueRemote catalogueRemote;
@Bean
public SimpleJaxWsServiceExporter jaxWSExporter(){
return new SimpleJaxWsServiceExporter();
}
@Bean
public RmiServiceExporter rmiExporter(){
RmiServiceExporter rmiExporter=new RmiServiceExporter();
rmiExporter.setService(catalogueRemote);
rmiExporter.setServiceInterface(CatalogueRemote.class);
rmiExporter.setServiceName("CAT");
return rmiExporter;
}
}
med@youssfi.net | ENSET Université
Hassan II de Casablanca
ApplicationApplication SpringSpring BootBoot
package org.sid;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan@ComponentScan
//@ImportResource("classpath:spring-config.xml")
@EnableAutoConfiguration
public class CatalogueApplication {
public static void main(String[] args) {
SpringApplication.run(CatalogueApplication.class, args);
}
}
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Client RMIClient RMI
package org.sid.rmi;
import java.rmi.Naming; import java.util.List;
import org.sid.entities.Categorie;
public class ClientRMI {
public static void main(String[] args) {
try {
CatalogueRemote stub=(CatalogueRemote) Naming.lookup("rmi://localhost:1099/CAT");CatalogueRemote stub=(CatalogueRemote) Naming.lookup("rmi://localhost:1099/CAT");
List<Categorie> cats=stub.listCategories();
for(Categorie c:cats){
System.out.println(c.getNomCategorie());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
med@youssfi.net | ENSET Université
Hassan II de Casablanca
Structure finale du projetStructure finale du projet
med@youssfi.net | ENSET Université
Hassan II de Casablanca

More Related Content

What's hot

Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesENSET, Université Hassan II Casablanca
 
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)ENSET, Université Hassan II Casablanca
 
Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPAppalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPYouness Boukouchi
 
Cours design pattern m youssfi partie 8 stat, template method, command , medi...
Cours design pattern m youssfi partie 8 stat, template method, command , medi...Cours design pattern m youssfi partie 8 stat, template method, command , medi...
Cours design pattern m youssfi partie 8 stat, template method, command , medi...ENSET, Université Hassan II Casablanca
 
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...ENSET, Université Hassan II Casablanca
 
Tp1 - WS avec JAXWS
Tp1 - WS avec JAXWSTp1 - WS avec JAXWS
Tp1 - WS avec JAXWSLilia Sfaxi
 
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...ENSET, Université Hassan II Casablanca
 

What's hot (20)

Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependances
 
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
 
Support POO Java Deuxième Partie
Support POO Java Deuxième PartieSupport POO Java Deuxième Partie
Support POO Java Deuxième Partie
 
Support Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFISupport Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFI
 
Support JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVCSupport JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVC
 
Support POO Java première partie
Support POO Java première partieSupport POO Java première partie
Support POO Java première partie
 
Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPAppalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSP
 
Site JEE de ECommerce Basé sur Spring IOC MVC Security JPA Hibernate
Site JEE de ECommerce  Basé sur Spring IOC MVC Security JPA HibernateSite JEE de ECommerce  Basé sur Spring IOC MVC Security JPA Hibernate
Site JEE de ECommerce Basé sur Spring IOC MVC Security JPA Hibernate
 
Cours design pattern m youssfi partie 8 stat, template method, command , medi...
Cours design pattern m youssfi partie 8 stat, template method, command , medi...Cours design pattern m youssfi partie 8 stat, template method, command , medi...
Cours design pattern m youssfi partie 8 stat, template method, command , medi...
 
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
 
Support de cours entrepise java beans ejb m.youssfi
Support de cours entrepise java beans ejb m.youssfiSupport de cours entrepise java beans ejb m.youssfi
Support de cours entrepise java beans ejb m.youssfi
 
Support de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec SpringSupport de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec Spring
 
Theses Soutenues sous Direction et Co-Direction du Pr YOUSSFI
Theses Soutenues sous Direction et Co-Direction du Pr YOUSSFITheses Soutenues sous Direction et Co-Direction du Pr YOUSSFI
Theses Soutenues sous Direction et Co-Direction du Pr YOUSSFI
 
Maven et industrialisation du logiciel
Maven et industrialisation du logicielMaven et industrialisation du logiciel
Maven et industrialisation du logiciel
 
Mise en oeuvre des framework de machines et deep learning v1
Mise en oeuvre des framework de machines et deep learning v1 Mise en oeuvre des framework de machines et deep learning v1
Mise en oeuvre des framework de machines et deep learning v1
 
Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)
 
Tp1 - WS avec JAXWS
Tp1 - WS avec JAXWSTp1 - WS avec JAXWS
Tp1 - WS avec JAXWS
 
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
 
Cours design pattern m youssfi partie 4 composite
Cours design pattern m youssfi partie 4 compositeCours design pattern m youssfi partie 4 composite
Cours design pattern m youssfi partie 4 composite
 
Traitement distribue en BIg Data - KAFKA Broker and Kafka Streams
Traitement distribue en BIg Data - KAFKA Broker and Kafka StreamsTraitement distribue en BIg Data - KAFKA Broker and Kafka Streams
Traitement distribue en BIg Data - KAFKA Broker and Kafka Streams
 

Viewers also liked

softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...ENSET, Université Hassan II Casablanca
 
Systèmes multi agents concepts et mise en oeuvre avec le middleware jade
Systèmes multi agents concepts et mise en oeuvre avec le middleware jadeSystèmes multi agents concepts et mise en oeuvre avec le middleware jade
Systèmes multi agents concepts et mise en oeuvre avec le middleware jadeENSET, Université Hassan II Casablanca
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyENSET, Université Hassan II Casablanca
 
Architecture des Systèmes Multi-Agents
Architecture des Systèmes Multi-Agents Architecture des Systèmes Multi-Agents
Architecture des Systèmes Multi-Agents Rached Krim
 

Viewers also liked (16)

Support programmation orientée objet c# .net version f8
Support programmation orientée objet c#  .net version f8Support programmation orientée objet c#  .net version f8
Support programmation orientée objet c# .net version f8
 
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
 
Systèmes multi agents concepts et mise en oeuvre avec le middleware jade
Systèmes multi agents concepts et mise en oeuvre avec le middleware jadeSystèmes multi agents concepts et mise en oeuvre avec le middleware jade
Systèmes multi agents concepts et mise en oeuvre avec le middleware jade
 
Cours design pattern m youssfi partie 7 facade bridge flyweight
Cours design pattern m youssfi partie 7 facade bridge flyweightCours design pattern m youssfi partie 7 facade bridge flyweight
Cours design pattern m youssfi partie 7 facade bridge flyweight
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategy
 
Cours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxyCours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxy
 
Cours design pattern m youssfi partie 2 observer
Cours design pattern m youssfi partie 2 observerCours design pattern m youssfi partie 2 observer
Cours design pattern m youssfi partie 2 observer
 
Cours design pattern m youssfi partie 5 adapter
Cours design pattern m youssfi partie 5 adapterCours design pattern m youssfi partie 5 adapter
Cours design pattern m youssfi partie 5 adapter
 
Cours design pattern m youssfi partie 3 decorateur
Cours design pattern m youssfi partie 3 decorateurCours design pattern m youssfi partie 3 decorateur
Cours design pattern m youssfi partie 3 decorateur
 
Architecture des Systèmes Multi-Agents
Architecture des Systèmes Multi-Agents Architecture des Systèmes Multi-Agents
Architecture des Systèmes Multi-Agents
 
JBoss Seam vs JSF
JBoss Seam vs JSFJBoss Seam vs JSF
JBoss Seam vs JSF
 
Remote method invocation
Remote method invocationRemote method invocation
Remote method invocation
 
Java RMI
Java RMIJava RMI
Java RMI
 
Mycom
MycomMycom
Mycom
 
1.sma
1.sma1.sma
1.sma
 
Jade dimax
Jade dimaxJade dimax
Jade dimax
 

Similar to Mohamed youssfi support architectures logicielles distribuées basées sue les micro services avec spring boot

Présentation PFE Module Article GPAO
Présentation PFE Module Article GPAOPrésentation PFE Module Article GPAO
Présentation PFE Module Article GPAOahmedmiha
 
Digital : Web & Mobilité
Digital : Web & MobilitéDigital : Web & Mobilité
Digital : Web & MobilitéCatalyse IT
 
Dossier de competences MA
Dossier de competences MADossier de competences MA
Dossier de competences MAClementine D.
 
Boussetta younes cv-
Boussetta younes   cv-Boussetta younes   cv-
Boussetta younes cv-younesbs
 
TechDays 2012 - Windows Azure
TechDays 2012 - Windows AzureTechDays 2012 - Windows Azure
TechDays 2012 - Windows AzureJason De Oliveira
 
Production logicielle, outils et pratiques
Production logicielle, outils et pratiquesProduction logicielle, outils et pratiques
Production logicielle, outils et pratiquesJohan Moreau
 
Presentation BMIA
Presentation BMIAPresentation BMIA
Presentation BMIAPMarsaud
 
Fin de support Windows Server 2003, quelles options ?
Fin de support Windows Server 2003, quelles options ?Fin de support Windows Server 2003, quelles options ?
Fin de support Windows Server 2003, quelles options ?Microsoft Décideurs IT
 
Fin de support Windows Server 2003, quelles options ?
Fin de support Windows Server 2003, quelles options ?Fin de support Windows Server 2003, quelles options ?
Fin de support Windows Server 2003, quelles options ?Microsoft Technet France
 
CV_CHAHDI_KARIM_FR_2016
CV_CHAHDI_KARIM_FR_2016CV_CHAHDI_KARIM_FR_2016
CV_CHAHDI_KARIM_FR_2016Karim Chahdi
 
Ingénieur d'applications informatiques
Ingénieur d'applications informatiquesIngénieur d'applications informatiques
Ingénieur d'applications informatiquesSimstream
 
Rapid ou l'automatisation de la modernisation des applications
Rapid ou l'automatisation de la modernisation des applicationsRapid ou l'automatisation de la modernisation des applications
Rapid ou l'automatisation de la modernisation des applicationsRomain Hinfray
 

Similar to Mohamed youssfi support architectures logicielles distribuées basées sue les micro services avec spring boot (20)

Mohamed.marouan
Mohamed.marouanMohamed.marouan
Mohamed.marouan
 
Présentation PFE Module Article GPAO
Présentation PFE Module Article GPAOPrésentation PFE Module Article GPAO
Présentation PFE Module Article GPAO
 
Digital : Web & Mobilité
Digital : Web & MobilitéDigital : Web & Mobilité
Digital : Web & Mobilité
 
Migration VB6 > .Net
Migration VB6 > .NetMigration VB6 > .Net
Migration VB6 > .Net
 
PFE PPT2
PFE PPT2PFE PPT2
PFE PPT2
 
Dossier de competences MA
Dossier de competences MADossier de competences MA
Dossier de competences MA
 
MERAZKA Messaoud
MERAZKA MessaoudMERAZKA Messaoud
MERAZKA Messaoud
 
Boussetta younes cv-
Boussetta younes   cv-Boussetta younes   cv-
Boussetta younes cv-
 
TechDays 2012 - Windows Azure
TechDays 2012 - Windows AzureTechDays 2012 - Windows Azure
TechDays 2012 - Windows Azure
 
Production logicielle, outils et pratiques
Production logicielle, outils et pratiquesProduction logicielle, outils et pratiques
Production logicielle, outils et pratiques
 
CV REBAI Hamida
CV REBAI HamidaCV REBAI Hamida
CV REBAI Hamida
 
Liste des stages 07 02 2017
Liste des stages 07 02 2017Liste des stages 07 02 2017
Liste des stages 07 02 2017
 
Presentation BMIA
Presentation BMIAPresentation BMIA
Presentation BMIA
 
Mon CV Detaillé
Mon CV Detaillé Mon CV Detaillé
Mon CV Detaillé
 
CV_Bilel CHAOUADI
CV_Bilel CHAOUADICV_Bilel CHAOUADI
CV_Bilel CHAOUADI
 
Fin de support Windows Server 2003, quelles options ?
Fin de support Windows Server 2003, quelles options ?Fin de support Windows Server 2003, quelles options ?
Fin de support Windows Server 2003, quelles options ?
 
Fin de support Windows Server 2003, quelles options ?
Fin de support Windows Server 2003, quelles options ?Fin de support Windows Server 2003, quelles options ?
Fin de support Windows Server 2003, quelles options ?
 
CV_CHAHDI_KARIM_FR_2016
CV_CHAHDI_KARIM_FR_2016CV_CHAHDI_KARIM_FR_2016
CV_CHAHDI_KARIM_FR_2016
 
Ingénieur d'applications informatiques
Ingénieur d'applications informatiquesIngénieur d'applications informatiques
Ingénieur d'applications informatiques
 
Rapid ou l'automatisation de la modernisation des applications
Rapid ou l'automatisation de la modernisation des applicationsRapid ou l'automatisation de la modernisation des applications
Rapid ou l'automatisation de la modernisation des applications
 

Mohamed youssfi support architectures logicielles distribuées basées sue les micro services avec spring boot

  • 1. AArchitecturesrchitectures LLogiciellesogicielles DDistribuéesistribuées basées sur lesbasées sur les MMicroicro--ServicesServices Exemple d’implémentation avec: - Spring Boot MohamedYoussfi Laboratoire Signaux Systèmes Distribués et Intelligence Artificielle (SSDIA) ENSET, Université Hassan II Casablanca, Maroc Email : med@youssfi.net Supports de cours : http://fr.slideshare.net/mohamedyoussfi9 Chaîne vidéo : http://youtube.com/mohamedYoussfi https://www.youtube.com/watch?v=zBLXWIhrg7U Exemple d’implémentation avec: - Spring Boot - AngulatrJS - BootStrap
  • 2. PlanPlan Evolution des approches de programmation Industrialisation du génie logiciel Exigences des systèmes logiciels Principe de de l’inversion de contrôle Exemples d’architectures logicielles modernesExemples d’architectures logicielles modernes Problème des applications monolithiques Architectures logicielles basées sur les Micro- services Mise en œuvre des architectures basées sur les Micro-services : Spring Boot med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 3. Evolution des techniques de programmationEvolution des techniques de programmation Programmation Procédurale Programmation Orientée Objet Sous programmes: Procédures, fonctions (Basic, Pascal, C, Fortran,..) Objet = Etat+ Comportement + Identité Concepts fondamentaux : Objet, classe, Héritage, polymorphisme, encapsulation (C++, JAVA, C#, ..) Programmation Orientée Objets distribués sur plusieurs machines Langage Machine Assembleur Langage bas niveau Chaque famille de CPU possède son porophore jeu d’instructions Programmation Orientée Objet Distribués Objets distribués sur plusieurs machines Middlewares : (RMI, CORBA, JMS, …) Programmation Orientée composants Objets distribués, réutilisables, configurables, Interchangeables, évolutifs, mobiles, surveillable à chaud : Conteneur (EJB, Spring) :AOP Programmation Orientée Services Programmation Orientée Agents ? Service + Intelligence + Apprentissage+ … Composant disponibles à d’autres applications distantes hétérogènes via des protocoles (http) transportant des données: XML, JSON => SOAP et REST
  • 4. Industrialisation du génie logicielIndustrialisation du génie logiciel Le processus du développement logiciel est, aujourd'hui complètement industrialisé. Un logiciel est construit à base de composants ◦ Réutilisables ◦ Interchangeable◦ Interchangeable ◦ Évolutifs ◦ Reconfigurables ◦ Mobiles ◦ Surveillables à chaud ◦ … med@youssfi.net
  • 5. Avènement des technologies Open SourceAvènement des technologies Open Source En dix ans le développement logiciel a évolué en grande partie grâce aux technologies Open Sources. Celles ci permettent aux développeurs ◦ de ne pas réinventer la roue ◦ et de se concentrer plus sur les aspects métiers des applicationsapplications ◦ et utiliser les Framework pour résoudre les aspects techniques. Exemples : ◦ Spring, Struts, Hibernate (Coté Serveur) ◦ AngularJS, BootStrap (Coté Client) ◦ RMI, CORBA, JMS, JAXWS, JAXRS (Systèmes Distribués) med@youssfi.net
  • 6. Avènement des méthodologies AgileAvènement des méthodologies Agile Les méthodes Agile de gestion projet et de développement comme Scrum ou l'eXtreme Programming (XP) partent du constat que le cycle de développement en cascade est un échec.cascade est un échec. Développement en cascade: ◦ spécifier pendant X mois, ◦ puis ensuite coderY mois, ◦ tester Z mois, ◦ pour livrer au client un projet qui ne correspond plus tout à fait à ses attentes. med@youssfi.net
  • 7. Avènement des méthodologies AgileAvènement des méthodologies Agile Les méthodes Agile prônent ◦ Les tests avant le développement (Test Driven Development :TDD) ◦ Des cycles de développement itératifs, ◦ L’implication du client final tout au long du projet,◦ L’implication du client final tout au long du projet, ◦ Des spécifications réduites en début de projet, ◦ etc. Les méthodologies Agile sont pragmatiques, Ont fait leurs preuves et sont prisées par de grands industriels de logiciels. med@youssfi.net
  • 8. Industrialiser le cycle de vie : améliorations,Industrialiser le cycle de vie : améliorations, maintenance, correctionsmaintenance, corrections Pour industrialiser les composants logiciels, il est nécessaire d’utiliser des outils qui permettent d’automatiser le processus de fabrication des logiciels ◦ Frameworks de tests : JUnit Automatiser lesTests Unitaires ◦ Outils d'intégration continue : Maven Ils jouent le rôle de chef d'orchestre pour piloter et automatiser leIls jouent le rôle de chef d'orchestre pour piloter et automatiser le processus de développement logiciel : Gérer les dépendances Lancer la compilation des sources Lancer lesTest Unitaires Générer les packages (jar, war,ear) Installer les packages dans le repository Déployer l’application dans le serveur Générer la documentation du projet … med@youssfi.net
  • 9. Exigences d’un projet informatiqueExigences d’un projet informatique Exigences fonctionnelles: ◦ Une application est créée pour répondre , tout d’abord, aux besoins fonctionnels des entreprises. ExigencesTechniques : ◦ Les performances: Montée en charge Haute disponibilité et tolérance aux pannes ◦ La maintenance: med@youssfi.net | ENSET Université Hassan II ◦ La maintenance: Fermée à la modification et Ouverte à l’extension ◦ Sécurité ◦ Portabilité ◦ Distribution ◦ Capacité de communiquer avec d’autres applications distantes. ◦ Capacité de fournir le service à différents type de clients (DeskTOP, Mobile, SMS, http…) ◦ ….. Exigences financières : Coût du logiciel 9
  • 10. Comment faire surmonter toutes contraintesComment faire surmonter toutes contraintes Il est très difficile de développer un système logiciel qui respecte ces exigences sans utiliser l’expérience des autres : ◦ Bâtir l’application sur une architecture d’entreprise: (JEE,. Net ) ◦ Framework pour l’Inversion de contrôle: Permettre au développeur de se concentrer sur le code métier (Exigences fonctionnelles) Le Framework s’occupe du codeTechnique (ExigenceTechnique) Grâce à la Programmation Orientée Aspect (AOP) Exemple : Spring, EJB pour l’architecture JEE ◦ Utiliser des modèles de conceptions confirmés : Design Patterns◦ Utiliser des modèles de conceptions confirmés : Design Patterns ◦ Frameworks : Mapping objet relationnel (ORM ) : JPA, Hibernate,Toplink, … ApplicationsWeb coté serveur : Struts, JSF, SpringMVC Applications web coté client : AngylarJS, BootStrap … ◦ Middlewares pour les applications Distribuées : RMI, CORBA :Applications distribuées JAXWS pourWeb services basés SOAP (HTTP+XML) JAXRS pour les Web services RESTful (HTTP+(JSON/XML,…) ) JMS : Communication asynchrone entre les application …
  • 11. Exemple : sans utiliser d’inversion de contrôleExemple : sans utiliser d’inversion de contrôle public void virement(int c1, int c2, double mt) { /* Création d’une transaction */ EntityTransaction transaction=entityManager.getTransaction(); /* Démarrer la transaction */ transaction.begin(); try { /* Code métier */ retirer(c1,mt); Code Métier CodeTechnique retirer(c1,mt); verser(c2,mt); /* Valider la transaction */ transaction.commit(); } catch (Exception e) { /* Annuler la transaction en cas d’exception */ transaction.rollback(); e.printStackTrace(); } } med@youssfi.net | ENSET Université Hassan II Code Métier CodeTechnique
  • 12. Exemple : en utilisant l’inversion de contrôleExemple : en utilisant l’inversion de contrôle @Transactional public void virement(int c1, int c2, double mt) { retirer(c1,mt); verser(c2,mt); } Code Métier Ici, avec l’annotation @Transactional, nous avons med@youssfi.net | ENSET Université Hassan II Ici, avec l’annotation @Transactional, nous avons délégué la gestion des transaction au conteneur Spring IOC
  • 13. Evolution des techniques de programmationEvolution des techniques de programmation Programmation Procédurale Programmation Orientée Objet Sous programmes: Procédures, fonctions (Basic, Pascal, C, Fortran,..) Objet = Etat+ Comportement + Identité Concepts fondamentaux : Objet, classe, Héritage, polymorphisme, encapsulation (C++, JAVA, C#, ..) Programmation Orientée Objets distribués sur plusieurs machines Langage Machine Assembleur Langage bas niveau Chaque famille de CPU possède son porophore jeu d’instructions Programmation Orientée Objet Distribués Objets distribués sur plusieurs machines Middlewares : (RMI, CORBA, JMS, …) Programmation Orientée composants Objets distribués, réutilisables, configurables, Interchangeables, évolutifs, mobiles, surveillable à chaud : Conteneur (EJB, Spring) :AOP Programmation Orientée Services Programmation Orientée Agents ? Service + Intelligence + Apprentissage+ … Composant disponibles à d’autres applications distantes hétérogènes via des protocoles (http) transportant des données: XML, JSON => SOAP et REST
  • 14. ArchitecturesArchitectures DistribuésDistribués SGBD Serveur d’application J2EE Couche DAO Mapping Objet Relationnel (JPA, Hibernate) Couche métier Couche Service RMI, JMS CORBA,SOAPApp Java Application .Net SOAP (HTTP+XML) ou CORBA App Mobile REST (HTTP+JSON) Couche webCouche Service MiddleWares : - RMI - CORBA - EJB Session - SOAP (Web Sevices) - JMS -SMSLib Client HTTP - HTML, CSS, JavaScript - AngulatJS,Jquery - BootStrap HTTP Services d’infrastructure Aplication PHP SOAP (HTTP+XML) Client JMS JMS Client SMS SMS Couche web -Servlet - JSP - FrameWorks -Struts -Spring MVC - JSF
  • 15. Serveur d’application J2EE Web Container (Couche Web) Architecture J2EEArchitecture J2EE Spring ou EJB Container (Couche Métier) Servlet, JSP Service Client Java RMI, JMS Client http Client SOAP Java, .Net, PHP, Cobol HTTP HTML SOAP XML Services de l’infrastructure JTA JaxWS, Jax RS Jersey, CXF, AXIS JNDI Spring MVC, JSF Composants SGBD Data BaseData Base Service SOAP Service RESTful Java, .Net, PHP, Cobol JDBC JPA Hibernate Client HTTP Mobile, JQuery, Flash HTTP JSON, XML, .. JNDI ….AXIS, CXF Jersey, CXF Entity Entity Composants Métier (Traitements) JMS JMX
  • 16. De l'application monolithique auxDe l'application monolithique aux architectures micro servicesarchitectures micro services Une application monolithique est une application qui est développée en un seul bloc (war, jar, Ear) et déployée d’une manière unitaire dans un serveur d’application Serveur d’application Application.war med@youssfi.net | ENSET Université Hassan II de Casablanca CoucheWeb et Service Couche Métier Couche DAO IOC Containner Application.war Client Client Client HTTP RMI SOAP, REST SGBD
  • 17. Problèmes des applications monolithiquesProblèmes des applications monolithiques Les principaux problème des applications monolithiques sont : ◦ Elles centralisent tous les besoins fonctionnels ◦ Elles sont réalisées dans une seule technologie. ◦ Chaque modification nécessite de :◦ Chaque modification nécessite de : Tester les régressions Redéployer toute l’application ◦ Difficile à faire évoluer au niveau fonctionnel ◦ Livraison en bloc (Le client attend beaucoup de temps pour commencer à voir les premières versions )
  • 18. Les Micro servicesLes Micro services Les micro services sont une approche d’architecture et de développement d’une application composées de petits services. L’idée étant de découper un grand problème en petites unités implémentée sous forme de micro-services Chaque service est responsable d’une fonctionnalité, Chaque micro-service est développé, testé et déployéChaque micro-service est développé, testé et déployé séparément des autres. Chaque service tourne dans un processus séparé. La seule relation entre les différents micro services est l’échange de données effectué à travers les différentes APIs qu’ils exposent. ( SOAP, REST, RMI, CORBA, JMS,…) Lorsqu’on les combinent, ces micro services peuvent réaliser des opérations très complexes.
  • 19. Aspects clef des micro servicesAspects clef des micro services Chaque micro service peut être conçu à l’aide de n’importe quel outil et développé avec n’importe quel langage et technologie. Ils sont faiblement couplés puisque chaque micro service est physiquement séparé des autres,autres, Indépendance relative entre les différentes équipes qui développement les différents micro services (en partant du principe que les APIs qu’ils exposent sont définis à l’avance). Facilité des tests et du déploiement ou de la livraison continue. med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 20. MicroMicro serviceservice Un micro service combine les trois couches « métier, technique et données » en une seule, accessible via des API.
  • 21. MISE EN ŒUVRE DESMISE EN ŒUVRE DES ARCHITECTURES BASÉESARCHITECTURES BASÉESARCHITECTURES BASÉESARCHITECTURES BASÉES SUR LES MICROSUR LES MICRO--SERVICESSERVICES
  • 22. SpringSpring BootBoot Spring Boot est un Framework qui permet de créer des applications basées sur des micro services. Atouts de Spring Boot : ◦ Faciliter le développement d’applications complexes. ◦ Faciliter à l’extrême l’injection des dépendances ◦ Réduire à l’extrême les fichier de configurationsRéduire à l’extrême les fichier de configurations ◦ Faciliter la gestion des dépendances Maven. ◦ Auto Configuration : la plupart des beans sont créés si le ou les jar(s) adéquats sont dans le classpath. ◦ Fournir un conteneur de servlet embarqué (Tomcat, Jetty) ◦ Créer une application autonome (jar ou war) med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 23. EXEMPLEEXEMPLE D’APPLICATIOND’APPLICATIOND’APPLICATIOND’APPLICATION SPRINGSPRING BOOTBOOT med@youssfi.net | ENSET Université Hassan II de Casablanca https://www.youtube.com/watch?v=zBLXWIhrg7U
  • 24. Premier Exemple d’applicationPremier Exemple d’application On souhaite créer une application qui permet de gérer des produits. Chaque produit est défini par : ◦ Sa référence de type String ◦ Sa désignation de type String ◦ Son prix L’applications de permettre de : ◦ Ajouter de nouveaux produits ◦ Consulter les produits ◦ Chercher les produits par mot clé ◦ Consulter un produit◦ Consulter un produit ◦ Mettre à jour un produit ◦ Supprimer un produit Les données sont stockées dans une base de données MySQL L’application est un service Restful basée sur Spring Boot La couche web respecte MVC coté Client et basée sur : ◦ HTML5 ◦ CSS, Bootstrap ◦ Angular JS med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 25. ArchitectureArchitecture DAODAO ServeurTomcat : 8080 Spring Boot IOC Containner HTML 5 <<Entity>><<Entity>> Produit ServiceService HTML 5 Angular JS Boot Strap Client Mobile Androïde HTTP, JSON SGBDSpring DataSpring Data ProduitProduit <<interface>> ProduitRepository JPAJPA HibernateHibernate JDBCJDBC <<service>> CatService HTTP, JSON
  • 26. Exemple deExemple deVue à implémenterVue à implémenter med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 27. Création d’un projetCréation d’un projet SpringSpring BootBoot med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 28. Création d’un projetCréation d’un projet SpringSpring BootBoot med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 29. Structure du projetStructure du projet med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 30. MavenMaven Maven, géré par l'organisation Apache Software Foundation. ( Jakarta Project), est un outil pour la gestion et l'automatisation de production des projets logiciels Java en général et Java EE en particulier. L'objectif recherché est de ◦ produire un logiciel à partir de ses sources, ◦ en optimisant les tâches réalisées à cette fin ◦ et en garantissant le bon ordre de fabrication.◦ et en garantissant le bon ordre de fabrication. Compiler,Tester, Contrôler, produire les packages livrables Publier la documentation et les rapports sur la qualité Apports : ◦ Simplification du processus de construction d’une application ◦ Fournit les bonnes pratique de développement ◦ Tend à uniformiser le processus de construction logiciel ◦ Vérifier la qualité du code ◦ Faciliter la maintenance d’un projet med@youssfi.net | ENSET Université Hassan II
  • 31. Maven : POMMaven : POM Maven utilise un paradigme connu sous le nom de Project Object Model (POM) afin de : ◦ Décrire un projet logiciel, ◦ Ses dépendances avec des modules externes ◦ et l'ordre à suivre pour sa production. Il est livré avec un grand nombre de tâches (GOLS) prédéfinies, comme la compilation du code Java ou encore sa modularisation. med@youssfi.net | ENSET Université Hassan II
  • 32. pom.xmlpom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.sid</groupId> <artifactId>cats</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>cats</name> <description>Demo project for Spring Boot</description> <parent><parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.2.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <start-class>cats.CatsApplication</start-class> <java.version>1.7</java.version> </properties> med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 35. Structure du projetStructure du projet med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 36. application.propertiesapplication.properties # DataSource settings: spring.datasource.url = jdbc:mysql://localhost:3306/db_boot_cat5 spring.datasource.username = root spring.datasource.password = spring.datasource.driverClassName = com.mysql.jdbc.Driver # Specify the DBMS spring.jpa.database = MYSQL # Show or not log for each sql query spring.jpa.show-sql = true # Hibernate ddl auto (create, create-drop, update) spring.jpa.hibernate.ddl-auto = update # Naming strategy spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 37. SpringSpring Boot ApplicationBoot Application package cat; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class CatApplication {public class CatApplication { public static void main(String[] args) { SpringApplication.run(CatApplication.class, args); } } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 38. ENTITÉSENTITÉS med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 39. Entité ProduitEntité Produit package cat.entities; @Entity public class Produit implements Serializable { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long reference;private Long reference; private String designation; private double prix; // getters et Setters // Constructeurs } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 40. COUCHE DAOCOUCHE DAO med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 41. Tester les entitésTester les entités Démarrer l’application et vérifier si la tables produits a été bien créée. med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 42. Couche DAOCouche DAO package cat.dao; public interface IProduitRepository extends JpaRepository<Produit, Long> { @Query("select p from Produit p where p.designation like :x") public Page<Produit> produitParMC(@Param("x")String mc,Pageable p); public List<Produit> findByDesignation(String des); public Page<Produit> findByDesignation(String des,Pageable p); } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 43. COUCHE WEBCOUCHE WEB med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 44. Le contrôleurLe contrôleur RestRest package cat.controllers; @RestController public class CatalogueController { @Autowired private IProduitRepository produitRepository; @RequestMapping("/save") public Produit saveProduit(Produit p){public Produit saveProduit(Produit p){ produitRepository.save(p); return p; } @RequestMapping("/all") public List<Produit> getProduits(){ return produitRepository.findAll(); } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 45. Le contrôleurLe contrôleur RestRest @RequestMapping("/produits") public Page<Produit> getProduits(int page){ return produitRepository.findAll(new PageRequest(page, 5)); } @RequestMapping("/produitsParMC") public Page<Produit> getProduits(String mc,int page){ return produitRepository.produitParMC("%"+mc+"%", new PageRequest(page, 5));PageRequest(page, 5)); } @RequestMapping("/get") public Produit getProduit(Long ref){ return produitRepository.findOne(ref); } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 46. Le contrôleurLe contrôleur RestRest @RequestMapping("/delete") public boolean delete(Long ref){ produitRepository.delete(ref); return true; } @RequestMapping("/update") public Produit update(Produit p){ produitRepository.saveAndFlush(p); return p; } } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 47. Ajouter un produitAjouter un produit Coté Client med@youssfi.net | ENSET Université Hassan II de Casablanca @RequestMapping("/save") public Produit saveProduit(Produit p){ produitRepository.save(p); return p; } Coté Service
  • 48. Consulter tous les produitsConsulter tous les produits Coté Client med@youssfi.net | ENSET Université Hassan II de Casablanca @RequestMapping("/all") public List<Produit> getProduits(){ return produitRepository.findAll(); } Coté Service
  • 49. Consulter une page de produitsConsulter une page de produits Coté Client med@youssfi.net | ENSET Université Hassan II de Casablanca @RequestMapping("/produits") public Page<Produit> getProduits(int page){ return produitRepository.findAll(new PageRequest(page, 5)); } Coté Service
  • 50. Consulter une page de produitsConsulter une page de produits Coté Client med@youssfi.net | ENSET Université Hassan II de Casablanca @RequestMapping("/produits") public Page<Produit> getProduits(int page){ return produitRepository.findAll(new PageRequest(page, 5)); } Coté Service
  • 51. Chercher les produits par mot cléChercher les produits par mot clé Coté Client med@youssfi.net | ENSET Université Hassan II de Casablanca @RequestMapping("/produitsParMC") public Page<Produit> getProduits(String mc,int page){ return produitRepository.produitParMC("%"+mc+"%", new PageRequest(page, 5)); } Coté Service
  • 52. Consulter un produitConsulter un produit Coté Client med@youssfi.net | ENSET Université Hassan II de Casablanca @RequestMapping("/get") public Produit getProduit(Long ref){ return produitRepository.findOne(ref); } Coté Service
  • 53. Mettre à jour à produitMettre à jour à produit Coté Client med@youssfi.net | ENSET Université Hassan II de Casablanca @RequestMapping("/update") public Produit update(Produit p){ produitRepository.saveAndFlush(p); return p; } Coté Service
  • 54. Supprimer un produitSupprimer un produit Coté Client med@youssfi.net | ENSET Université Hassan II de Casablanca @RequestMapping("/delete") public boolean delete(Long ref){ produitRepository.delete(ref); return true; } Coté Service
  • 55. Couche PrésentationWeb Coté ClientCouche PrésentationWeb Coté Client HTML5 Java Script avec le framework Angular JS CSS avec le framework BootStrap med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 56. index.htmlindex.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Catalogue</title> <link rel="stylesheet" type="text/css" href="bootstrap-3.3.4- dist/css/bootstrap.min.css"/> <link rel="stylesheet" type="text/css" href="css/style.css"/> </head> <body ng-app="MyCat" ng-controller="CatController" > <div class="container spacer"> <form> <label>Mot Clé:</label> <input type="text" ng-model="motCle"> <button ng-click="charger()">Chercher</button> </form> </div> med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 57. index.htmlindex.html <div class="container spacer"> <table class="table table-striped"> <thead> <tr> <th>REF</th><th>DES</th><th>PRIX</th> </tr> </thead> <tbody><tbody> <tr ng-repeat="p in produits.content"> <td>{{p.reference}}</td> <td>{{p.designation}}</td> <td>{{p.prix}}</td> </tr> </tbody> </table> </div> med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 58. index.htmlindex.html <div class="container"> <ul class="nav nav-pills"> <li ng-class="{active:$index==pageCourante}" class="clickable" ng-repeat="p in pages track by $index"> <a ng-click="gotoPage($index)">{{$index}}</a> </li> </ul> </div></div> <script type="text/javascript" src="angular/angular.min.js"></script> <script type="text/javascript" src="js/app.js"></script> </body> </html> med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 61. Deuxième ApplicationDeuxième Application Supposant que l’on souhaite créer créer une application qui permet de gérer le catalogue des produits appartenant à des catégories. Chaque produit est définit par : ◦ Sa référence de type String ◦ Sa désignation de type String ◦ Son prix de type double ◦ Sa quantité de type int ◦ Sa disponibilité de type boolean ◦ Sa photo Une catégorie est définie par :Une catégorie est définie par : ◦ Son code de type Long (Auto Increment) ◦ Son nom de type String L’application doit permettre ◦ D’ajouter une nouvelle catégorie ◦ Ajouter un produit appartenant à une catégorie ◦ Consulter toutes les catégories ◦ Consulter les produits dont le nom contient un mot clé ◦ Consulter les produits d’une catégorie ◦ Consulter un produit ◦ Mettre à jour un produit ◦ Supprimer une catégorie L’injection des dépendances sera assurée par Spring IOC med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 62. Création d’un projetCréation d’un projet SpringSpring StarterStarter med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 63. Création d’un projetCréation d’un projet SpringSpring StarterStarter med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 64. Création d’un projetCréation d’un projet SpringSpring StarterStarter med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 65. Structure du projetStructure du projet med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 66. Pom.xmlPom.xml <modelVersion>4.0.0</modelVersion> <groupId>org.sid</groupId> <artifactId>catalogue</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>catalogue</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.2.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 69. application.propertiesapplication.properties # DataSource settings: spring.datasource.url = jdbc:mysql://localhost:3306/db_boot spring.datasource.username = root spring.datasource.password = spring.datasource.driverClassName = com.mysql.jdbc.Driver # Specify the DBMS spring.jpa.database = MYSQL # Show or not log for each sql query spring.jpa.show-sql = truespring.jpa.show-sql = true # Hibernate ddl auto (create, create-drop, update) spring.jpa.hibernate.ddl-auto = update # Naming strategy spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect # View Resolver spring.view.prefix: /WEB-INF/views/ spring.view.suffix: .jsp med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 70. SpringBootApplicationSpringBootApplication package org.sid; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class CatalogueApplication { public static void main(String[] args) { SpringApplication.run(CatalogueApplication.class, args); } } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 71. PremierPremier ControleurControleur SpringSpring package org.sid.controllers; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class CatalogueController { @RequestMapping(value="/index") @ResponseBody@ResponseBody public String index(){ return "Test"; } @RequestMapping(value="/test") public String test(){ return "Test"; } } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 72. Exécuter l’applicationExécuter l’application SpringBootSpringBoot Run As > Java ApplicationRun As > Java Application med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 73. Tester l’applicationTester l’application med@youssfi.net | ENSET Université Hassan II de Casablanca Tomcat : 8080 SpringBoot (IOC) DispatcherServlet SpringMVC CatalogueController HTTP
  • 74. Travailler Coté serveur avec JSP et JSTLTravailler Coté serveur avec JSP et JSTL <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId><artifactId>jstl</artifactId> </dependency> med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 75. Exemple d’applicationExemple d’application Supposant que l’on souhaite créer créer une application qui permet de gérer le catalogue des produits appartenant à des catégories. Chaque produit est définit par : ◦ Sa référence de type String ◦ Sa désignation de type String ◦ Son prix de type double ◦ Sa quantité de type int ◦ Sa disponibilité de type boolean ◦ Sa photo Une catégorie est définie par :Une catégorie est définie par : ◦ Son code de type Long (Auto Increment) ◦ Son nom de type String L’application doit permettre ◦ D’ajouter une nouvelle catégorie ◦ Ajouter un produit appartenant à une catégorie ◦ Consulter toutes les catégories ◦ Consulter les produits dont le nom contient un mot clé ◦ Consulter les produits d’une catégorie ◦ Consulter un produit ◦ Mettre à jour un produit ◦ Supprimer une catégorie L’injection des dépendances sera assurée par Spring IOC med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 76. ENTITÉSENTITÉS med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 77. Entités : Produit etEntités : Produit et CategorieCategorie Diagramme de classes : Modèle Objet @OneToMany@ManyToOne med@youssfi.net | ENSET Université Hassan II de Casablanca MLDR : Modèle Relationnel - CATEGORIES (ID_CAT, NOM_CAT) - PRODUITS (REF, DES, PRIX, QTE, DISPO, PHOTO, #ID_CAT)
  • 78. Entité : ProduitEntité : Produitpackage dao; import java.io.Serializable; import javax.persistence.*; @Entity public class Produit implements Serializable { @Id private String reference; private String designation; private double prix; private int quantite; private boolean disponible; private String photo; @ManyToOne @JoinColumn(name="ID_CAT")@JoinColumn(name="ID_CAT") private Categorie categorie; public Produit() { } public Produit(String reference, String designation, double prix, int quantite, boolean disponible, String photo) { this.reference = reference; this.designation = designation; this.prix = prix; this.quantite = quantite; this.disponible = disponible; this.photo = photo; } // Getters et Setters } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 79. Entité :Entité : CategorieCategorie package dao; import java.io.Serializable; import java.util.Collection; import javax.persistence.*; @Entity public class Categorie implements Serializable { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long idCategorie; private String nomCategorie; @OneToMany(mappedBy="categorie",fetch=FetchType.LAZY) private Collection<Produit> produits; public Categorie() { } public Categorie(String nomCategorie) { this.nomCategorie = nomCategorie; } // Getters et Setters @JsonIgnore @XmlTransient public Collection<Produit> getProduits() { return produits; } } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 80. Redémarrer l’applicationRedémarrer l’application SpringSpring BootBoot Les tables devraient être générées Table Categories : Table Produits : med@youssfi.net | ENSET Université Hassan II de Casablanca Table Produits :
  • 81. Couche DAOCouche DAO package org.sid.dao; import org.sid.entities.Categorie; import org.springframework.data.jpa.repository.JpaRepository; public interface CategorieRepository extends JpaRepository<Categorie, Long> { } package org.sid.dao; import java.util.List; med@youssfi.net | ENSET Université Hassan II de Casablanca import java.util.List; import org.sid.entities.*; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.query.Param; public interface ProduitRepository extends JpaRepository<Produit, String> { public List<Produit> findByDesignation(@Param("mc")String mc); public Page<Produit> findByCategorie(Categorie categorie,Pageable pageable); }
  • 82. MVC CLIENTMVC CLIENT SIDESIDE -- HTML, CSS, JAVA SCRIPTHTML, CSS, JAVA SCRIPT-- HTML, CSS, JAVA SCRIPTHTML, CSS, JAVA SCRIPT -- ANDROÏDE CLIENTANDROÏDE CLIENT -- IOSIOS CLIENTCLIENT med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 83. Contrôleur : Gestion des produits et des catégoriesContrôleur : Gestion des produits et des catégories package org.sid.controllers; import java.util.List; import org.sid.dao.CategorieRepository; import org.sid.dao.ProduitRepository; import org.sid.entities.Categorie; import org.sid.entities.Produit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MyCatalogueController {public class MyCatalogueController { @Autowired private CategorieRepository categorieRepository; @Autowired private ProduitRepository produitRepository; @RequestMapping(value="/saveCat") @ResponseBody public Categorie saveCategorie(Categorie c){ return categorieRepository.save(c); } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 84. Contrôleur : Gestion des produits et des catégoriesContrôleur : Gestion des produits et des catégories @RequestMapping(value="/allCat") @ResponseBody public List<Categorie> allCategories(){ return categorieRepository.findAll(); } @RequestMapping(value="/saveProduit") @ResponseBody public Produit saveProduit(Produit p){public Produit saveProduit(Produit p){ return produitRepository.save(p); } @RequestMapping(value="/allProduits") @ResponseBody public List<Produit> allProduits(){ return produitRepository.findAll(); } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 85. Contrôleur : Gestion des produits et des catégoriesContrôleur : Gestion des produits et des catégories @RequestMapping(value="/pageProduits") @ResponseBody public Page<Produit> pageProduits(int page){ return produitRepository.findAll(new PageRequest(page, 3)); } @RequestMapping(value="/produitsParCat") @ResponseBody public Page<Produit> produitsParCat(Categorie c,int page){public Page<Produit> produitsParCat(Categorie c,int page){ return produitRepository.findByCategorie(c, new PageRequest(page, 3)); } @RequestMapping(value="/produitsParMC") @ResponseBody public List<Produit> produitsParCat(String mc){ return produitRepository.findByDesignation(mc); } } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 86. Ajouter une catégorieAjouter une catégorie med@youssfi.net | ENSET Université Hassan II de Casablanca @RequestMapping(value="/saveCat") @ResponseBody public Categorie saveCategorie(Categorie c){ return categorieRepository.save(c); }
  • 87. Consulter toutes les catégoriesConsulter toutes les catégories med@youssfi.net | ENSET Université Hassan II de Casablanca @RequestMapping(value="/allCat") @ResponseBody public List<Categorie> allCategories(){ return categorieRepository.findAll(); }
  • 88. Ajouter un produitAjouter un produit @RequestMapping(value="/saveProduit") med@youssfi.net | ENSET Université Hassan II de Casablanca @RequestMapping(value="/saveProduit") @ResponseBody public Produit saveProduit(Produit p){ return produitRepository.save(p); }
  • 89. Consulter tous les produitsConsulter tous les produits med@youssfi.net | ENSET Université Hassan II de Casablanca @RequestMapping(value="/allProduits") @ResponseBody public List<Produit> allProduits(){ return produitRepository.findAll(); }
  • 90. Consulter une page de produitsConsulter une page de produits med@youssfi.net | ENSET Université Hassan II de Casablanca @RequestMapping(value="/pageProduits") @ResponseBody public Page<Produit> pageProduits(int page){ return produitRepository.findAll(new PageRequest(page, 3)); }
  • 91. Consulter une page de produitsConsulter une page de produits med@youssfi.net | ENSET Université Hassan II de Casablanca @RequestMapping(value="/produitsParCat") @ResponseBody public Page<Produit> produitsParCat(Categorie c,int page){ return produitRepository.findByCategorie(c, new PageRequest(page, 3)); }
  • 92. Produits parProduits par designationdesignation med@youssfi.net | ENSET Université Hassan II de Casablanca @RequestMapping(value="/produitsParMC") @ResponseBody public List<Produit> produitsParCat(String mc){ return produitRepository.findByDesignation(mc); }
  • 93. Structure du projetStructure du projet med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 94. Application web avec HTML,Application web avec HTML, AngularJSAngularJS etet BootStrapBootStrap coté clientcoté client med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 95. Structure du projetStructure du projet med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 98. Catal.jsCatal.js $scope.$watch( function(){return $location.path();}, function(newPath){ //console.log(newPath); var tabPath=newPath.split("/"); $scope.pageCourante=0; if(tabPath.length==2){ $scope.selectedCategorie=tabPath[1]; $scope.chargerProduits();$scope.chargerProduits(); } else if(tabPath.length==3){ $scope.selectedCategorie=tabPath[1]; $scope.pageCourante=tabPath[2]; $scope.chargerProduits(); }; }); }); med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 99. Cat.htmlCat.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Catalogue de produits</title> <link rel="stylesheet" href="bootstrap-3.3.4-dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="bootstrap-3.3.4-dist/css/bootstrap-theme.min.css" /> <link rel="stylesheet" href="css/style2.css" /> </head></head> <body ng-app="catalogue" ng-controller="Catcontroller"> <div class="container spacer"> <form> <label>Catégories:</label> <select ng-model="selectedCategorie" ng-change="gotoURL()"> <option ng-repeat="cat in categories" value="{{cat.idCategorie}}"> {{cat.nomCategorie}}</option> </select> </form> </div> med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 100. Cat.htmlCat.html <div class="container"> <table class="table table-striped table-hover spacer"> <thead> <tr> <th>REF</th> <th>DES</th> <th>PRIX</th> <th>QTE</th> </tr> </thead></thead> <tbody> <tr ng-repeat="p in produits.content"> <td>{{p.reference}}</td> <td>{{p.designation}}</td> <td>{{p.prix}}</td> <td>{{p.quantite}}</td> </tr> </tbody> </table> </div> med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 101. Cat.htmlCat.html <ul ng-show="produits.totalPages>1" class="container nav nav-pills"> <li class="clickable" ng-repeat="p in pages track by $index" ng- class="{active:$index==pageCourante}" > <a ng-click="gotoPage($index)">{{$index}}</a> </li> </ul> <script type="text/javascript" src="js/angular.min.js"></script> <script type="text/javascript" src="js/catal.js"></script> </body> </html> med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 102. MVC SERVERMVC SERVER SIDESIDE -- JSPJSP-- JSPJSP -- JSTLJSTL med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 103. Structure du projetStructure du projet Catalogue.jsp med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 104. Le contrôleurLe contrôleur package org.sid.controllers; import org.sid.dao.CategorieRepository;import org.sid.dao.ProduitRepository; import org.sid.entities.Categorie; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class ServerSideCatalogueController { @Autowired private CategorieRepository categorieRepository; @Autowired private ProduitRepository produitRepository; med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 105. Le contrôleurLe contrôleur @RequestMapping("/catalogue") public String catalogue(Model model){ model.addAttribute("categories",categorieRepository.findAll()); model.addAttribute("categorie", new Categorie()); return "catalogue"; } @RequestMapping("/produits") public String produits(@ModelAttribute Categorie categorie,Modelpublic String produits(@ModelAttribute Categorie categorie,Model model,int page){ model.addAttribute("categories",categorieRepository.findAll()); model.addAttribute("pageProduits",produitRepository.findByCategorie (categorie,new PageRequest(page, 3))); return "catalogue"; } } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 106. catalogue.jspcatalogue.jsp <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@taglib uri="http://www.springframework.org/tags/form" prefix="f" %> <!DOCTYPE html> <html> <head> <title>Catalogue de produits</title> <link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/css/style.css"/> </head> <body> <div><div> <f:form modelAttribute="categorie" action="produits?page=0"> <table> <tr> <td>Catérogies:</td> <td><f:select path="idCategorie" items="${categories}" itemLabel="nomCategorie" itemValue="idCategorie"></f:select></td> <td><input type="submit" value="OK"/></td> </tr> </table> </f:form> </div> med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 107. catalogue.jspcatalogue.jsp <div> <div> <table class="table1"> <tr> <th>REF</th><th>DES</th><th>PRIX</th><th>QTE</th> <th>DISPO</th> <th>PHOTO</th> </tr> <c:forEach items="${pageProduits.getContent()}" var="p"> <tr> <td>${p.getReference() }</td><td>${p.getReference() }</td> <td>${p.designation }</td> <td>${p.prix }</td> <td>${p.quantite }</td> <td>${p.disponible }</td> <td>${p.photo }</td> </tr> </c:forEach> </table> </div> med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 108. catalogue.jspcatalogue.jsp <div> <c:if test="${ not empty pageProduits and pageProduits.getTotalPages()>=2}"> <c:forEach begin="0" end="${pageProduits.getTotalPages() -1}" var="p"> <span class="autrePage"> <c:if test="${pageProduits.getNumber()!=p }"> <a href="produits?page=${p}&idCategorie=${categorie.idCategorie}" >Page ${p }</a> </c:if></c:if> <c:if test="${pageProduits.getNumber()==p }"> Page ${p } </c:if> </span> </c:forEach> </c:if> </div> </div> </body> </html> med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 109. style.cssstyle.css body{ font-family: cursive; font-size: 12px; } div{ border: 1px dotted gray; padding: 5px; margin: 5px; } .table1 th{.table1 th{ border: 1px dotted gray; padding: 5px; margin: 5px; background: pink; } .table1 td{ border: 1px dotted gray; padding: 5px; margin: 5px; background: white; } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 110. Web Service SOAPWeb Service SOAP package org.sid.services; import java.util.List; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; import org.sid.dao.CategorieRepository; import org.sid.dao.ProduitRepository; import org.sid.entities.Categorie; import org.sid.entities.Produit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component @WebService public class CatalogueService { @Autowired private ProduitRepository produitRepository; @Autowired private CategorieRepository categorieRepository; @WebMethod public List<Categorie> allCategories(){ return categorieRepository.findAll(); } @WebMethod public List<Produit> produits(@WebParam(name="idCat")Long idCat){ Categorie c=new Categorie(); c.setIdCategorie(idCat); return produitRepository.findByCategorie(c, null).getContent(); } }
  • 111. Déployer le web service avecDéployer le web service avec springspring <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter"> <property name="baseAddress" value="http://0.0.0.0:8787/services/"></property> </bean></bean> </beans> med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 112. L’applicationL’application SpringSpring BootBoot package org.sid; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ImportResource; @SpringBootApplication @ComponentScan@ComponentScan @ImportResource("classpath:spring-config.xml") @EnableAutoConfiguration public class CatalogueApplication { public static void main(String[] args) { SpringApplication.run(CatalogueApplication.class, args); } } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 113. Tester le web serviceTester le web service med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 114. Consulter les catégoriesConsulter les catégories <SOAP-ENV:Envelope xmlns:SOAP- ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header/> <SOAP-ENV:Body> <allCategories xmlns="http://services.sid.org/"/> </SOAP-ENV:Body> </SOAP-ENV:Envelope> <?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> med@youssfi.net | ENSET Université Hassan II de Casablanca <S:Body> <ns2:allCategoriesResponse xmlns:ns2="http://services.sid.org/"> <return> <idCategorie>1</idCategorie> <nomCategorie>Ordinateurs</nomCategorie> </return> <return> <idCategorie>2</idCategorie> <nomCategorie>Imprimantes</nomCategorie> </return> </ns2:allCategoriesResponse> </S:Body> </S:Envelope>
  • 115. Consulter les produits d’une catégorieConsulter les produits d’une catégorie <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header/> <SOAP-ENV:Body> <produits xmlns="http://services.sid.org/"> <idCat xmlns="">2</idCat> </produits> </SOAP-ENV:Body> </SOAP-ENV:Envelope> <?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:produitsResponse xmlns:ns2="http://services.sid.org/"> <return> <categorie> med@youssfi.net | ENSET Université Hassan II de Casablanca <categorie> <idCategorie>2</idCategorie> <nomCategorie>Imprimantes</nomCategorie> </categorie> <designation>IMP</designation> <disponible>false</disponible> <prix>1200.0</prix> <quantite>5</quantite> <reference>B</reference> </return> <return> <categorie> <idCategorie>2</idCategorie> <nomCategorie>Imprimantes</nomCategorie> </categorie> <designation>C</designation> <disponible>false</disponible> <prix>1200.0</prix> <quantite>5</quantite> <reference>C</reference> </return> </ns2:produitsResponse> </S:Body> </S:Envelope>
  • 116. SERVICE RMISERVICE RMI med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 117. InterfaceInterface RemoteRemote package org.sid.rmi; import java.rmi.Remote; import java.rmi.RemoteException; import java.util.List; import org.sid.entities.Categorie; import org.sid.entities.Produit; public interface CatalogueRemote extends Remote { public List<Categorie> listCategories()throws RemoteException; public List<Produit> produitsParCategories(Long idCat)throws RemoteException; } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 118. Implémentation du service RMIImplémentation du service RMI package org.sid.rmi; import java.rmi.RemoteException; import java.util.List; import org.sid.dao.CategorieRepository; import org.sid.dao.ProduitRepository; import org.sid.entities.Categorie; import org.sid.entities.Produit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class CatalogueRmiService implements CatalogueRemote { @Autowired private ProduitRepository produitRepository; @Autowired private CategorieRepository categorieRepository; @Override public List<Categorie> listCategories() throws RemoteException { return categorieRepository.findAll(); } @Override public List<Produit> produitsParCategories(Long idCat) throws RemoteException { return produitRepository.findByCategorie(new Categorie(idCat), null).getContent(); } }
  • 119. Déploiement du service RMIDéploiement du service RMI package org.sid; import org.sid.rmi.CatalogueRemote; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter; import org.springframework.remoting.rmi.RmiServiceExporter; @Configuration public class MyConfiguration { @Autowired CatalogueRemote catalogueRemote; @Bean public SimpleJaxWsServiceExporter jaxWSExporter(){ return new SimpleJaxWsServiceExporter(); } @Bean public RmiServiceExporter rmiExporter(){ RmiServiceExporter rmiExporter=new RmiServiceExporter(); rmiExporter.setService(catalogueRemote); rmiExporter.setServiceInterface(CatalogueRemote.class); rmiExporter.setServiceName("CAT"); return rmiExporter; } } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 120. ApplicationApplication SpringSpring BootBoot package org.sid; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication @ComponentScan@ComponentScan //@ImportResource("classpath:spring-config.xml") @EnableAutoConfiguration public class CatalogueApplication { public static void main(String[] args) { SpringApplication.run(CatalogueApplication.class, args); } } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 121. Client RMIClient RMI package org.sid.rmi; import java.rmi.Naming; import java.util.List; import org.sid.entities.Categorie; public class ClientRMI { public static void main(String[] args) { try { CatalogueRemote stub=(CatalogueRemote) Naming.lookup("rmi://localhost:1099/CAT");CatalogueRemote stub=(CatalogueRemote) Naming.lookup("rmi://localhost:1099/CAT"); List<Categorie> cats=stub.listCategories(); for(Categorie c:cats){ System.out.println(c.getNomCategorie()); } } catch (Exception e) { e.printStackTrace(); } } } med@youssfi.net | ENSET Université Hassan II de Casablanca
  • 122. Structure finale du projetStructure finale du projet med@youssfi.net | ENSET Université Hassan II de Casablanca