Vous êtes sur la page 1sur 51

Architecture n tiers(Java EE)

Partie 2: Composant Serveur Chapitre 1: EJB 3

Gnralits
La plate-forme Java EE (Java Enterprise Edition) est un standard de dveloppement et d'implmentation des applications l'chelle de l'entreprise :
Elle prend en charge les applications plusieurs niveaux (multi-tiers). Elle est conue pour amliorer le processus de dveloppement, de dploiement et d'implmentation des applications l'chelle de l'entreprise.
2

Applications multi-tiers
Application Java EE 1 Application Java EE 2 Niveau client Client applicatif Pages HTML dynamiques Ordinateur client

Pages

JSP

Niveau Web Serveur Java EE

Enterprise Beans

Enterprise Beans Niveau mtier

Niveau EIS

Serveur de base de donnes


3

Architecture Java EE
Serveur Java EE Conteneur Web Navigateur Servlet Java/JSF

Client applicatif Conteneur de client applicatif Ordinateur client

EJB API JNDI RMI JTA JDBC JavaMail

EJB

Conteneur de services fonctionnels

JMS JAF

Base de donnes

Gnralits
Permet dviter au dveloppeur davoir a se proccuper de tout ce qui a trait au systme :
Transactions Scurit Evolutivit Concurrence Communications Gestion des ressources Persistance Gestion des erreurs Etc.
5

3 types dEJB
Session
Stateless Stateful

Entity (depuis la version 3, est un simple POJO) Message-Driven Bean

Qu'est-ce qu'un bean Session ?


Un bean Session est un type d'EJB (Enterprise JavaBean) qui :
implmente un processus mtier reprsente une interaction client/serveur a une courte dure de vie reste en mmoire plutt que dans le stockage persistant est utilis pour crer une session de faade
7

Passage de EJB2 vers EJB3


utilisation des annotations et de la gnricit Java 5 pour simplifier l'criture des beans viter autant que faire se peut l'criture de fichiers XML Simplification des composants par l'utilisation des POJOs / JavaBeans Amliorer la testabilit hors du container Extension de EJBQL : jointures, subqueries, dynamic queries, native SQLqueries,
8

Passage de EJB2 vers EJB3


http://java.sun.com/developer/technicalArticles/J2EE/intro_ee5/

Beans Session stateful/stateless


Il existe deux types de bean Session :
Bean Session sans conservation d'tat (BSCE)
Il a une courte dure de vie, comme les requtes HTTP. Il est contenu dans un appel de mthode unique. Il ne gre pas l'tat du client.

Bean Session avec conservation d'tat (BACE)


Il a une longue dure de vie, comme une "connexion". Il peut appeler plusieurs mthodes. Il tient jour l'tat entre diffrentes requtes.
Conteneur EJB Pool de beans BSCE Client 1 Client 2 Conteneur EJB Beans BACE Client 1 Client 2
10

Cycle de vie d'un bean Session sans conservation d'tat

Cration N'existe pas Destruction Prt Mthode

11

Cycle de vie d'un bean Session avec conservation d'tat


Prt (inclus dans la transaction) Mthode transactionnelle Cration N'existe pas Destruction Passivation Activation Prt Mthode Mthode transactionnelle Validation ou annulation

Temporisation

Passif

12

Local vs. Remote


Permet de spcifier la manire daccder a lEJB => limplmentation des services est identique Local
appel a un EJB se trouvant sur la mme machine = appel a un EJB se trouvant dans la mme JVM

Remote
utilise RMI (Remote Method Invocation) (=> plus lent quun appel local) et JNDI (Java Naming and Directory Interface) Utilis dans la majorit des cas
13

Dveloppement du premier Bean


Configuration du serveur Jboss Cration dun nouveau EJB Project Implmentation du premier EJB Dmarrer le serveur Dployer le projet Cration du client distant

14

Dveloppement premier Bean


possibilit de nommer les beans : @Stateless(name="foobar") par dfaut, le nom de la classe

import javax.ejb.Stateless; @Stateless public class CalculatriceBean implements CalcRemote, CalcLocal { public double add(double v1,double v2) {return v1+v2;} public double sub(double v1,double v2) {return v1-v2;} public double mul(double v1,double v2) {return v1*v2;} public double div(double v1,double v2) {return v1/v2;} }

15

Dveloppement premier Bean


1. Rcupration de la rfrence vers l'annuaire JNDI 2. Recherche du bean dans l'annuaire 3. Appel des mthodes du bean
public class Client { public static void main(String args[]) throws Exception { javax.naming.Context ic = new javax.naming.InitialContext(); CalculatriceRemote bean=(CalculatriceRemote)ic.lookup("CalculatriceBean/remote"); double res = bean.add(3,6); }}

