1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
21 22 23 24 25 26 27 28 29 30 31 32 33 

EJB 2 - Les Entreprise Java Bean (JavaBeans)

4.6.La vue cliente

Le client d’un EJB ne travaille pas directement avec le système EJB. En outre, le client accède via des interfaces à des beans et leur logique métier. Ces interfaces regroupent l’API JNDI (Java Naming Directory Interface) et une API client EJB.
Pendant que JNDI est utilisé pour localiser et accéder aux EJB de façon transparente, l’API client EJB est un ensemble d’interfaces et classes que le développeur utilise pour travailler avec les beans.

Nous verrons dans ce chapitre plusieurs petits exemples de code permettant de localiser / accéder / travailler avec les beans. Vous trouverez un code complet dans le chapitre : EJB par la pratique.

4.6.1.Localisation de Beans avec JNDI

Une application cliente commence toujours par localiser les EJB que l’on souhaite utiliser. La classe InitialContext (que vous retrouverez dans les exemples) fait partie de l’API JNDI. Nous utilisons celle-ci pour pour chercher un objet : « EJB Home » sur un serveur d’EJB comme vous pourriez utiliser un carnet d’adresse pour retrouver le téléphone d’un ami.

JNDI est un standard en java. Il permet donc d’uniformiser la connexion à un service d’annuaire, comme le fait JDBC pour les bases de données. Il existe différent fournisseurs d’annuraire, chacun d’eux doit donc fournir son propre driver pour son type d’annuaire (LDAP, Système de fichier, EJB …).

Une fois que le client a pu récupérer un objet de type « EJB Home » grâce à JNDI, celui-ci peut l’utiliser pour obtenir une objet de référence vers l’EJB.
Le context initial doit être configuré suivant le serveur d’application, voici un exemple d’utilisation avec le serveur JBoss :

