Karim Bouzoubaa Issam Kabbaj

publicité
EJB
Karim Bouzoubaa
Issam Kabbaj
Problématique
jsp
html
Objets
java
jdbc
table
•  Pour accéder aux données :
– 
– 
– 
– 
Établir une connexion avec la BD
Envoyer une requête
Traiter la requête
Assurer l'intégrité
•  Or :
–  Nous voulons rester dans un monde Java
–  Ne pas s'occuper de la connexion
–  Na pas avoir à assurer l'intégrité
4/27/14
EJB
2
Objectif
•  Diviser
–  Chacun parle un langage
–  Assurer les interfaces
–  Architecture n-tiers
Monde JAVA
Apache
IIS
client
BEA Logic
JBOSS
http
Serveur
web
Serveur
Application
BD
html
EJB
jsp
servlet
4/27/14
EJB
3
Architecture JEE
4/27/14
EJB
4
Objectif
•  Serveur web
–  Avec le client : servlet-jsp/html
–  Avec le serveur d'application : Java
•  Serveur d'application
Partie 1
Partie 2
Serveur
web
Interface BD
Offre
Serveur
de services Application
BD
EJB
4/27/14
EJB
5
Objectif
•  Partie 1 :
–  ORM (Object Relational Mapping)
•  Assurer la connexion et conversion Objets Java / Modèle
relationnel BD
•  Assurer l'intégrité et la persistance avec BD
–  Sous traité à des librairies (JPA: TOPLink, Hibernate,
EclipseLink, …)
•  Partie 2 :
–  Permet au client demandeur (1 jsp, 1 servlet, 1 prog java)
d'effectuer des requêtes par des appels Java et à
retourner comme résultat des objets Java
4/27/14
EJB
6
Exemple
Serveur
Application
Serveur
web
Prog jsp:
lister tous les
pays
…
findAllPays()
computeAVG()
…
Service 1:
Table Pays
findAllPays()
Tabl
Liste
des
ts
Obje
y
Pa s
e Pa
ys
Service 2
Service 3
4/27/14
Service 1
accès
Conversion
en
objets
Java
EJB
7
EJB
•  Architecture permettant la création d'applications
réparties
•  Spécification d'une architecture permettant la
création d'applications distribuées
–  2 versions
•  1.1 : la plus courante
•  3.0 : la plus récente
•  Composant développé pour être exécuté sur un
serveur d'EJB et appelé par un client distant
–  Ne pas confondre avec un java bean qui est un
composant côté client
4/27/14
EJB
8
Objectifs des EJB
•  Rendre une application
–  Facile à développer, à déployer et à administrer
–  Indépendamment de la plate-forme permettant son exécution
•  Un EJB n'est pas spécifique à la plateforme dans
laquelle il est utilisé
•  Fournir une plate-forme standard pour la construction
d'applications distribuées en Java
•  Simplifier l'écriture de composants serveurs
•  Portabilité
4/27/14
EJB
9
Benefits of EJB
•  Encapsulating business logic
–  Business logic separated from control and presentation
•  Remote access
–  Multiple apps on different servers can access EJBs
•  Simplicity
–  Relatively easy to use compared to other remote-object
systems
•  Broad vendor support
–  JBoss, Oracle AS, WebLogic, WebSphere, Glassfish, etc.
•  Scalability
–  Virtually all Java EE app servers support clustering, load
balancing, and failover
4/27/14
EJB
10
Types de Bean
•  Session Beans : contiennent la logique
métier de l'application
–  Etat (state): données relatives au client
•  Stateful session bean
•  Stateless session bean
•  Entity Beans : contiennent la logique de
gestion des données persistantes
•  Message bean : contiennent la logique
orientée message
4/27/14
EJB
11
Session Bean
• 
• 
• 
• 
• 
• 
Fournit un service à un client
Durée de vie limitée à celle du client
Effectue des calculs ou des accès à une base de données
Est non persistant (short-lived)
Associé à un seul client
Un flot d'exécution est créé pour
–  chaque appel de méthode
•  stateless sessions bean (sans état)
•  pas de donnée interne, inutile de le rendre passif, peut être partagé par
plusieurs clients
–  plusieurs appels de méthodes en provenance du même client
•  Stateful sessions bean (avec état)
•  Détruit après un arrêt (ou une panne) du serveur EJB
4/27/14
EJB
12
Session à Stateless
• 
• 
• 
• 
4/27/14
Stateless (sans état) à les attributs de l’EJB sont réinitialisées entre
chaque appel même s’il s’agit du même client
Sont spécialement pensés pour être robustes et fiables lorsqu’il y a
beaucoup d’appels en concurrence
Lorsqu’un client appelle l’EJB, une instance de ce dernier sert le client, puis,
retourne dans le pool d’EJB (cette dernière est donc prête à être réutilisée
pour un autre client)
A utiliser le plus souvent possible (par rapport aux Stateful) à cycle de vie
EJB
13
Session beans
•  Stateless session beans
–  On server, you make interface (marked with @Remote) and
POJO that implements it (marked with @Stateless)
•  Ordinary Java object with ordinary methods that use ordinary Java
objects as arguments and return types
•  No state (instance vars) maintained between method calls
–  Client uses InitialContext.lookup("name") to get ref.
•  Client makes normal method calls (data serialized on net.)
•  Stateful session beans
–  Mark POJO with @Stateful instead of @Stateless
–  Mark special method with @Remove
–  Client does similar lookup and method calls, but needs to call the
special method when done.
•  State (instance vars) maintained until that method called
4/27/14
EJB
14
Stateless Session Beans : Approach
•  Define an interface
–  Mark with @Remote
•  For access from other servers or from projects on same
server
–  Mark with @Local
•  To only allow access from projects on same server (default)
•  Create a class that implements interface
–  Mark with @Stateless for server’s default JNDI
mapping
–  Mark with
@Stateless(mappedName="SomeJndiName »)
–  (Java Naming and Directory Interface)
4/27/14
EJB
15
Interface
Means that you can use InitialContext to
access from either same server or
remote machine.
Remote client will pass in normal arguments and get normal
return values. Behind the scenes, however, data will be
serialized and sent across network.
4/27/14
EJB
16
Class that Implements Interface
If you just use @Stateless, remote clients need
to use serverspecific JNDI name. If you are
using Glassfish only (or JBoss only), this is fine.
But if you want to deploy the same app to
multiple servers and not change the client code
at all, it simplifies things to use a common JNDI
name via @Stateless(mappedName="JNDIName")
4/27/14
EJB
17
Remote Standalone (Desktop) Client
mappedName given in @Stateless annotation
Used like normal object. Behind the scenes, however,
arguments and return value are sent across network.
4/27/14
EJB
18
Remote Client : jndi.properties
•  Notes
–  Created text file called “jndi.properties” in src folder
Change this hostname if app server is
on different host than client.
•  For Glassfish
org.omg.CORBA.ORBInitialHost=localhost
•  Output
–  Small lucky number:4,46
–  Medium lucky number:20,03
–  Big lucky number: 431,26
4/27/14
EJB
19
Client
•  Clients must also define (have a copy - share) the interface
•  Clients find the bean via JNDI
–  Client Java code doesn’t even know the machine on which the bean resides
•  Clients use the bean like a normal POJO
–  But arguments and return values are sent across network
–  So, custom classes should be Serializable
•  Core client code
InitialContext context = new InitialContext();
InterfaceName bean = (InterfaceName)context.lookup("JNDI-Name");
NumberService bean = (NumberService)context.lookup("NumberServiceJNDIName");
NumberService bean = (NumberServiceImplementation)context.lookup("NumberServiceJNDIName");
4/27/14
EJB
20
Deploying
–  Does not need to run on same machine as EJB Project.
–  Standalone (desktop) clients don’t need to be deployed
to any app server; they can just have a “main” method.
–  Web apps should be deployed to a Java EE 5 app
server
4/27/14
EJB
21
Remote Web Client (Servlet)
4/27/14
EJB
22
Output
4/27/14
EJB
23
DEMO
Using @EJB to Access Local Beans
•  Use @EJB before instance variable
–  Bean will be automatically instantiated and assigned. Eg:
•  @EJB private SomeService myService;
•  Useful for
–  One EJB that uses another EJB as part of its logic
•  Always good idea since EJBs are usually together
–  Multiple Web apps that use the same business logic
•  Simpler, but Web app can’t move to remote server
•  Restrictions
–  Before instance variables, not local variables.
–  Both classes must be part of same EAR on same server
•  In Eclipse, all classes in a single EJB project satisfy this
•  If you use an EJB project (EJBs) and Dynamic Web projects (classes
that use the EJBs), you must choose « Add project to an EAR » and
specify same one.
4/27/14
EJB
25
EJB Interface
4/27/14
EJB
26
EJB Class that Implements Interface
Declare the interface type (NumberService),
not the concrete type
(NumberServiceImplementation).
4/27/14
EJB
27
Remote Client
(Servlet)
4/27/14
Looks up remote EJB the normal way. That remote EJB
uses @EJB to access a local bean. If this Web app were
always part of the same EAR on the same app server, then
this Web app could also use @EJB to access beans. But
having the Web app use InitialContext is more flexible
because it allows for the possibility of the Web app later
moving to another server without changing any code.
EJB
28
Output
4/27/14
EJB
29
EXERCISE WITH DESKTOP
APPLICATION
Session à Stateful
• 
Stateful (avec état) => les attributs de l’EJB sont sauvegardés durant toute la session
• 
Lorsqu’un client appelle l’EJB, une instance de ce dernier est créée, puis sert le
client. Cette instance reste disponible pour les futurs appels de ce client
uniquement. Cette instance sera détruite à la fin de la session (timeout ou appel à
une méthode portant l’annotation @Remove)
• 
S’il y a trop d’instances d’un EJB en mémoire, ces dernières peuvent être sorties de
la mémoire de travail. Elles passent ainsi en mode passif (= sauvées sur disque =>
tous les attributs doivent être sérialisables = types implémentant l’interface
Serializable)
4/27/14
EJB
31
Stateful Session Beans : Approach
•  Define an interface
–  Mark with @Remote
•  For access from other servers or from projects on same
server
–  Mark with @Local
•  To only allow access from projects on same server (default)
•  Create a class that implements interface
–  Mark with @Stateful for server’s default JNDI
mapping
–  Mark with
@Stateful(mappedName="SomeJndiName")
–  Mark a method with @Remove
•  When called, server terminates session and gc’s instance
4/27/14
EJB
32
EJB Interface
4/27/14
EJB
33
EJB Class that
Implements Interface
Remote client will do
Context.lookup("coolnumber-list") and cast it to
FancyList
Client will call this method first to set
up the state of the bean. Then the client
will repeatedly access the getBlah
methods to access information related
to the state. When done, the client will
call removeList
When client calls this method, session
is broken and bean instance is eligible
for garbage collection
4/27/14
EJB
34
Remote Client (Servlet)
Sets up state that will be
used in the JSP page
JSP page (MVC approach)
uses state of the EJB
Tells remote app server we
are done with stateful EJB
4/27/14
EJB
35
Remote Client (JSP)
4/27/14
EJB
36
Remote Client (Input Form)
4/27/14
EJB
37
Remote Client : Results
4/27/14
EJB
38
Développer des sessions Beans
•  Stateful vs Stateless
–  Utiliser un bean session avec état (stateful) si :
•  L e b e a n e n r e g i s t r e d e s d o n n é e s d ’ u n s e u l c l i e n t
particulier(comme une session d’un navigateur Web)
•  Le bean enregistre des données pendant la durée d’appel de
plusieurs invocations de méthodes
•  L’état du Bean représente l’état de l’interaction entre le client et
le Bean
•  Le Bean doit conserver de l’information entre deux invocations
du client
•  Dédié à un client pendant toute sa dur de vie
•  Le même Bean est utilisé pour servir tous les appels du même
client
4/27/14
EJB
39
Développer des sessions Beans
•  Utiliser un bean session sans état (stateless) si :
–  Le bean n’enregistre pas des données d’un seul client
–  le bean existe pour un appel de méthode unique
–  le bean est utilisée pour extraire des données d'une
base de données
–  Pour des tâches génériques
–  Pour consulter en lecture seule des données
persistantes
–  Efficaces et faciles à implémenter
–  Les données sont passées comme paramètres de la
méthode
4/27/14
EJB
40
Summary
•  Stateless session beans
–  Interface: mark with @Remote
–  Class: mark with @Stateless(mappedName="blah")
•  Stateful session beans
–  Mark class with @Stateful instead of @Stateless
–  Mark a method with @Remove
•  Session bean clients
InitialContext context = new InitialContext();
InterfaceType var = (InterfaceType)context.lookup("blah");
var.someMethod(args);
–  For stateful beans, call specially marked method when done
–  Need jndi.properties specific to server type
•  Local access to beans
@EJB private InterfaceType var;
4/27/14
EJB
41
Entity Bean
•  Ce sont des objets qui savent se mapper
avec une base de données
•  Ils servent à représenter sous forme d'objets
des données situées dans une base de
données
–  Le plus souvent un objet = une ou plusieurs
ligne(s) dans une ou plusieurs table(s)
•  Accepte les accès multiples effectués par
plusieurs clients
•  Utile pour gérer les accès concurrents à des
données persistantes
4/27/14
EJB
42
Persistance par mapping objet/BD relationelle
4/27/14
EJB
43
Entity Bean
•  C’est une classe java « normale » (POJO) avec des attributs,
des accesseurs, des modifieurs, etc.
•  On utilisera les annotations (méta-données) ou « attributs de
code » pour indiquer le mapping, la clé primaire, etc.
–  Clé primaire = un objet sérializable, unique pour chaque
instance. C'est la clé primaire au sens SQL
•  On manipulera les données de la BD à l’aide des EntityBeans
+ à l’aide d’un PERSISTENT MANAGER (PM)
•  Le PM s’occupe de tous les accès disque, du cache, etc.
–  Lui seul contrôle quand et comment on va accéder à la
BD, c’est lui qui génère le SQL, etc.
4/27/14
EJB
44
Annotation @Entity
•  L’annotation @Entity définit le bean comme étant de
type entité
•  Le bean doit posséder au moins un constructeur par
défaut et devra hériter de l’interface Serializable afin
d’être utilisable à travers le réseau pour la gestion de
la persistance
•  On peut spécifier deux méthodes différentes pour la
gestion de la persistance au moyen de l’option
access :
–  @Entity(access=AccessType.FIELD) permet d’accéder
directement aux champs à rendre persistant
–  @Entity(access=AccessType.PROPERTY) oblige le
fournisseur à utiliser les accesseurs
4/27/14
EJB
45
Clé primaire
• 
La clé primaire peut-être simple ou composée et doit être déclarée avec
l’annotation @Id
–  Par exemple, pour obtenir une clé qui s’incrémente automatiquement :
•  @Id
•  @GeneratedValue(strategy = GenerationType.AUTO or GenerationType.IDENTITY)
• 
Pour les clés composées, il faut respecter certains principes :
–  La classe de la clé primaire doit être public et posséder un constructeur sans arguments.
–  Si l’accès est de type PROPERTY, la classe peut-être soit de type public soit de type protected.
–  La classe doit être sérialisable (implémenter Serializable).
–  Implémentation des méthodes equals() et hashCode().
–  Si la clé primaire est mappée à de multiples champs ou propriétés, les noms des champs de cette clé
doivent être les mêmes que ceux utilisés dans le bean entité.
• 
Les annotations permettent d’effectuer le mapping objet/relationnel et la gestion
des relations entre les entités
4/27/14
EJB
46
Class Entity
La classe = POJO,
Sérializable,
Un attribut = la clé primaire
C’est tout !
4/27/14
EJB
47
Fichier persistence.xml
4/27/14
EJB
48
Class Stateless Session
•  Ce session bean est stateless,
•  Utilise un EntityManager,
•  Sert à envoyer des requêtes JPQL,
•  Méthode persist(entity) pour créer une nouvelle entrée (insert)
•  Le reste passe par des appels de méthodes classiques de l’entity bean.
4/27/14
EJB
49
Class Stateless Session
4/27/14
EJB
50
Client
4/27/14
EJB
51
Client
4/27/14
EJB
52
Main
4/27/14
EJB
53
Annotations utilisés
•  Lors de la création d’un bean
entité, il faut effectuer le mapping
de tous ses champs.
• 
@Table définit la table
correspondant à la classe, elle
prend en argumant le nom de la
table.
•  Un mapping par défaut intervient
lorsqu’aucune annotation
précède le champ : @Basic
spécifie ce comportement.
4/27/14
@Entity(access=accessType.FIELD)
@Table(name="PAYS")
public class Pays implements Serializable {
@Id
@GeneratedValue(strategy =
GenerationType.AUTO)
private int id;
@Basic
private String nom;
public Pays() {
}
public Pays(String nom) {
this.nom = nom;
}
public int getId() {
return id;
}
}
EJB
54
Annotations utilisés
• 
On peut faire correspondre une valeur à un champ spécifique de la base de données en utilisant
l’annotation @Column et des options comme name qui spécifie le nom de la colonne, ou des options
pour définir si champ peut être nul, …
@Column(name="DESC", unique=true, nullable=false, length=32)
public String getDescription() {
return description;
}
• 
Il existe les relations OneToOne , OneToMany , ManyToOne , ManyToMany
(définies par les
annotations correspondantes). Dans ces cas, il ne faut pas oublier de spécifier les colonnes faisant les
jointures.
@ManyToOne(optional=false)
@JointColumn(name = "CLIENT_ID", nullable = false, updatable = false)
public Client getClient (){
return client;
}
@JoinTable(name = "Mat_Prof", joinColumns = {
@JoinColumn(name = "id_prof", referencedColumnName = "id_prof")}, inverseJoinColumns = {
@JoinColumn(name = "id_mat", referencedColumnName = "id_mat")})
@ManyToMany
private Collection<Matieres> matieresCollection;
4/27/14
EJB
55
EntityManager
•  Les beans entités se manipulent par l’intermédiaire d’un
EntityManager.
•  Cet EntityManager peut être obtenu à partir d’un Bean Session par
injection de dépendance.
@Stateless public class EmployeeManager{
@PersistenceContext(unitName = "EmploiePU")
EntityManager em;
public void updateEmployeeAddress (int employeeId, Address address) {
//Recherche d’un bean
Employee emp = (Employee) em.find("Employee", employeId);
emp.setAddress (address);
}
}
4/27/14
EJB
56
Create an Entity Bean Class
•  This interface is used for interacting with the persistence
context.
•  This interface is essential for database access and control,
as it defines several methods for working with entity
instances.
4/27/14
EJB
57
Create an Entity Bean Class
• The Interface Methods
•  The EntityManager interface defines several methods that you can use to work
with entity instances.
• Some of the vital methods that you need to be aware of are the database
management methods.
Method
Description
find()
Searches a table based on the primary key for a particular
record.
remove()
Removes the instance of an entity.
persist()
Makes the instance of an entity managed and persistent.
4/27/14
EJB
58
Modèle global
4/27/14
EJB
59
Exemple avec Produit
•  Projet complet
–  BD (table produit)
–  EJB-Model
•  entite ejb
•  session ejb
–  Servlet-Control
–  Jsp-View
4/27/14
EJB
60
Exemple avec Produit
4/27/14
EJB
61
Exemple avec Produit
4/27/14
EJB
62
Exemple avec Produit
4/27/14
EJB
63
Exemple avec Produit
4/27/14
EJB
64
Exemple avec Produit
4/27/14
EJB
65
Exemple avec Produit
4/27/14
EJB
66
Exemple avec Produit
4/27/14
EJB
67
Liens utiles
•  http://netbeans.org/kb/docs/javaee/ecommerce/entity-session.html
•  J2EE Specification
–  Java.sun.com/products/j2ee
•  Enterprise Java Beans Specification 1.1 et 2.0
–  Java.sun.com/products/ejb
•  Mastering Enterprise JavaBeans and the Java 2 Platform
Enterprise Edition – Ed Roman – Wiley Computer publishing 1999
•  www.theserverside.com
•  java.sun.com/j2ee/tutorial
•  www.jboss.org (serveur Open Source)
•  Support de cours de Didier Donsez (université de Valenciennes)
•  J2EE blueprints (java.sun.com)
•  Mastering Enterprise JavaBeans II – Ed Roman (www.theserverside.com)
4/27/14
EJB
68
Téléchargement