2. Les capes de negoci i d’integració
Per a implementar aquestes dues capes, J2EE
promou un tipus de components distribuïts
anomenats Enterprise JavaBeans (EJB)
2
3. Enterprise Java Beans
Els EJB són components de lògica de negoci per al
desenvolupament d’aplicacions distribuïdes basades
en components.
Els EJB són components desenvolupats amb Java que
compleixen unes especificacions i, per tant, es poden
desplegar a qualsevol contenidor d’EJB d’un servidor
d’aplicacions compatible amb la plataforma J2EE.
Els EJB segueixen un model de components en el
qual el contenidor implementa un conjunt de serveis
de baix nivell (seguretat, transaccions, etc.) i els
desenvolupadors es poden centrar en la lògica de
negoci.
3
4. Serveis del contenidor als EJB
El contenidor proporciona, entre altres, els següents
serveis de baix nivell:
Concurrència. Gestiona l’accés concurrent als components.
Seguretat. Permet definir declarativament polítiques de
seguretat i restriccions d’accés als components
Transaccions. Permet definir declarativament el
comportament transaccional dels mètodes dels components.
També es pot definir el comportament transaccional de
manera programàtica.
Cicle de vida. El contenidor s’encarrega de crear i destruir
les instàncies dels components.
Persistència. Permet definir components que gestionin
declarativament la persistència de les entitats a bases de
dades relacionals.
4
5. Tipus d’EJB
L’especificació d’EJB defineix tres tipus bàsics
d’EJB:
EJB de sessió (SessionBean). En aquest tipus de
components hi ha la implementació dels mètodes
de negoci.
EJB d’entitat (EntityBean). Aquests components
permeten representar en forma d’objectes Java
dades de taules de bases de dades relacionals.
EJB de missatge (MessageDrivenBean). Es fan
servir per a interactuar amb missatgeria
asíncrones.
5
6. Els EJB des del client
Un client, sigui una aplicació o un altre EJB,
no treballa directament amb els EJB del
sistema d’EJB.
Els clients interactuen amb un conjunt
d’interfícies que proveeixen l’accés als
components i la seva lògica de negoci: l’API
JNDI i l’API del client EJB.
El JNDI permet de trobar els EJB i accedir-hi
independentment de la seva localització a la xarxa.
L’API del client EJB és un conjunt d’interfícies i classes que
els programadors utilitzen al client per a interactuar amb els
EJB.
6
7. Què forma un EJB? (1)
Un component EJB no és un únic fitxer sinó que n’està format
per diversos:
Fitxers de codi Java desenvolupats pel desenvolupador
Altres fitxers de codi Java generats automàticament pel contenidor
Un fitxer XML amb el descriptor de desplegat.
7
8. Què forma un EJB? (2)
Els fixers que formen part d’un
component EJB són:
Classe de l’EJB
Interfície remota
Interfície remota d’inici
Interfície local
Interfície local d’inici
Descriptor de desplegament
8
9. Classe de l’EJB
Classe Java que conté la implementació del component,
típicament la lògica de negoci.
Exemple:
public class HolaBean implements SessionBean {
// mètodes del cicle de vida
public void ejbActivate() {}
public void ejbRemove() {}
public void ejbPassivate() {}
public void setSessionContext(SessionContext ctx) {}
// metode de creació de la instància
public void ejbCreate () throws CreateException {}
// mètode de negoci
public String diguesHola() {
return “Hola!!”;
}
}
9
10. Interfície remota
Interfície Java amb els mètodes que poden cridar els
clients.
Exemple:
public interface Hola extends EJBObject {
public String diguesHola()
throws RemoteException;
}
10
11. Interfície remota d’inici
Interfície Java amb els mètodes de gestió del cicle de
vida del component que poden cridar els clients
(creació, destrucció i cerca).
Exemple:
public interface HolaHome extends EJBHome {
public Hola create()
throws CreateException, RemoteException;
}
11
12. Interfícies locals i locals d’inici (1)
Els objectes locals permeten interactuar amb
EJBs dins la mateixa màquina virtual com si
estiguéssim fent crides a procediments
d’objectes locals.
Hi ha una interfície local per a definir els
mètodes de negoci (equivalent a la interfície
remota) i una interfície local d’inici per a
definir els mètodes del cicle de vida
(equivalent a la interfície remota d’inici).
12
13. Interfícies locals i locals d’inici (2)
Interfície local:
public interface HolaLocal
extends EJBLocalObject {
public String diguesHola();
}
Interfície local d’inici:
public interface HolaLocalHome
extends EJBLocalHome {
Hola create() throws CreateException;
}
13
14. Descriptor de desplegat (1)
És un fitxer XML on es defineixen els serveis
del contenidor que necessita el component.
Alguns serveis que es defineixen al descriptor
de desplegat són: cicle de vida, requeriments
de seguretat, requeriments transaccionals,
requeriments de persistència, etc.
A l’especificació 2.x d’EJB aquest fitxer
s’anomena ejb-jar.xml.
14
16. Descriptor de desplegat específic
La majoria de proveïdors de servidors
d’aplicacions tenen descriptors de desplegat
específics per a configurar algun
comportament del servidor que no
s’especifiqui al descriptor de desplegat
estàndard.
Per exemple el servidor d’aplicacions JBoss
defineix el fitxer jboss.xml per configurar el
comportament específic del servidor.
16
17. Fitxer ejb-jar
Aquests fitxers s’han d’empaquetar en un
fitxer .jar comprimit per a formar el mòdul
que es pot desplegar al servidor d’aplicacions.
Podem especificar més d’un EJB en un únic
fitxer ejb-jar.
Estructura d’un fitxer ejb-jar:
17
18. Convencions de noms
Hi ha una sèrie de recomanacions a l’hora de posar
nom als diferents fitxers que formen el component.
Per un EJB de sessió sense estat anomenat Hola,
tendríem:
La classe del EJB s’anomenarà HolaBean.
La interfície remota s’anomenarà Hola.
La interfície remota d’inici s’anomenarà HolaHome.
La interfície local s’anomenarà HolaLocal.
La interfície local d’inici s’anomenarà HolaLocalHome.
El descriptor de desplegat s’anomenarà ejb-jar-xml.
El fitxer ejb-jar s’anomenarà Hola.jar.
18
19. Crida a un mètode d’un EJB
Exemple:
// Obtenim una referència a l’arbre JNDI del servidor
Context ctx = new InitialContext();
// Obtenim una referència al EJB Home (suposem que s’ha
// penjat el components al JNDI del servidor d’aplicacions
// amb el nom "ejb/hola"
Object obj = ctx.lookup("ejb/hola");
HolaHome holaHome = (HolaHome)
PortableRemoteObject.narrow(obj,HolaHome.class);
// Creem el EJB Object a partir del EJB Home obtingut
Hola hola = holaHome.create();
// Cridem al mètode de negoci
System.out.println(hola.diguesHola());
19
21. Diàleg entre el client i el servidor (2)
1) S’obté una referència a l’arbre JNDI del servidor d’aplicacions.
2) S’obté una referència a l’EJB Home del component que volem fer
servir.
3) Es fa a una crida al mètode create() de l’EJB Home per a obtenir una
referència al EJB Object.
4) L’EJB Home reb la petició de creació i crida al mètode create(), que
crea una instància de l’EJB Object
5) L’EJB Home li torna un EJB Object al client.
6) El client crida al mètode diguesHola() de l’EJB Object per a invocar al
mètode de negoci.
7) L’EJB Object reb la petició del mètode de negoci i crida al mètode
diguesHola() de l’EJB Object. Aquest mètode executa tot el codi
configurat al descriptor de desplegat que té associat el mètode
diguesHola() i, finalment, crida al mètode diguesHola() de la classe
EJB que hem programat.
21