TP2 Ejb
TP2 Ejb
TP2 Ejb
EE
PRÉSENTÉE PAR:
Zayneb Waari
© 2023-ISETS-
zayneb_waari
Plan
–Description du module
–Marché d’emploi
–Rappel Java SE (Java Standard Edition)
–C’est quoi Java EE ?
–Les spécifications Java EE
–Architecture logique/physique
–Les outils
© 2023-ISETS-
zayneb_waari
Java et le Marché du Travail
© 2023-ISETS-
zayneb_waari
Rappels : POO
•La Programmation Orientée Objet (POO) consiste à modéliser informatiquement un ensemble d'éléments
du monde réel, en un ensemble d'entités informatiques (Objets).
• La classe est une abstraction des propriétés communes (attributs et méthodes) d'un ensemble d'objets.
• Un objet est créé par mécanisme d'instanciation, c'est une instance d'une classe
© 2023-ISETS-
zayneb_waari
Rappel Java SE(Java Standard Edition)
© 2023-ISETS-
zayneb_waari
Rappel Java SE (Java Standard Edition)
© 2023-ISETS-
zayneb_waari
JSE, JME et JEE?
• Java Standard Edition est une plateforme destinée au développement des application Desktop,
•Java Micro Edition est une plateforme qui rajoute un ensemble de spécifications à JSE pour permettre le
développement d’applications mobiles,
•Java Entreprise Edition est également basée sur JSE et définit en plus un ensemble de services d’infrastructure,
elle permet de développer des applications distributes multi-tiers pour les entreprises (Affichage, Accès à la base de
données, …).
© 2023-ISETS-
zayneb_waari
Jakarta EE
•“Jakarta EE is the future for cloud-native, light-weight, and traditional enterprise Java applications
• Java EE technologies contributed by Oracle are being used to create the new Jakarta EE platform
• The Eclipse Foundation is the home of Cloud Native Java open innovation
The Jakarta EE Working Group is focused on modernizing Java EE technologies and governance processes to be
more open and community-based”
• PS : Nous continuons à utiliser la plateforme JavaEE7 fournie par Oracle, et non la plateforme JakartaEE fournie par Eclipse.
© 2023-ISETS-
zayneb_waari
C’est quoi Java EE ?
Java EE(Java Enterprise Edition) = Java Standard Edition + bibliothèques
© 2023-ISETS- 10
zayneb_waari
Les spécifications Java EE
JSR: Java Specification Request
C’est une description formelle de
ce qu’un composant doit offrir.
Exemple de spécification :
JSR 338: JavaTM Persistence 2.1 :
The Java Persistence API is the
Java API for the management of
persistence and
object/relational
mapping in Java EE and Java SE
environments.
Une implémentation de la
spécification JPA (JSR 338) est :
Hibernate: http://hibernate.org/orm/
© 2023-ISETS-
zayneb_waari
Évolution des versions
© 2023-ISETS-
zayneb_waari
Architecture des SI: Rappel
© 2023-ISETS-
zayneb_waari
Couche Présentation
• Appelée IHM (Interface Homme Machine) permet l’interaction de l’application avec l’utilisateur.
• Gère les saisies au clavier et à la souris et la présentation des informations à l’écran,
• Doit être conviviale et ergonomique.
© 2023-ISETS-
zayneb_waari
Logique applicative
• La logique applicative décrit les traitements à réaliser par l’application pour répondre aux besoins des utilisateurs.
• 2 types de traitements:
• Traitements locaux: les contrôles effectuées au niveau du dialogue avec l’IHM(formulaires, champs, boutons
radios..)
• Traitements globaux: les règles de ‘application, appelées aussi logique métier (Business logic)
Logique métier :toutes les règles ou tests de validation personnalisés que vous appliquez aux données avant
de les insérer, de les mettre à jour ou de les supprimer de la base de donnée
© 2023-ISETS-
zayneb_waari
Données
•L’accès aux données regroupe l’ensemble des mécanismes permettant la gestion des informations stockées par
l’application.
© 2023-ISETS-
zayneb_waari
Architecture physique
• Le découpage et la répartition des 3 niveaux d’abstraction permettent de distinguer les architectures physiques:
• 1-tier
• 2-tiers
• 3-tiers
• n-tiers
© 2023-ISETS-
zayneb_waari
Architecture physique: 1tier
• Tier est un mot anglais qui signifie étage ou niveau.
• Une application 1-Tier est, par exemple, la Modification d’un document Word sur un ordinateur Local: Tout est sur
la même machine.
• Inconvénients : Risque de perte des données (non sauvegardées à distance), Impossible d’accéder à une même
ressource par deux utilisateurs en même temps.
© 2023-ISETS-
zayneb_waari
Architecture physique: 2tier
• Le poste client se charge du traitement métier et délègue la gestion des données à un service spécialisé.
• Une application 2-Tiers est typiquement une application client lourd.
• Inconvénient : Toute mise à jour des fonctionnalités nécessitent un déploiement sur toutes les machines des utilisateurs.
© 2023-ISETS-
zayneb_waari
Architecture physique: 3tier
• Une application 3-Tiers est typiquement une application Web :
© 2023-ISETS-
zayneb_waari
Architecture physique: ntier
• L'architecture n-tiers qualifie la distribution de la couche traitement des données et métier entre de
multiples services et non la multiplication des couches
• La couche traitement peut utiliser plusieurs serveurs si, par exemple, on fait appel à un web services
distants sur d’autres
serveurs applicatifs.
• Voici un exemple d’architecture 2-Tiers, 3-Tiers et 4-Tiers.
© 2023-ISETS-
zayneb_waari
Architecture physique: ntier
© 2023-ISETS- 22
zayneb_waari
Les serveurs d’application
o Apache Tomcat.
o Borland Entreprise Server.
o Citrix.
o Apache Geronimo de la Fondation Apache.
o GlassFish serveur d'application Open Source de Oracle (anciennement Sun Java
System Application Server)
o IBM Websphere Application Server.
o IBM Lotus Domino.
© 2023-ISETS-
zayneb_waari
Le conteneur d'EJB
Spécification EJB (Entreprise Java Bean)
Enterprise JavaBeans (EJB) est une architecture de composants logiciels côté serveur
pour la plateforme de développement Java EE.
• Les EJBs sont des classes java côté serveur.
• Le conteneur EJB est un environnement d’exécution pour les EJB déployés au sein
du serveur d’application.
• Le conteneur EJB se lance au démarrage du serveur d’application. • Le conteneur
EJB gère le cycle de vie des EJBs (instantiation, injection, destruction ...)
Le Bean
Java Bean :Un Bean Java est une classe java qui contient des attributs et leur
accesseurs (getters / setters).
© 2023-ISETS-
zayneb_waari
Types d’EJB
© 2023-ISETS-
zayneb_waari
Session Bean - Stateless (sans état)
• Le conteneur conserve en mémoire un certain nombre d’instances (un pool) de chaque EJB sans état et les
partage entre les clients.
• Ces beans ne mémorisent pas l’état des clients.
• Lorsqu’un client appelle une méthode d’un bean sans état, le conteneur choisit une instance du pool et l’affecte
au
client.
• Lorsque le client en a fini, l’instance est retournée dans le pool et pourra être réutilisé par un autre client.
© 2023-ISETS-
zayneb_waari
Session Bean - Stateless - Lifecycle
© 2023-ISETS-
zayneb_waari
Session Bean - Stateful (avec état)
• Quand un client invoque un EJB avec état sur le serveur, le conteneur EJB doit fournir la même instance
a chaque appel de méthode.
• Cette instance ne peut pas être réutilisé par un autre client.
© 2023-ISETS-
zayneb_waari
Session Bean - Stateful - Lifecycle
Le serveur d'applications peut mettre en œuvre deux stratégies en cas d'inactivité
d'un client.
© 2023-ISETS-
zayneb_waari 10
Session Bean - Singleton
• Un EJB singleton est simplement un bean de session qui n’est instancié qu’une seule
fois par application.
© 2023-ISETS-
zayneb_waari
Accès aux EJBs : Local /
Remote
• Selon d'où un client invoque l’EJB session, la classe de ce dernier devra :
• Elle pourra aussi ne pas implémenter aucune interface pour le cas d'accès
local.
© 2019 –
ESPRIT
Accès local - Injection de dépendances
• Avec l’injection des dépendances, on n’invoque plus le constructeur nous même dans notre code, mais c’est
plutôt le conteneur EJB qui invoque le constructeur.
•Pour injecter une dépendance il suffit d’annoter l’attribut avec @EJB.
Par exemple :
@EJB
private Voiture voiture; //La classe Voiture doit être un EJB
© 2019 –
ESPRIT
Accès distant à un EJB (Remote)–
JNDI (Java Naming and Directory
• Interface)
JNDI ( Java Naming and Directory Interface ) : est une API Java de connexion à des annuaires.
• Un annuaire est l’ensemble de références qui permettent d’accéder des ressources (des URL).
• Exemple : java.naming.provider.url=http-remoting://127.0.0.1:9080
• Chaque serveur d’application possède son propre annuaire qui lui permet de publier les références des
composants déployés dans le serveur en leurs associant un nom. Comme ça, ils seront accessibles en
local ou à distance par d’autres composants.
© 2019 –
ESPRIT
Accès distant à un EJB (Remote)
© 2019 –
ESPRIT
Accès distant à un EJB –
JNDI (Java Naming and Directory
Interface)
• Lorsqu'un client distant appelle un EJB, il ne travaille pas directement avec une
instance de cet EJB mais avec un proxy qui le représente au niveau du client :
System.out.println(proxy.sayHello("hello"));
16
TP1 EJB Stateless : bonjour-ejb
• Créer un Nouveau Projet Maven Simple (cocher ‘Skip Archetype’)
© 2019 –
ESPRIT
TP1 EJB Stateless : bonjour-ejb
• GroupId : tn.esprit
• ArtefactId / Name / Description : bonjour-ejb
• Packaging : ejb
© 2019 –
ESPRIT
TP1 EJB Stateless : bonjour-ejb
• Warning : CHKJ2905W: The EJB Validator did not run because ejb-jar.xml could not be loaded or found. Run the XML validator for more
information bonjour-ejb. Unknown EJB Validator Message
• Solution, MAJ pom.xml, comme suivant, et Maven Update Project :
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ejb-plugin</artifactId>
<version>2.5</version>
<configuration>
<ejbVersion>3.2</ejbVersion>
<jarName>${project.artifactId}</jarName>
</configuration>
</plugin>
</plugins>
</build>
© 2019 –
ESPRIT
TP1 EJB Stateless : bonjour-ejb
© 2019 –
ESPRIT
TP1 EJB Stateless : bonjour-ejb
• Ajouter la dépendance nécessaire pour développer des EJB (Récupérer cette dépendance de
https://mvnrepository.com ) :
© 2019 –
ESPRIT
TP1 EJB Stateless : bonjour-ejb
• Exercice :
• Créer le package tn.esprit.service
• Créer deux interfaces, HelloServiceLocal et HelloServiceRemote. Ces interfaces déclarent la méthode
sayHello(String msg)
• Créer la classe HelloService qui implémente ces deux interfaces, et donc qui implémente la méthode sayHello :
© 2019 –
ESPRIT
TP1 EJB Stateless : bonjour-ejb
• Création d’un package, des Interfaces et des
Classes :
23
TP1 EJB Stateless : bonjour-ejb
package tn.esprit.service;
import javax.ejb.Local;
@Local
public interface HelloServiceLocal
{
String sayHello(String msg);
}
import javax.ejb.Remote;
@Remote
public interface HelloServiceRemote {
String sayHello(String msg);
}
© 2019 –
ESPRIT
TP1 EJB Stateless : bonjour-ejb
• Création de la classe HelloService (qui implémente les Interfaces) :
© 2019 –
ESPRIT
TP1 EJB Stateless : bonjour-ejb
package t n . es p r i t . se rv i c e;
import javax.ejb.Stateless;
@Stateless
public class HelloService implements HelloServiceLocal, HelloServiceRemote {
@Override
public String sayHello(String msg) {
return msg;
}
© 2019 –
ESPRIT
TP1 EJB Stateless : bonjour-ejb
• Ajouter le Projet à WildFly et démarrer le serveur :
java:global/bonjour-ejb/HelloService!tn.esprit.service.HelloServiceLocal
java:app/bonjour-ejb/HelloService!tn.esprit.service.HelloServiceLocal
java:module/HelloService!tn.esprit.service.HelloServiceLocal
java:global/bonjour-ejb/HelloService!tn.esprit.service.HelloServiceRemote
java:app/bonjour-ejb/HelloService!tn.esprit.service.HelloServiceRemote
java:module/HelloService!tn.esprit.service.HelloServiceRemote
java:jboss/exported/bonjour-ejb/HelloService!
tn.esprit.service.HelloServiceRemote
© 2019 –
ESPRIT
TP1 EJB Stateless: bonjour-ejb-client
• Créer un Nouveau Projet Maven Simple (cocher ‘Skip Archetype’)
• GroupId : tn.esprit
• ArtefactId / Name / Description : bonjour-ejb-client
• Packaging : jar
• Mettre à jour le pom.xml pour utiliser Java 1.8 :
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
• Faite Bouton Droit sur le Projet, Maven Update Project.
© 2019 –
ESPRIT
TP1 EJB Stateless: bonjour-ejb-client
• Ajouter la dépendance nécessaire vers notre EJB qu’on a créé bonjour-ejb, version 1.0, type
ejb. Dans quel repository se trouve ce jar? Créer la dépendance à ajouter dans le pom.xml.
© 2019 –
ESPRIT
TP1 EJB Stateless: bonjour-ejb-client
<dependencies>
<!-- https://mvnrepository.com/artifact/org.wildfly/wildfly-ejb-client-bom -->
<dependency>
<groupId>org.wildfly</groupId>
<artifactId>wildfly-ejb-client-bom</artifactId>
<version>11.0.0.Final</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>tn.esprit</groupId>
<artifactId>bonjour-ejb</artifactId>
<version>1.0</version>
<type>ejb</type>
</dependency>
</dependencies>
© 2019 –
ESPRIT
TP1 EJB Stateless: bonjour-ejb-client
• Créer le package tn.esprit
• Créer la classe Client : HelloServiceClient.java, qui contient une méthode main(), le jndiName est à récupérée de
la console (configuration affichée lors du déploiement de notre EJB bonjour-ejb) :
package tn.esprit;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import tn.esprit.service.HelloServiceRemote;
public class HelloServiceClient {
public static void main(String[] args) throws
NamingException {
String jndiName = "bonjour-ejb/HelloService!tn.esprit.service.HelloServiceRemote";
Context context = new
HelloServiceRemote InitialContext();
proxy = (HelloServiceRemote) context.lookup(jndiName);
System.out.println(proxy.sayHello("Bonjour Esprit!!!"));
}
}
© 2019 –
ESPRIT
TP1 EJB Stateless: bonjour-ejb-client
• Attention : Le copier / Coller des propriétés dans le fichier jndi.properties peut créer
des espaces « » à la fin des lignes et des anti slachs « \ ».
• Supprimer les espaces à la fin de chaque ligne, et les anti-slach dans l’URL.
java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory
java.naming.provider.url=http-remoting://127.0.0.1:9080
jboss.naming.client.ejb.context=true
© 2019 –
ESPRIT
TP1 EJB Stateless: bonjour-ejb-client
• sept.
Lancer 24, 2018main(),
la méthode 9:54:53 AM org.xnio.Xnio
et comprendre < c l’EJB
l’appel de l i n i t >:
INFO: XNIO version 3.3.1.Final
sept. 24, 2018 9:54:53 AM org.xnio.nio.NioXnio < c l i n i t >
INFO: XNIO NIO Implementati on Version 3.3.1.Final
sept. 24, 2018 9:54:53 AM org.jboss.remoti ng3.EndpointImpl < c l i n i t >
INFO: JBoss Remoting version 4.0.9.Final
sept. 24, 2018 9:54:53 AM org.jboss.ejb.client.remoti ng.VersionReceiver handleMessage INFO:
EJBCLIENT000017: Received server version 2 and marshalling strategies [ r i v e r ] sept. 24, 2018
assoc i a t e
9:54:53 AM org.jboss.ejb.client.remoti ng.Remoti ngConnecti onEJBReceiver INFO: EJBCLIENT000013:
Successful version handshake completed f o r receiver context
EJBReceiverContext{clientContext=org.jboss.ejb.client.EJBClientContext@63753b6d, receiver=Remoting connection EJB
r e c e i v e r [connection=Remoting connection <6d998ce2>,channel=jboss.ejb,nodename=m104]} on channel Channel ID abf37bd4
(outbound) o f Remoting connection 2758fe70 t o /127.0.0.1:9080
s e p t . 24, 2018 9:54:53 AM o r g . j b o s s . e j b . c l i e n t . E J B C l i e n t < c l i n i t >
INFO: JBoss EJB C l i e n t version 2 . 1 . 1 . F i n a l
Bonjour E s p r i t ! ! !
© 2019 –
ESPRIT
TP2 EJB Stateful (facultatif): panier-ejb
© 2019 –
ESPRIT
TP2 EJB Stateful (facultatif): panier-ejb
jav a: globa l/ P anier-s erv eur / Pa nierS e rv ic e! t n. es prit . s erv ic e. P anie rRemot e
java:app/Panier-serveur/CompteBancaireService!tn.esprit.service.PanierRemote
java:module/PanierService!tn.esprit.service.PanierRemote
java: j b oss/ exported / Pan i e r - serveur/ CompteBancai r e Service!
t n . espri t . servi c e .Panie rRemote jav a: global/ P anier-s erv eur/ Compt eBanc aireServ ic e!
t n. es prit . s erv ic e. PanierLoc al java:app/Panier-serveur/CompteBancaireService!
tn.esprit.service.PanierLocal
jav a: module/ Pani erServ ic e! t n . es pr it . s erv ic e. P anierL oc a l
© 2019 –
ESPRIT
TP2 EJB Stateful (facultatif): panier-ejb
• Créer le projet Panier-client en suivant les mêmes étapes que pour la création du projet bonjour-ejb-client :
• Créer un Nouveau Projet Maven Simple (cocher ‘Skip Archetype’)
• GroupId : tn.esprit
• ArtefactId / Name / Description : Panier-client
• Packaging : jar
• Mettre à jour le pom.xml pour utiliser Java 1.8 :
• Ajouter les dépendances vers compte-bancaire-serveur et wildfly-ejb-client-bom
• Créer le package tn.esprit
• Créer la classe Client : PanierClient.java, qui contient une méthode main(), et le fichier de properties
jndi.properties.
© 2019 –
ESPRIT
TP2 EJB Stateful (facultatif): panier-ejb
public static void main(String[] args) throws NamingException {
String jndiName = « Panier-serveur/PanierService!tn.esprit.service.PanierRemote";
Context context = new InitialContext();
PanierRemote proxy = (PanierRemote) context.lookup(jndiName);
proxy.ajouterProduit("Ordinateur", 200);
proxy. ajouterProduit (« Tablette", 100);
}
java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory
java.naming.provider.url=http-remoting://127.0.0.1:9080
jboss.naming.client.ejb.context=true
© 2019 –
ESPRIT
TP3 EJB Singleton (facultatif): compte-bancaire-serveur
• Vous pouvez vous inspirer du TP1 bonjour-ejb (même étapes) :
• Créer un Nouveau Projet Maven Simple (cocher ‘Skip Archetype’)
• GroupId : tn.esprit
• ArtefactId / Name / Description : compte-bancaire-serveur
• Packaging : ejb
• Mettre à jour le pom.xml : Utiliser Java 1.8
• Mettre à jour le pom.xml : Ajouter la dépendance javaee-api
• Mettre à jour le pom.xml : Ajouter le plugin maven-ejb-plugin
• Créer le package tn.esprit.service
• Créer deux interfaces, CompteBancaireLocal et CompteBancaireRemote. Ces interfaces déclarent les méthodes
retirerArgent(String personne, int montant) et verserArgent(String personne, int montant)
• Créer la classe CompteBancaireService qui implémente ces deux interfaces
© 2019 –
ESPRIT
TP3 EJB Singleton (facultatif): compte-bancaire-serveur
java:global/compte-bancaire-serveur/CompteBancaireService!tn.esprit.service.CompteBancaireRemote
java:app/compte-bancaire-serveur/CompteBancaireService!tn.esprit.service.CompteBancaireRemote
java:module/CompteBancaireService!tn.esprit.service.CompteBancaireRemote
java:jboss/exported/compte-bancaire-serveur/CompteBancaireService!tn.esprit.service.CompteBancaireRemote
java:global/compte-bancaire-serveur/CompteBancaireService!tn.esprit.service.CompteBancaireLocal
java:app/compte-bancaire-serveur/CompteBancaireService!tn.esprit.service.CompteBancaireLocal
java:module/CompteBancaireService!tn.esprit.service.CompteBancaireLocal
© 2019 –
ESPRIT
TP3 EJB Singleton (facultatif): compte-bancaire-client
• Créer le projet compte-bancaire-client en suivant les mêmes étapes que pour la création du projet bonjour-ejb-client
:
• Créer un Nouveau Projet Maven Simple (cocher ‘Skip Archetype’)
• GroupId : tn.esprit
• ArtefactId / Name / Description : compte-bancaire-client
• Packaging : jar
• Mettre à jour le pom.xml pour utiliser Java 1.8 :
• Ajouter les dépendances vers compte-bancaire-serveur et wildfly-ejb-client-bom
• Créer le package tn.esprit
• Créer la classe Client : CompteBancaireClient.java, qui contient une méthode main(), et le fichier de properties
jndi.properties.
© 2019 –
ESPRIT
TP3 EJB Singleton (facultatif): compte-bancaire-client
public static void main(String[] args) throws NamingException {
String jndiName = "compte-bancaire-serveur/CompteBancaireService!
tn.esprit.service.CompteBancaireRemote"; Context context = new InitialContext();
CompteBancaireRemote proxy = (CompteBancaireRemote) context.lookup(jndiName);
proxy.verserArgent("Mourad", 20);
proxy.verserArgent("Mohamed", 10);
}
java.naming.factory.initial=
org.jboss.naming.remote.client.InitialContextFactory
java.naming.provider.url=http-remoting://127.0.0.1:9080
jboss.naming.client.ejb.context=true
© 2019 –
ESPRIT
Prochain Cours
© 2019 –
ESPRIT