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.3.Spécifications d’un Session Bean

Les spécifications au niveau du code sont les mêmes entre un stateless et un stateful. Seul le descripteur de déploiement différe quelque peu.

4.3.1.Classe du Bean

La classe du session bean dans cet exemple se nomme CartBean. Comme chaque session bean, la classe CartBean doit répondre à ces conditions :
  • Elle implémente l’interface SessionBean
  • La classe est déclarée public
  • Elle ne peut être abstract ou final
  • Elle implémente une ou plusieurs méthodes ejbCreate()
  • Elle implémente les méthodes métiers
  • Elle contient un constructeur public sans paramètre
  • Elle ne doit pas définir de méthode finalize()

4.3.2.L’interface SessionBean

L'interface SessionBean hérite de l'interface EnterpriseBean, qui hérite également de l'interface Serializable. L'interface SessionBean déclare les méthodes ejbRemove(), ejbActivate(), ejbPassivate(), et setSessionContext(). La classe CartBean n’utilise pas ces méthodes, mais elle doit les implémenter parce qu’elles sont déclarées dans l'interface SessionBean. En conséquence, ces méthodes sont vides dans la classe CartBean.

4.3.3.Les méthodes ejbCreate

Puisqu’un enterprise bean s’exécute dans un conteneur d’EJB, un client ne peut instancier directement le bean. Seul le conteneur peut instancier un enterprise bean. Durant l’instantiation, le programme en exemple effectue les étapes suivantes :
  1. Le client appelle la méthode create() sur l’objet home :Cart shoppingCart = home.create("Duke DeEarl", "123");
  2. Le conteneur d’EJB instancie l’enterprise bean
  3. Le conteneur appelle la méthode ejbCreate() adéquate de CartBean

Typiquement, une méthode ejbCreate() initialise l’état de l’enterprise bean. La méthode ejbCreate() précédente, par exemple, initialise les variables customerName et customerId via les arguments passés en paramètre à la méthode create().

Un enterprise bean doit avoir une ou plusieurs méthodes ejbCreate(). Les signatures de ces méthodes doit répondre aux conditions suivantes :
  • Le modificateur d’accès doit être public.
  • Le type retourné doit être void.
  • Si le bean permet un accès distant, les arguments doivent avoir un type adéquat à l’API Java Remote Method Invocation (« Java RMI »).
  • Le modificateur ne peut être static ou final.

La clause throws peut inclure javax.ejb.CreateException et d’autres exceptions spécifiques à votre application. La méthode ejbCreate() génère habituellement une CreateException si un paramètre entré est invalide.

4.3.4.Méthodes métiers

Le but premier d’un session bean est d’exécuter les tâches métiers pour le client. Le client appelle les méthodes métiers sur la référence de l’objet distant qui est retourné par la méthode create(). Du point de vue du client, les méthodes métiers semblent êtres exécutés localement, mais elles sont réellement exécutées à distance sur le session bean. L’extrait de code suivant montre comment le programme CartClient appelle les méthodes métiers :

Cart shoppingCart = home.create("Duke DeEarl", "123");
shoppingCart.addBook("The Martian Chronicles");
shoppingCart.addBook("2001 A Space Odyssey");
shoppingCart.addBook("The Left Hand of Darkness");
Vector bookList = new Vector();
bookList = shoppingCart.getContents();

La classe CartBean implémente les méthodes métiers dans le code suivant :

public void addBook(String title) {
contents.addElement(title);
}

public void removeBook(String title) throws BookException {
boolean result = contents.removeElement(title);

if (result == false) {
throw new BookException(title + " not in cart.");
}
}

public Vector getContents() {
return contents;
}

La signature des méthodes métiers doit ête conforme aux règles suivantes :
  • Le nom de la méthode ne doit pas entrer en conflit avec un nom de méthode défini par l’architecture EJB. Par exemple, vous ne pouvez appeler une méthode métier ejbCreate() ou ejbActivate().
  • Le modificateur d’accès doit être public.
  • Si le bean permet un accès distant, les arguments doivent avoir un type adéquat à l’API Java Remote Method Invocation (« Java RMI »).
  • Le modificateur ne peut être static ou final.

La clause throws peut inclure les exceptions que vous définissez pour votre application. La méthode removeBook(), par exemple, génère une BookException si le livre n’est pas dans le caddie.

Pour indiquer un problème au niveau du système, tel que l’impossibilité de se connecter à une base de données, une méthode métier dévrait générer un javax.ejb.EJBException. Quand une méthode métier lève une EJBException, le conteneur l'enveloppe dans une RemoteException, qui est attrapée par le client. Le conteneur n’enveloppera pas les exceptions spécifiques à l’application telles que BookException. Puisqu'EJBException est une sous-classe de RuntimeException, vous n'avez pas besoin de l'inclure dans la clause throws de la méthode métier.

4.3.5.Interfaces

        1. Home interface

Une home interface hérite de l'interface javax.ejb.EJBHome. Pour un session bean, le but de la home interface est de définir les méthodes create() qu'un client distant peut appeler. Le programme CartClient, par exemple, appelle cette méthode create() :

Cart shoppingCart = home.create("Duke DeEarl", "123");

Chaque méthode create() dans la home interface correspond à une méthode ejbCreate() dans la classe du bean. Voici les signatures des méthodes ejbCreate() dans la classe CartBean :

public void ejbCreate(String person) throws CreateException

public void ejbCreate(String person, String id) throws CreateException

Comparez les signatures des méthodes ejbCreate() à celles des méthodes create() dans l'interface CartHome :