16

La couche de persistance
La couche de persistance permet de mettre en correspondance les objets et les tables de base de donnes. Cette couche est associe aux caractristiques suivantes : Elle prend en charge les fonctionnalits de lecture, d'criture et de mise en mmoire cache. Elle vite aux dveloppeurs d'avoir grer les problmes lis la base de donnes. Elle facilite les modifications et la gestion des donnes. Il est recommand de l'utiliser dans toutes les applications disposant d'un modle objet.
17

La couche de persistance
La mise en correspondance d'objets de base de donnes relationnelle avec des objets Java facilite le dveloppement d'applications Java EE. Ce mapping est fourni par des structures telles que l'API de persistance Java EJB 3.0.

Architecture de persistance entit/JPA

Modle Java

Schma 18

La couche de persistance
Une couche de persistance isole les informations de persistance de la couche applicative.
Les rsultats de l'interrogation et de la cration au niveau objets sont des objets. Les rsultats sont renvoys en tant que donnes brutes. Objets Objets Crations et mises jour d'objets via une API de niveau objet. L'API utilise SQL ou des appels de base de donnes spcifiques.

Persistance Lignes SQL

19

Qu'est-ce qu'un objet POJO ?


Un objet POJO :
est un objet Plain Old Java Object n'implmente aucune interface spciale est indpendant de l'environnement de dveloppement permet aux dveloppeurs de se concentrer sur la logique mtier contient des dfinitions de champ et des mthodes d'accs (accessors)

20

API de persistance Java EJB 3.0


Modle d'entit POJO lger
portable simplifi modulaire

Mapping relationnel objet normalis


annot flexible

Interrogations dynamiques EJB QL pleinement fonctionnel

21

Entity Bean, introducton


En ralit, les EJB3 Entity a proprement parler n'existent plus au sein des EJB3. Un Entity Bean reprsente
Des objets persistants stocks dans une base de donnes ,Des noms, des donnes

EJB 3.0 propose un modle standard de persistance laide des Entity beans Les outils qui assureront la persistance (Toplink, Hibernate, etc.), intgrs au serveur dapplication, devront tre compatibles avec la norme EJB 3.0
22

Entity Bean ?
Ce sont des objets qui savent se mapper dans une base de donne. Ils utilisent un mcanisme de persistance Ils servent reprsenter sous forme d'objets des donnes situes dans une base de donne
Le plus souvent un objet = une ou plusieurs ligne(s) dans une ou plusieurs table(s)

23

Entity Bean VS Session Bean


Interface locale uniquement (performances), La classe du bean se mappe dans une base de donnes. Cest une classe java normale (POJO) avec des attributs, des accesseurs, des modifieurs, etc. On manipulera les donnes de la BD laide des EntityBeans + laide dun PERSISTENT MANAGER. Le PM soccupera de tous les accs disque, du cache, etc. Lui seul contrle quand et comment on va accder la BD, cest lui qui gnre le SQL, etc.

24

Beans Session et entits JPA


Bean session de faade EJB 3.0 sr.srdemo.business
Affichage

Entits JPA sr.srdemo.persistence


Products.java ServiceRequests.java

ServiceRequestFacadeBean.java
Users.java

25

Caractristiques des Entity Beans


Les EB sont dploys dans des persistence Units ,
Spcifi dans le fichier persistence.xml qui est dans le jar contenant les EJBs. Exemple le plus simple :

26

EntityManager
Associ un contexte de persistance gre un ensemble dentits persistantes Implmente linterface
javax.persistence.EntityManager

pour crer, supprimer, rechercher des entits

27

EntityManager
Obtenu par : Injection de dpendances Pour obtenir les objets
Pour saffranchir des noms JNDI viter les problmes de nommage

@PersistenceContext(unitName="order") EntityManager em;

28

Configurer le fichier DS
Un fichier ds permettra de prciser le nom de la BD Le pilote JDBC Login Mot de passe Le nom de la source de donnes quon va utiliser dans le fichier persistence.xml Le fichier de configuration doit finir avec -ds et dplacer vers le rpertoire deploy
29

Exemple
<datasources> <local-tx-datasource> <jndi-name>espritDS</jndi-name>

Projet-ds.xml
<persistence-unit

name="demo"> <jta-data-source>java:/espritDS</jta-data-source>

Persistence.xml
30

Dveloppement premier Bean


import java.io.Serializable; import javax.persistence.*; @Entity @Table(name="T_Voiture") public class Voiture implements Serializable { private int immat; private String nom; }