/**
* Get the initial naming context
*/
protected Context getInitialContext() throws Exception {
Hashtable props = new Hashtable();
props.put(
Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
props.put(
Context.URL_PKG_PREFIXES,
"org.jboss.naming:org.jnp.interfaces");
props.put(Context.PROVIDER_URL, "jnp://localhost:1099");
Context ctx = new InitialContext(props);
return ctx;
}

Nous pouvons remarquer que le driver est la classe : org.jnp.interfaces.NamingContextFactory. Il faudra donc que cette classe soit dans le classpath du client.

4.6.2.L’api Client distant

Un EJB est constitué de sa classe d’implémentation (Bean), de ses interfaces, de sa classe de clé primaire (si spéciale) et d’autres classes dites « Helper ».
Parrallèlement, le client n’a besoin que des interfaces et de la classe de clé primaire et des classes helper. Cet ensemble contribue donc à l’API Cliente. API qui permettra au client d’intéragir avec le système métier EJB.

Depuis la spécification 2.0, les ejb peuvent définir des interfaces locales et donc faciliter la connexion entre les EJB locaux.
Nous détaillerons principalement l’API Distance client car c’est la plus complexe (couche réseau …).

4.6.3.RMI – IIOP

La communication entre le serveur d’EJB et le client distant se fait via RMI et plus particulièrement par le protocole RMI-IIOP. Ce protocole étant compatible avec CORBA, cela permet d’être beaucoup plus portable qu’un protocole propriétaire.
Cependant, les types et valeurs utilisés dans les interfaces doivent être compatibles avec le protocole.
Nous allons voir plus en détail, les différentes faces de ce protocole. Bien entendu, ces restrictions s’appliquent uniquement aux accès distants, les accès locaux n’utilisant pas RMI…

Les interfaces remote home interface et remote interface héritent respectivement de EJBHome et EJBObject, qui héritent également de java.rmi.Remote. Elles doivent donc respecter les spécifications RMI :
  • Types de retour et paramètres doivent être :
    • Primitives
    • String
    • java.rmi.Remote objets
    • java.io.Serializable objets


Vous avez peut-être remarqué que l’ensemble des méthodes d’une Remote interface doit pouvoir jeter des exceptions du type : java.rmi.RemoteException. Ce type d’exception est utilisé lorsque l’application rencontre des problèmes avec la distribution d’objets de communication par exemple :
  • une coupure de réseau
  • impossiblité de trouver le serveur

        1. PortableRemoteObject

Dans l’API Java RMI-IIOP les références distantes doivent être « narrowed » en utilisant la méthode : PortableRemoteObject.narrow().
En effet, la méthode lookup de l’objet Context, renvoie un « Object ». Comme les clients distants utilisent l’API RMI-IIOP, ils sont donc restreints à respecter le protocole IIOP 1.2.
Certains langages ne prennent pas en compte le concept de « casting », le protocole IIOP ne supporte donc pas l’implémentation de multiples interfaces. Les « stub » retrournés avec IIOP implémente seulement une interface spécifiée par le type de retour de la méthode retournant l’objet distant.
Si le type de retour est : « Object » comme c’est le cas pour la méthode lookup(), les stub implémenteront seulement le type Object.

Cependant, il n’est pas intéressant de récupérer un objet si son type est Object (vous ne pourrez rien en faire). De ce fait, Java RMI fournit un mécanisme pour explicitement « narrowed » vers un type particulier. Pour cela, vous devez utiliser la méthode narrow de l’objet PortableRemoteObject.

/**
* Get the home interface
*/
protected com.society.stockmanager.interfaces.StorageServiceHome getHome() throws Exception {
Context ctx = this.getInitialContext();
Object o = ctx.lookup("ejb/StorageService");
com.society.stockmanager.interfaces.StorageServiceHome intf = (com.society.stockmanager.interfaces.StorageServiceHome) PortableRemoteObject
.narrow(o, com.society.stockmanager.interfaces.StorageServiceHome.class);
return intf;
}


Cas d’utilisation :
  • Lorsque vous récupérer la home interface EBJ via la méthode lookup

Object ref = jndiContext.lookup("ejb/Product");
CabinHomeRemote home = (ProductHome) // remote home
PortableRemoteObject.narrow(ref, ProductHome.class);

  • Lorsque vous appelez la méthode : javax.ejb.Handle.getEJBObject()

Handle handle = .... // get handle
Object ref = handle.getEJBObject();
Product prod = (Product) // remote interface
PortableRemoteObject.narrow(ref, Product.class);

  • Lorsque vous appelez la méthode : javax.ejb.HomeHandle.getEJBHome()

HomeHandle homeHdle = ... // get home handle
EJBHome ref = homeHdle.getEJBHome();
ProductHome home = (ProdcutHome) // home interface
PortableRemoteObject.narrow(ref, ProductHome.class);

  • Lorsque vous récupérez une référence à un EJB distant depuis une collection

ProductHome productHome = ... // get product home
Enumeration enum = productHome.findByQuantity(2000);
while(enum.hasMoreElements()){
Object ref = enum.nextElement();
Product product = (Product) // remote interface
PortableRemoteObject.narrow(ref, Product.class);
// do something with product reference
}

4.6.4.Remote Home Interface

La remote home interface fournit l’ensemble des opérations liées au cycle de vie d’un bean, mais également les opérations d’acquisions des informations de méta-données. Lorsque vous utilisez JNDI vous récupérer une référence distance vers l’interface home de l’EJB. Celle-ci implémente l’interface javax.ejb.EJBHome :

public interface javax.ejb.EJBHome extends java.rmi.Remote {
public abstract EJBMetaData getEJBMetaData()
throws RemoteException;
public HomeHandle getHomeHandle() // new in 1.1
throws RemoteException;
public abstract void remove(Handle handle)
throws RemoteException, RemoveException;
public abstract void remove(Object primaryKey)
throws RemoteException, RemoveException;
}

Vous pouvez ensuite utiliser votre objet pour gérer la vie de l’EJB distant lié (création, suppression …)
        1. Remove

La méthode remove de l’interface EJBHome est responsable de la suppression d’un EJB. Elle prend en argument, soit l’objet Handle, soit la clé primaire (dans le cas d’un entity bean).
Dès que le client appelle cette méthode, la référence à l’EJB devient invalide.Si un problème survient lors de la suppression, une exception de type : RemoveException est lancée.

La suppression diffère suivant le type d’EJB.
Si vous supprimez un session bean, c’est la session du service qui est arrêtée. L’état de conversation est supprimé et toutes les informations liées à cette session.

Dans le cas d’un entity bean, la suppression annule la référence entre le client et le serveur, mais enlève également toutes les données liées au bean de la base de données. L’action de suppression sur un entity bean est donc plus importante que sur un session bean.
        1. BeanMetaData

La méthode getEJBMetaData() de l’interface EJBHome retourne une instance de type : javax.ejb.EJBMetaData qui décrit la remote home interface, la remote interface, a clé primaire, et le type d’EJB (session ou entity).
Cette « fonctionnalité » trouve un grand intérêt dans les IDE de développement. En effet, vous pouvez créer un client simplement en vous connectant sur l’ejb distant et en récupérant les différentes informations. Vous pouvez retrouver le nom de l’interface home, interface remote …
Voici le prototype de cette interface :
public interface javax.ejb.EJBMetaData {
public abstract EJBHome getEJBHome();
public abstract Class getHomeInterfaceClass();
public abstract Class getPrimaryKeyClass();
public abstract Class getRemoteInterfaceClass();
public abstract boolean isSession();
}

Vous pouvez remarquer qu’en utilisant la réflexion en Java, vous pouvez retrouver l’ensemble des informations liées aux interfaces (méthodes, paramètres …).

Voici un exemple d’utilisation de cette interface :
Context jndiContext = getInitialContext();

Object ref = jndiContext.lookup("ejb/Product");
ProductHome c_home = (ProductHome)
PortableRemoteObject.narrow(ref, ProductHome.class);

EJBMetaData meta = c_home.getEJBMetaData();

System.out.println(meta.getHomeInterfaceClass().getName());
System.out.println(meta.getRemoteInterfaceClass().getName());
System.out.println(meta.getPrimaryKeyClass().getName());
System.out.println(meta.isSession());

        1. Home Handle

L’API EJB fournit un objet appelé un « HomeHandle » que l’on peut récupérer en appelant la méthode : getHomeHandle() de l’interface EJBHome. Cette méthode retourne un objet de type : javax.ejb.HomeHandle qui correspond à un objet sérialisable qui référence une remote home interface. Cet objet HomeHandle permet d’enregistrer une référence à une remote home interface afin d’être utilisée plus tard.

4.6.5.Remote Interface

L’interface « Remote » se focalise sur les problèmes liés au métier (business). Vous ne devez pas inclure de méthodes liées aux opérations systèmes tel la persistance, la securité … (qui sont gérés par le conteneur).
Chacune des méthodes doit renvoyer au moins des java.rmi.RemoteException. Cette exception permet d’indiquer au client un problème dû au réseau (communication …).
        1. EJBObject

L’interface Remote doit hériter de : javax.ejb.EJBObject (qui hérite de java.rmi.Remote).
Voici la définition de cette interface :
public interface javax.ejb.EJBObject extends java.rmi.Remote {
public abstract EJBHome getEJBHome()
throws RemoteException;
public abstract Handle getHandle()
throws RemoteException;
public abstract Object getPrimaryKey()
throws RemoteException;
public abstract boolean isIdentical(EJBObject obj)
throws RemoteException;
public abstract void remove()
throws RemoteException, RemoveException;
}

Lorsque que le client obtient une référence à une remote interface, il obtient, en réalité, une référence distante à un objet EJB. Cet objet implémente la remote interface et délègue l’ensemble des méthodes métiers à la classe du bean, il implémente donc de sa propre façon les méthodes de l’interface EJBObject.
Bien entendu cette implémentation est automatiquement gérée par le conteneur et est générée lors du déploiement.
        1. Handle

La méthode getHandle() de l’interface EJBObject retourne un objet de type : javax.ejb.Handle. C’est une référence, à l’objet EJB distant, sérialisable. Cela permet de sérialiser le handle et le déserialiser afin de se reconnecter à l’EJB plus tard.
Cette interface ne définit qu’une seule méthode :

public interface javax.ejb.Handle {
public abstract EJBObject getEJBObject()
throws RemoteException;
}

La méthode getEJBObject() retourne l’objet EJB distant à partir duquel le « handle » avait été créé. Vous devrez bien entendu utiliser la méthode « PortableRemoteObject.narrow() » vu que la méthode retourne un objet typé sur l’interface « Handle ».
Cette fonectionnalité est très pratique, car elle vous permet de ne faire qu’un seul appel à la méthode getEJBObject() pour récupérer votre EJB distant. Si vous passez par la méthode « classique » vous devez le faire en 3 étapes (« lookup JNDI », « récupérer la home interface », « récupérer l’objet ejb distant).

        1. Clé primaire

Vous pouvez récupérer la clé primaire d’un entity bean via la méthode getPrimaryKey(). Cette clé primaire est très utile, car elle vous permettra de récupérer votre objet entity via la méthode findByPrimaryKey().

Une clé primaire doit impérativement implémenter java.io.Serializable. En effet, elle est enregistrée en tant que données dans la base.

Vous pouvez également vous en servir du côté client. En effet, si le client connaît la clé d’un EJB entity, alors il peut le récupérer (via le findByPrimaryKey). Cette clé étant sérialisable, le client peut l’enregistrer dans un fichier (en local) et s’en reservir plus tard.
        1. Remove

La méthode remove de l’interface EJBObject est utilisée pour supprimer un session ou entity bean. Cette méthode effectue le même traitement que la méthode remove de l’interface EJBHome. Pour les sessions beans, cette méthode supprime toutes références à l’EJB distant, qui devient inaccessible pour le client. Pour un entity bean, l’entité liée à l’objet EJBObject est supprimée de la base de données et devient donc invalide pour le client.
Cette méthode peut jeter des « RemoveException » si la suppression s’est mal passée.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
21 22 23 24 25 26 27 28 29 30 31 32 33 

Retrouvez ci-dessous les autres sections du Laboratoire Sun
Exemples de code
JavaManipuler les looks and feel (lister et affecter)10/15/07
JavaFaire sa propre injection de dépendance avec les annotations5/9/06
JavaSplash screen avec progress Bar5/5/06
JavaFaire un splash screen en swing5/5/06

Essentiels de cours Java
JavaEJB 3 - Les Entreprise Java Bean version 3 (JavaBeans)
Cet essentiel est la suite de « Entreprise JavaBean 2.1 ». Cependant, nous allons étudier les nouvelles spécifications 3.0 qui simplifient énormément le développement par rapport aux EJB 2.6/20/06
JavaSWT - Créer des interfaces graphiques performantes
SWT (Standard Widget Toolkit) est une librairie graphique qui vous permet de réaliser des applications graphiques Java beaucoup plus avancées et surtout plus rapide à l’exécution.1/29/06
JavaStruts - Un framework MVC pour vos applications J2EE
Struts est un framework open-source qui vous permet de gagner du temps, mais qui permet aussi de voir des applications complexes comme une suite de composants de base : Vues, Actions, Modèles. Vous gagnez ainsi en évolutivité et en lisibilité du code.1/13/06
JavaHibernate - Persistance objet - relationnel
Cet essentiel explique comment utiliser Hibernate afin de gérer la persistance objet relationnel au sein de vos applications Java.12/14/05
JavaIntroduction J2EE - Applications d'entreprise
Cours d'introduction aux diverses technologies et outils que l'on peut rencontrer dans le monde du Java orienté entreprise J2EE12/14/05
JavaEJB 2 - Les Entreprise Java Bean (JavaBeans)
L'objectif avec EJB2 (Entreprise JavaBeans) est d'introduire les concepts de l’Ingénierie Logicielle Basée sur les Composants.12/14/05
JavaDesign Patern - Améliorez l'architecture de vos programmes
Afin de répondre a des situation récurrentes en programmation, les "design partern" apportent une solution type à beaucoup de contraintes liées à la programmation objet.12/14/05
JavaArchitecture J2EE - Comment organiser son application J2EE
Ce cours explique comment créer un code modulable, lisible et évolutif afin d'assurer la pérénité de son application.12/14/05
JavaLes web-services - Publication de services
Le développement tend vers les technologies du Web. Il est difficile de faire la distinction entre les différents logiciels qui sont de plus en plus intégrés au Web. Les Web Services rentrent dans l’optique de différencier bien précisément les couches.12/14/05
JavaAnt - L'automatisation des tâches du programmeur
Ecrire des scripts afin d'exécuter les tâches récurrentes10/31/05
JavaIntroduction au langage Java - Présentation & historique
Présentation des origines du langage, ainsi que se buts premiers8/11/05
JavaLa Syntaxe Java - Bases & nomenclatures
Bases de la syntaxe du langage Java8/11/05
JavaLes Classes - Concepts & héritage
Base du développement objet en Java grâce aux classes8/11/05
JavaLes Exceptions - Gestion d'erreurs
Gérer les erreurs liés à la programmation8/11/05

Articles
Eclipse Europa : le successeur de Callisto
Après Eclipse Callisto (Eclipse 3.2), la fondation Eclipse sort la nouvelle mouture d'Eclipse appelée Europa (Eclipse 3.3) faisant ainsi passer le nombre de projets embarqués de 10 à 21. Que ceux qui sont réticents aux « distributions » d'Eclipse se rassu12/21/07
JavaCruiseControl : l’outil d’intégration continue à avoir dans sa boite à outils
CruiseControl est un projet open-source offrant de multiples fonctionnalités pour l’intégration, que ce soit pour des développements Java ou .Net. Il est courant sur un projet d’être plusieurs développeurs avec des tâches de développement réparties. Dans7/2/07
JavaEJB3 - Des concepts à l'écriture du code - Editions DUNOD
Consulter le résumé du premier ouvrage du laboratoire Sun de SUPINFO : EJB3 - Des concepts à l'écriture du code. Guide du développeur, éditions DUNOD.5/27/07
JavaPassage de certification Java Web (SCWCD)
Passer une certification est toujours un moment important car cela permet de mieux faire reconnaître ses compétences face à un recruteur ou un employeur.5/12/07
JavaGoogle Web Toolkit
Google Web Toolkit est un framework java pour générer du javascript et des requêtes Ajax à partir d’un code java. Voilà comment il fonctionne.5/10/07
JavaJ2ME Vs SDE
Demain, les terminaux « légers » seront plus nombreux que les ordinateurs personnels, ce qui entraîne une bataille sur le choix d’une plateforme identique à tous ces terminaux… Aujourd’hui nous retrouvons le J2ME ainsi que le SDE qui s’offrent une rude b4/22/07

Tips du laboratoire
EclipseVisual Editor avec Eclipse Europa, c'est possible3/28/08
EclipseGérer les projets dans un workspace.10/16/07
JavaManager votre server d'application avec Eclipse4/21/07
JavaVue des sub-packages avec Eclipse4/21/07
JavaGlisser-déposer avec Eclipse4/21/07

Laboratoire SUPINFO des technologies Sun
labo-sun@supinfo.com


Conditions d'utilisation et © Copyright 2000-2006 SUPINFO Paris, Paris Academy of Computer Science
23, rue de Château Landon - 75010 PARIS - Tél : +33 (0) 153359700 Fax : +33 (0) 153359701
Respect de la vie privée