Cart create(String person) throws RemoteException, CreateException;
Cart create(String person, String id) throws RemoteException, CreateException;

Les signatures des méthodes ejbCreate() et create() sont similaires mais comportent des diffèrences. Voici les règles pour définir les signatures des méthodes create() de la home interface :
  • Le nombre et les types d'arguments dans une méthode create() doivent correspondre à ceux de sa méthode ejbCreate() correspondante.
  • Les arguments et le type de retour de la méthode create() doivent être les types RMI valides.
  • Une méthode create() retourne le type d'interface distante de l'enterprise bean (mais une méthode ejbCreate() renvoie void).
  • La clause throws de la méthode create() doit inclure java.rmi.RemoteException et javax.ejb.CreateException.

        1. Remote interface

L'interface distante, qui hérite javax.ejb.EJBObject, définit les méthodes métiers qu'un client distant peut appeler.

Les définitions de méthodes dans la remote interface doivent suivre ces règles :
  • Chaque méthode de la remote interface doit correspondre à une méthode implémentée dans la classe de l’enterprise bean.
  • Les signatures des méthodes dans la remote interface doivent être identiques aux signatures des méthodes correspondantes dans la classe du bean.
  • Les arguments et les valeurs de retour doivent être d’un type valide pour RMI.
  • La clause throws doit inclure java.rmi.RemoteException.

4.3.6.Les classes Helper

Le session bean CartEJB possède deux classes helper : BookException et IdVerifier. La BookException est générée par la méthode removeBook() et IdVerifier valide le customerId dans l’une des méthodes ejbCreate(). Les classes helper doivent résider dans le fichier EJB JAR qui contient les classes de l’enterprise bean.

4.3.7.Descripteur de déploiement

Voici un exemple de descripteur de déploiement pour un EJB Session Bean :


<?xml version="1.0"?>

<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise
JavaBeans 1.1//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd">
<ejb-jar>
<enterprise-beans>
<session>
<ejb-name>TravelAgentEJB</ejb-name>
<home>com.titan.travelagent.TravelAgentHomeRemote</home>
<remote>com.titan.travelagent.TravelAgentRemote</remote>
<ejb-class>com.titan.travelagent.TravelAgentBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<ejb-ref>
<ejb-ref-name>ejb/CabinHome</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
<home>com.titan.cabin.CabinHomeRemote</home>
<remote>com.titan.cabin.CabinRemote</remote>
</ejb-ref>
</session>
</enterprise-beans>
<assembly-descriptor>
...
</assembly-descriptor>
</ejb-jar>


La différence entre un stateless et un stateful SessionBean n’est lié qu’à la balise : « session-type ». Cette balise prend comme valeur : Stateless ou Stateful en fonction du type de l’EJB.

Les session bean étant très souvent utilisés en tant que façade pour le management des données, il nous faut établire des références entre les Beans. Cette référence se fait par la balise : ejb-ref qui regroupe l’ensemble des informations d’une référence.
  • ejb-ref : section pour une référence
    • ejb-ref-name : nom JNDI de la référence
    • ejb-ref-type : type du bean référencé
    • home : classe Home du bean référencé
    • remote : classe Remote du bean référencé

4.3.8.Cycle de vie

Le cycle de vie différe suivant que l’on se trouve avec un stateful ou un stateless Session Bean. En effet, le stateful gardant un état de semi-persistance.
        1. Stateless

Puisqu’un stateless session bean n’est jamais « passivé », son cycle de vie n’a que deux états : « n’existe pas » et « prêt » pour l’appel de méthodes métiers.


Cycle de vie d’un Stateless Session Bean

        1. Stateful

Le schéma ci-dessous illustre les étapes par lesquelles passe un session bean durant sa vie. Le client initialise le cycle de vie en faisant appel à la méthode create(). Le conteneur d’EJB instancie le bean et appelle ensuite les méthodes setSessionContext() et ejbCreate() du session bean. Le bean est alors « prêt » pour l’appel de ses méthodes métiers.


Cycle de vie d’un Stateful Session Bean

A l'étape ready, le conteneur d'EJB peut décider de désactiver, ou passivate, le bean en le déplaçant de la mémoire vers un stockage secondaire. Typiquement, le conteneur d'EJB utilise un algorithme pour choisir le bean le moins récemment utilisé pour la passivation. Le conteneur d'EJB appelle la méthode ejbPassivate() du bean juste avant la passivation. Si un client appelle une méthode métier sur le bean alors qu'il est à l'étape passive, le conteneur d'EJB active le bean, appelant sa méthode ejbActivate() et le déplace à l'étape ready.

À la fin du cycle de vie, le client appelle la méthode remove() et le conteneur d’EJB appelle la méthode ejbRemove() du bean. L'instance du bean est prête à être supprimée par le Garbage Collector.

Au niveau de l’application cliente, votre code contrôle seulement l'invocation de deux méthodes du cycle de vie : les méthodes create() et remove(). Toutes les autres méthodes du schéma 1-4 sont appelées par le conteneur d’EJB. La méthode ejbCreate(), par exemple, à l'intérieur de la classe du bean, vous permet d'effectuer certaines opérations juste après que le bean ait été initialisé. Éventuellement, vous pourriez (par exemple) avoir envie de vous connecter à une base de données dans la méthode ejbCreate().

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 SUPINFO International University
23, rue de Château Landon - 75010 PARIS - Tél : +33 (0) 153359700 Fax : +33 (0) 153359701
Respect de la vie privée