31

Session Bean
@Stateless public class VoitureDao implements VoitureDaoRemote, VoitureDaoLocal { @PersistenceContext EntityManager em; public VoitureDao() { } public void ajouter(Voiture v) { em.persist(v); } }

32

Entity Bean les requtes nommes


@Entity @NamedQueries({ @NamedQuery(name = "Customers.findAll", query = "select o from Customers o"), @NamedQuery(name = "Customers.findByName", query = "from Customers o where o.custFirstName like :var2") }) public class Customers implements Serializable {
33

Session Bean les requtes nommes

@Stateless(name="EJBSession") public class EJBSessionBean implements EJBSession, EJBSessionLocal { @PersistenceContext(unitName="Model") private EntityManager em; public List<Customers> queryCustomersFindAll() { return em.createNamedQuery("Customers.findAll").getResultList(); } public List<Customers> queryCustomersFindByName(String var2) { return em.createNamedQuery("Customers.findByName") .setParameter("var2", var2).getResultList(); }

34

Design Pattern
Session Faade Service locator Business Delegate

35

Session Faade

36

Session Faade
Use case / mthode, groups dans un Session Stateless Bean Tte de transaction
minimise la gestion de transaction

Trafic rseau minimis Bonne maintenabilit, rutilisabilit

37

Session Faade

38

Service Locator
Centraliser toutes les utilisations de JNDI et de l'objet InitialContext Amliorer les performances d'accs aux EJB (par utilisation dun cache) Fournir un seul point de contrle Ce pattern apporte de la flexibilit et de lextensibilit au niveau framework.

39

Service Locator

40

Service Locator
public class ServiceLocator { private Context initalContext; private Map<String, Object> cache; private static ServiceLocator instance= new ServiceLocator(); public static ServiceLocator getInstance() {return instance;} private ServiceLocator() throws ServiceLocatorException { try { initalContext = new InitialContext(); cache = new HashMap<String, Object>(); } catch (Exception e) { throw new ServiceLocatorException(e);}}

41

Service Locator
public Object getRemoteInterface(String jndiName) throws ServiceLocatorException { Object remoteInterface = cache.get(jndiName); if (remoteInterface == null) { try { remoteInterface = initalContext.lookup(jndiName); cache.put(jndiName, remoteInterface); } catch (Exception e) { throw new ServiceLocatorException(e);}} return remoteInterface;}}
42

Business Delegate
Rduire le couplage entre la couche mtier et la couche prsentation Cacher la complexit de manipulation des objets mtiers distribus, par encapsulation Mettre en cache les rfrences distantes (et, ultrieurement les rsultats) Rpartir plus facilement le travail entre les dveloppeurs de la couche prsentation et les dveloppeurs de la couche mtier
43

Business Delegate

44

Business Delegate
public final class CustomerDelegate { (...) public static Customer findCustomer(Long customerId) { return getCustomerRemote().findCustomer(customerId); } public static void deleteCustomer(Customer customer) { getCustomerRemote().deleteCustomer(customer); }

45

Business Delegate
private static CustomerRemote getCustomerRemote() { CustomerRemote customerRemote; customerRemote = (CustomerRemote) ServiceLocator.getInstance().getRemoteInterface( "Customer/remote"); return customerRemote; } }

46

Transactions
JTA (Java Transaction API) fournit un API permettant de grer les transactions :
BMT (Bean-Managed Transactions) => @TransactionManagement(TransactionManagementT ype.BEAN) CMT (Container-Managed Transactions) = @TransactionManagement(TransactionManagementT ype.CONTAINER)

Par dfaut, le conteneur gre les transactions JPA (Java Persistance API) ne dpend pas du mode de gestion des transactions
47

CMT
Le conteneur dmarre, valide ou annule la transaction. La transaction commence au dbut de lexcution de la mthode metier appele et se termine a la fin de cette dernire On peut forcer le fait que la transaction soit annule (context.setRollBackOnly()) @Resource private SessionContext context; Avec CMT, nous navons pas le contrle sur le moment ou la transaction est dmarre, valide ou annule
48

BMT
On utilise la UserTransaction @Resource private UserTransaction userTransaction; userTransaction = context.getUserTransaction(); userTransaction.begin(); userTransaction.commit(); OU userTransaction.rollback();
49

Cas pratique

50

Cas pratique
Implmenter les Entity Bean Ajouter la couche DAO Implmenter le session facade
Crer Client Crer Compte Affecter compte un client Crditer un compte Dbiter un compte Virement de largent dun compte un autre.

Implmenter le design pattern: Business Delegate et Service Locator


51