Serveur D'application Et EJB: Tendance Actuelle
Serveur D'application Et EJB: Tendance Actuelle
Sophie NABITZ
EJB Enterprise Java Beans - Page 2
Sophie NABITZ
EJB Enterprise Java Beans - Page 3
Composant EJB
• Composant serveur qui peut être déployé
Sophie NABITZ
EJB Enterprise Java Beans - Page 4
Intérêts
• Les EJB fournissent aux développeurs une indépendance vis-à-vis de la plate-forme :
– dans une architecture n-tiers, peu importe où se trouve la logique applicative. D’une part les
développeurs sont isolés du middleware sous-jacent, et d’autre part cela permet aux vendeurs
d’apporter des modifications sans affecter les applications existantes
• WORA : tant qu’on reste conforme à la spécification, on peut faire tourner un EJB sur
n’importe quel serveur
• Des rôles sont définis pour les différents participants au projet => meilleure
organisation des tâches
• Les EJB prennent en charge la gestion des transactions : le vendeur du conteneur
fournit le service pour les contrôler, et le développeur ne s’occupe pas de les débuter
ou terminer
• Les EJB fournissent un service de transaction distribuées transparent : ils peuvent être
présents sur différents serveurs, tourner sur des machines plate-formes ou machines
virtuelles JAVA différentes. Le développeur est assuré qu’elles seront exécutées dans le
même contexte transactionnel
Sophie NABITZ
EJB Enterprise Java Beans - Page 5
Technologies préalables
• JAVA : WORA
Sophie NABITZ
Concepts et technologies concernés Enterprise Java Beans - Page 6
Composant logiciel
• Module logiciel : objet + configurateur + installateur
– qui exporte différents attributs, propriétés, méthodes,
– qui est prévu pour être configuré
– qui est prévu pour être installé
– qui fournit un mécanisme lui permettant de s’auto-décrire
• Caractéristiques
– fournit des services
– utilise d’autres composants
– possède des propriétés configurables
– spécifie quelles doivent être les caractéristiques de l’environnement
• en terme de système (OS, librairies)
• en terme de service (transactions, sécurité, persistance, …)
Sophie NABITZ
Concepts et technologies concernés Enterprise Java Beans - Page 7
Transactions
• Concept essentiel
– Pour l’utilisateur : un simple changement qui se produit ou pas
– Pour le développeur un style de programmation qui peut impliquer plusieurs
modules qui participent à une transaction distribuée.
• Ex : transfert d’argent d’un compte à un autre :
– difficulté à faire fonctionner ce traitement dans un système distribué, car
problème de contrôle de la transaction
• Objectif : réunir dans un seule unité d’exécution tout un ensemble
d’opérations
• Dans une transaction plusieurs entités totalement indépendantes
doivent s’accorder avant que le changement soit conclu. Si un des
participants n’accepte pas, il faut que chacune des entités revienne à
son état initial.
Sophie NABITZ
Concepts et technologies concernés Enterprise Java Beans - Page 8
Sophie NABITZ
Concepts et technologies concernés Enterprise Java Beans - Page 10
Le service de nommage
• Rôle : identifier et associer des noms à des données
– Ex : système de fichiers, ou BDR
Sophie NABITZ
Concepts et technologies concernés Enterprise Java Beans - Page 11
JNDI
• Java Naming and Directory Interface
JavaBeans
• C’est un modèle générique qui définit un environnement qui
supporte des composants réutilisables
Sophie NABITZ
Enterprise Java Beans - Page 13
L'injection de dépendance
• Design pattern « Inversion Of Control » (IOC)
– principe : découpler les éléments fonctionnels de leur environnement
d’exécution et des paramètres fluctuant d’une exécution à l’autre
• Conséquence : on peut écrire un programme sans se soucier d’un
certain nombre de paramètres extérieurs à son bon déroulement
• Permet de réduire le couplage d’une architecture grâce à un
conteneur spécialisé
– l'injection est paramétrée dans un descripteur de dépendance
Sophie NABITZ
Le modèle Enterprise Java Beans - Page 14
L’architecture EJB
• L’architecture consiste en
– un serveur
– des conteneurs
Sophie NABITZ
Le modèle Enterprise Java Beans - Page 15
Le modèle EJB 2
Sophie NABITZ
Le modèle Enterprise Java Beans - Page 16
Le serveur d’EJB
Sophie NABITZ
Le modèle Enterprise Java Beans - Page 17
Les conteneurs
• Interface entre un EJB et les fonctionnalités de bas niveau, spécifiques à la
plate-forme
• C’est une entité qui gère une ou plusieurs classes d’EJB, en mettant à
disposition les différents services : gestion des transactions, gestion des
instances, gestion de la persistance, gestion de la sécurité
• Tout accès à un bean se fait via des méthodes de classes générées par le
conteneur, qui elles-mêmes appellent les méthodes du bean
• Le conteneur joue le rôle principal dans l’application du design pattern IoC
– il est responsable de la création (instanciation) des objets
– il résout les dépendances entre les objets qu’il gère
• Deux types de conteneurs :
– session containers : contiennent des EJB volatiles (transcient), non persistants
– entity containers : qui contiennent les EJB persistants, dont les états doivent être
sauvegardés entre les différentes invocations
Sophie NABITZ
Le modèle Enterprise Java Beans - Page 18
L’EJB
• C’est un objet contenu dans le conteneur
• Il est géré par le conteneur et ne doit jamais être adressé
directement
• La classe du Bean : implémente une interface précise et qui
respecte certaines règles
– il s'agit de l'implémentation du bean lui-même,
• logique métier, calculs, transfert de compte bancaire, saisie de
commandes, etc…
• logique orientée donnée, par exemple comment changer le nom d'un
client, diminuer un compte bancaire…
• logique orientée message, traitement après réception d'un ordre d'achat
d'actions boursières…
Sophie NABITZ
Le modèle Enterprise Java Beans - Page 20
Les clients
• Le client d'un Bean peut être une servlet, une applet, une
application classique, un autre bean
Sophie NABITZ
Les rôles Enterprise Java Beans - Page 21
Les acteurs
• Implication de plusieurs experts
• La spécification répartit les responsabilités et les rôles
• Le développement n’implique pas toujours la même personne
Sophie NABITZ
Les différents EJB Enterprise Java Beans - Page 22
Sophie NABITZ
Les différents EJB Enterprise Java Beans - Page 23
Entity Bean
• Un EB représente des données persistantes du domaine, ainsi que les
méthodes qui les manipulent
– il correspond à un enregistrement. Dans une BDR : une ligne d’une table
– possède un état qui va persister entre les différentes invocations de l’EJB
– sa durée de vie n’est pas limitée à celle de la machine virtuelle => survit aux
arrêts et crash système
Session Bean
• Sert à décrire les interactions entre autres beans ou à implémenter des tâches particulières
• Il est créé par un client et ne dure que pendant une session
– il n’est pas récupéré après système crash ou shutdown
– il est associé à un client, qui doit le créer et le détruire
– il peut contenir une information privée propre au client qui l’a créé, mais il est anonyme
• Ne représente pas des données partagées dans une base mais peut accéder à ces données
(pour lire, mettre à jour, en ajouter)
– il s’occupe des interactions entre les beans entité en décrivant comment ils collaborent pour accomplir une
tâche spécifique
• Peut être sans état ou maintenir un état « conversationnel » :
– sans état (stateless) : collection de services liés, qui correspond à un but général et qui sont généralement
utilisables
• peut être utilisé dans un pool de SB, par plusieurs clients simultanément
– avec état (statefull) : extension de l’application client. Il effectue des tâches à la place du client et maintient
un état en rapport avec ce client. Cet état est appelé un état de conversation car il représente une
conversation continue entre le bean et le client
• est sujet à l’activation/passivation
• associé à un seul client
• possède un état qui traduit l’avancement du traitement, de la session
Sophie NABITZ
Session bean Enterprise Java Beans - Page 25
@Remote
public interface CoursManager
{
public void create (Cours c) ;
public Cours findCours(String coursId) ;
public Collection findAll();
…
}
Sophie NABITZ
Enterprise Java Beans - Page 28
@Stateless
public class CoursManagerBean implements CoursManager
{
public void create (Cours c) {…}
public Cours findCours(String coursId){…}
public Collection findAll() {…}
…
}
Sophie NABITZ
Enterprise Java Beans - Page 29
Sophie NABITZ
Enterprise Java Beans - Page 30
Sophie NABITZ
Enterprise Java Beans - Page 31
Déploiement
• On construit une archive .jar qui contient les fichiers compilés, et
un répertoire META-INF (vide à ce stade)
Sophie NABITZ
Enterprise Java Beans - Page 32
Le cycle de vie
• Instanciation : le conteneur s’occupe de cette instanciation par l’appel de la
méthode newInstance() à partir de l’objet Class lié à la classe du Session Bean
– la classe d’implémentation du Session Bean doit disposer d’un constructeur public, sans
argument
• Analyse de l'instance afin de déceler les éventuelles injections de dépendance
à effectuer
– permet au conteneur d’initialiser des propriétés de l’EJB automatiquement
– grâce à des annotations
• Exécuter les méthodes callback interceptors
– @PostConstruct qui intervient après toutes les dépendances d’injection effectuées par le
conteneur et avant le premier appel de la méthode métier
– @PreDestroy qui est appelé au moment où l’instance du Bean est détruite (lors de la
suppression du Bean ou à l’arrêt de l’application)
– @PrePassivate (Stateful uniquement) permet de spécifier une méthode appelée par le
conteneur EJB lorsque qu'il juge nécessaire de passer le Bean dans un état sérialisable
– @PostActivate (Stateful uniquement) : permet de spécifier la méthode qui sera appelée
lorsqu’un Bean devra être réactivé de son état de passivation
Sophie NABITZ
Application cliente Enterprise Java Beans - Page 33
Le client
Sophie NABITZ
Application cliente Enterprise Java Beans - Page 34
Utilisation de JNDI
• Dans l’API JNDI, la classe InitialContext est définie et représente que
point de départ de toute recherche.
– la méthode lookup de cette classe retourne un Object, son paramètre est une
chaîne de caractères : le nom de l’interface
La classe de l’entité
• Les Entity Beans sont des POJO
– l’état persistant est représenté par les variables d’instances
• Mais cette classe doit respecter certaines règles
– peut être abstraite ou concrète, peut aussi bien hériter d’une classe entité que d’une
classe non-entité
– les méthodes, les propriétés et la classe ne doivent pas être finales
– doit implémenter [Link] si une instance est envoyée à un client
– doit posséder un constructeur sans argument public ou protégé
• peut aussi posséder des constructeurs surchargés
• but : simplifier l’instanciation de la classe par le conteneur
@Entity
public class Cours {
//...
}
Sophie NABITZ
Entity bean Enterprise Java Beans - Page 37
Sophie NABITZ
Entity bean Enterprise Java Beans - Page 38
L'entity Manager
• Certains objets sont persistants et d'autres restent temporaires
– le développeur décide de sauvegarder, modifier, supprimer les instances
• La manipulation des données se réalise via un Session Bean, qui accède au contexte de
persistance et travaille ensuite avec les EB via l’Entity Manager
• Plusieurs manières d’obtenir un objet EntityManager
– injection par annotation : par défaut, le conteneur instancie l’Entity Manager et gére son cycle
de vie : container-managed entity manager
– possible de gérer manuellement le cycle de vie : application-managed entity manager,
utilisation de la fabrique EntityManagerFactory
@Stateless
public class MonServiceBean implements MonService {
@PersistenceContext(unitName="MonUniteDePersistance")
protected EntityManager em;
//...
}
Sophie NABITZ
Entity bean Enterprise Java Beans - Page 41
• Retrouver les entités : à partir de leur clé primaire ou avec les requêtes EJB-QL
– deux méthodes avec les mêmes paramètres : la classe de l’entité et l’instance de la clé primaire
– <T> T find(Class<T> entity, Object primaryKey) retourne null si aucune entité associée à la clé primaire demandée
• exemple : [Link]([Link], 1);
– <T> T getReference(Class<T> entity, Object primaryKey) lance une [Link]-NotFoundException si aucune
entité associée à la clé primaire
Sophie NABITZ
Entity bean Enterprise Java Beans - Page 42
Sophie NABITZ
Entity bean Enterprise Java Beans - Page 43
Déploiement
• L’unité de persistance est assemblée dans une archive EJB .jar
– le fichier [Link] dans le répertoire META-INF
– les classes doivent être à la racine du fichier JAR
• Le conteneur analyse l’ensemble des classes du fichier JAR pour
identifier les classes annotées avec @Entity
Sophie NABITZ
Entity bean Enterprise Java Beans - Page 44
Sophie NABITZ
Entity bean Enterprise Java Beans - Page 45
Sophie NABITZ
Entity bean Enterprise Java Beans - Page 46
Gestion de transactions
• Service clé pour le développement côté serveur qui permet à des
applications de fonctionner de manière robuste
• Transaction : opération atomique, bien que composée de plusieurs
petites opérations
– Ex : transfert de compte à compte bancaire : on enlève sur un compte, on
dépose sur l'autre…
• Partage de données : on ne veut pas de perte d'intégrité des données
• Une solution possible : traitement par exceptions
– problèmes : si on échoue à nouveau en remettant en cohérence, si le nombre
d'opérations imbriquées est important, si le problème est dû à une panne
réseau, SGBD ou machine (impossible de savoir si modification avant ou après
le crash), ...
Sophie NABITZ
Transactions Enterprise Java Beans - Page 48
Sophie NABITZ
Transactions Enterprise Java Beans - Page 49
La gestion déclarative
• Tout le traitement est à la charge du container
– le bean est automatiquement enrôlé (enrolled) dans une transaction
• Le concepteur du bean utilise les annotations ou le descripteur de déploiement
pour configurer ses choix : attributs transactionnels
– on peut spécifier des attributs pour le bean entier ou méthode par méthode, ou les deux
: le plus restrictif est appliqué
– chaque méthode doit être traitée (globalement ou individuellement), comportement par
défaut prédéfini
• Intérêt :
– facile à programmer mais granularité importante
– le code transactionnel n'est pas écrit dans la logique métier => respect la séparation des
niveaux, augmente la clarté du code et favorise la maintenance
• Portée transactionnelle :
– désigne l'ensemble des beans (session et entité) qui participent à la même transaction
Sophie NABITZ
Transactions Enterprise Java Beans - Page 50
Transactions et entités
Sophie NABITZ
Transactions Enterprise Java Beans - Page 51
Attributs transactionnels
• Required
– la méthode du bean doit être invoquée dans la portée d'une transaction. Si le client fait
partie d'une transaction, le bean définissant la méthode est inclus dans la portée
transactionnelle. Sinon, une nouvelle transaction démarre qui ne couvre que le bean et
ceux auxquels il accède. Elle se termine à la fin de la méthode
– comportement par défaut
• NotSupported :
– l'invocation d'une méthode ayant cet attribut transactionnel suspend la transaction
jusqu'à ce que la méthode soit terminée
– après exécution la transaction originale reprend son exécution
• Supports :
– inclut la méthode dans la portée transactionnelle si elle est invoquée dans une
transaction => le bean qui définit cette méthode et tous ceux auxquels il accède dans la
méthode font partie de la transaction originale, si elle existe.
– si elle n'existe pas, pas de portée transactionnelle ni pour le bean ni pour ceux auxquels
il accède
Sophie NABITZ
Transactions Enterprise Java Beans - Page 52
L'EJB-QL
• Entreprise JavaBean Query Language : spécification de langage
de requêtes, intégré au système EJB
• Portable : utilisé à l’identique quelle que soit la version du SGBD
• Repose sur une abstraction du langage SQL et est traduit en «
vrai » SQL lors de son exécution
• On utilise les objets des Entity Beans directement dans les
requêtes
• Le fournisseur de persistance traduira ces requêtes en « vrai »
SQL lors de l’exécution
Sophie NABITZ
Enterprise Java Beans - Page 54
Le schéma abstrait
• EJB-QL s’appuie sur le schéma abstrait des Entity Beans
• C'est une représentation interne des entités et de leurs relations,
utilisée par EJB-QL pour naviguer entre les propriétés
persistantes et relationnelles
• Le terme abstrait distingue ce schéma du schéma physique de la
base de données
– dans une base de données relationnelle, le schéma physique correspond à
la structure des tables et colonnes
– en EJB-QL on travaille avec un schéma abstrait et non avec le nom des
tables du schéma physique
• Par défaut, le nom de la classe d'un bean entité est utilisé
Sophie NABITZ
Enterprise Java Beans - Page 55
Le langage EJB-QL 3
• Une requête EJB-QL peut permettre une sélection (SELECT), modification
(UPDATE) ou suppression (DELETE).
• Une requête EJB-QL est similaire à du SQL, avec les clauses suivantes :
– SELECT : liste les Entity Beans et les propriétés retournées par la requête
– FROM : définit les Entity Beans utilisés. Ceux-ci doivent être déclarés via l’expression
AS
– WHERE : permet d’appliquer des critères de recherche
• on spécifie aussi bien des types Java ayant leur équivalent dans les bases de données (String,
Integer, Double…) mais également des Entity Beans
• dans ce dernier cas, lors du passage en requête native, le critère s’appliquera sur la clé primaire
• L’opérateur . pour naviguer entre propriétés et relations
[Link], [Link] FROM Employé as e WHERE [Link]=5
SELECT e FROM Employé AS e WHERE [Link]=5
• Pas de ; à la fin !
Sophie NABITZ
Enterprise Java Beans - Page 56
Les opérateurs
• BETWEEN : SELECT e FROM Employé AS e WHERE [Link] BETWEEN 1500 AND 2000
• LIKE : SELECT e FROM Employé AS e WHERE [Link]énom LIKE 'jean%'
• IS NULL : SELECT e FROM Employé AS e WHERE [Link] IS NULL
• MEMBER OF : SELECT s FROM Société AS s WHERE :user MEMBER OF [Link]és
• EMPTY : SELECT s FROM Société AS s WHERE [Link]és IS EMPTY
• La clause ORDER BY permet de ranger par ordre les résultats d’une requête
• Les fonctions d’agrégation pour effectuer des opérations sur des ensembles
SELECT COUNT(user) FROM User AS user
• La clause GROUP BY /Having
SELECT s.raison_sociale, count([Link]és) AS nbrSalariés FROM Société AS s
GROUP BY s.raison_sociale HAVING nbrSalariés > 10
Sophie NABITZ
Enterprise Java Beans - Page 57
Les jointures
• Inner join:
select p from Personne p join [Link] e where [Link]énom = ‘Jean’
select p from Personne p, in([Link]) e where [Link]énom = ‘Jean’
• Fetch join:
select distinct p from Personne p left join fetch [Link] where [Link]énom = ‘Jean’
Sophie NABITZ
Enterprise Java Beans - Page 58
Le polymorphisme
Sophie NABITZ
Enterprise Java Beans - Page 59
L'API Query
• Jonction entre l’application et l’exécution de requêtes EJB-QL : [Link]
• List getResultList() : exécute la requête et retourne l’ensemble des résultats de celle-ci
Query query = [Link]("SELECT [Link], [Link] FROM User As u");
List<Object[]> listUsers = [Link]();
for(Object[] valueArray : listUsers){
Integer id = (Integer) valueArray[0];
String name = (String) valueArray[1];
}
Utilisation de paramètres
Query setParameter(String pNom, Object val)
Query setParameter(int pIndex, Object val)
• Ces deux méthodes affectent la valeur val respectivement au paramètre pNom ou
au paramètre placé à l’index pIndex
• Les paramètres indexés sont placés dans la requête via un point d’interrogation
suivi d’un entier, dont la valeur commence par 0
SELECT user FROM User AS user WHERE [Link]=?0
• Les paramètres nommés sont placés grâce aux deux points suivis d’un identifiant
SELECT user FROM User AS user WHERE [Link]=:userId
• Ces méthodes retournent l’objet Query sur lequel elles travaillent, ce qui permet de
les appeler en cascade
Query query = [Link]("
SELECT user FROM User AS user WHERE [Link]=:userId AND [Link]=?0");
List<User> listUsers =
[Link]("userId", new Integer(5)).setParameter(0, "Alex").getResultList();
Sophie NABITZ
Enterprise Java Beans - Page 61
Modification de la base
• Possibilité d’exécuter des requêtes « UPDATE » (modification) ou
« DELETE » (suppression)
• Méthode executeUpdate() : exécute la requête qui doit être de
type UPDATE ou DELETE
– retourne le nombre d’enregistrements supprimés ou modifiés
Query query =
[Link]("DELETE FROM User user
WHERE [Link] = '%s%'");
[Link]([Link]() + " enregistrement(s) supprimé(s)");
Sophie NABITZ
Enterprise Java Beans - Page 62
Sophie NABITZ
Enterprise Java Beans - Page 64
Sophie NABITZ
Enterprise Java Beans - Page 65
• Consulter l’état
[Link]()
Configuration d'environnement
• On utilise le descripteur de déploiement : fichier [Link] dans le répertoire META-INF
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="3.0" xmlns=[Link]
xmlns:xsi=[Link]
xsi:schemaLocation="[Link] ../../../testapp/ejb-jar_3_0.xsd ">
<enterprise-beans>
<session>
<ejb-name>BeanQuiUtiliseLaRessource</ejb-name>
...
</session>
</enterprise-beans>
</ejb-jar>
• Définir des ressources externes/entrées d'environnement : valeurs similaires à des propriétés que le bean
peut lire lors de l’exécution
– balise env-entry
• env-entry-name : on y accèdera en utilisant le chemin complet java:comp/env dans une recherche via JNDI
• env-entry-type : peut être String ou un des types enveloppe (Integer, Long, …)
• env-entry-value
• Le bean retrouve ces entrées de l'environnent en utilisant JNDI, ou en utilisant une annotation
@Resource(name = "nomVariableEnvironnement")
int NbMaxAutorisé;
Sophie NABITZ