Les session beans
Transcription
Les session beans
Intérêt 1/2 • Un entity bean modélise une seule entité, et a une granularité fine ; • Un ensemble d’entity bean ⇔ au modèle statique issue du diagramme des classes d’un modèle objet ; • Les session beans servent à modéliser l’aspect dynamique, ils permettent de faire : • du suivi de session pour un client ; Les session beans • de faire interagir plusieurs entity bean ; • d’offrir des services à un client par accès direct à la base de données (exp. : obtenir une liste de produits pour un caddie virtuel). client Session bean Entity bean Base de donnée Benoît Charroux - Session Beans - Mars 00 - 2 1 Intérêt 2/2 • Les Session Beans sont utiles pour décharger le client : • de l’écriture de code supplémentaire ; • de modifications éventuelles dans le code de gestion des beans ; • d’un trafic réseau supplémentaire car : Stateless / Statefull session bean • le serveur prend à sa charge une partie du code du client ; • le nombre de connections au serveur diminuent ; • le nombre de stubs pour un client diminuent ; • leurs états ne sont pas sauvegardés. Benoît Charroux - Session Beans - Mars 00 - 3 2 Les Session Beans avec ou sans état Statefull Les Session Beans avec état Stateless MonSessionBean MonSessionBean Attribut methode methode ejbCreate( Arg arg ) ejbCreate() Un session bean avec état Un session bean sans état • Un session bean avec état : • est une extension d’un client (sa durée de vie est celle du client) ; • effectue un tâche pour un unique client en maintient un état conversationnel Pas d’argument comme la méthode create entre deux appels de méthodes ; • a souvent besoin d’être initialisé ; • est souvent utilisé pour faire du suivi de session pour un client. Fait pour assurer le suivi de la session d’un client. Collection de méthodes indépendantes assurant des services pour un client. Benoît Charroux - Session Beans - Mars 00 - 5 Benoît Charroux - Session Beans - Mars 00 - 6 3 Les Session Beans sans état • un session bean sans état : • a un ensemble de méthodes qui utilisent leurs seuls paramètres pour produire un résultat (ils peuvent aussi utiliser leurs SessionContexts) ; • peut être utilisé par plusieurs clients ; • sa durée de vie peut dépasser celle d’un client : un client peut conserver une connexion avec un objet EJB mais l’instance du bean peut servir plusieurs clients ; Développer un stateless session bean • peut avoir des variables d’instance par exemple pour déterminer le nombre de fois où il a été appelé ou pour le débogage (cet état n’est jamais visible pour le client car il ne sait jamais s’il a affaire à la même instance) ; • il consomme peu de ressource. Benoît Charroux - Session Beans - Mars 00 - 7 4 Développer un session bean 1/2 Les interfaces locales et distantes 2/2 -DYDLR6HULDOL]DEOH • La classe qui définit un session bean doit : -DYD[HME(QWHUSULVH%HDQ • L’interface locale est utilisée par le client pour récupérer une référence sur un objet EJB distant (sur le serveur) : • la méthode create() retourne au client une référence distance et un stub. • implémenter l’interface SessionBean ; • être déclarée public ; • ne peut pas être définie abstract ou final ; • implémenter une ou plusieurs méthodes ejbCreate ; • a un constructeur public sans paramètres ; • ne doit pas définir une méthode finalize. -DYDUPL5HPRWH -DYD[HME6HVVLRQ%HDQ HME$FWLYDWH -DYD[HME(-%2EMHFW -DYD[HME(-%+RPH 0RQ,QWHUIDFH'LVWDQWH 0RQ,QWHUIDFH/RFDOH PHWKRGH 0RQ,QWHUIDFH'LVWDQWH FUHDWH$UJDUJ HME3DVVLYDWH HME5HPRYH VHW6HVVLRQ&RQWH[W MonSessionBean methode ejbCreate( Arg arg ) Benoît Charroux - Session Beans - Mars 00 - 9 Fonctionnalités du composant Cycle de vie du composant : création, recherche, suppression. Benoît Charroux - Session Beans - Mars 00 - 10 5 Exemple d’un bean créant une oeuvre diffusée à plusieurs exemplaires public class MediathequeEJB implements SessionBean { public void addOeuvre( String titre, String auteur, int nbExemplaires ) throws ...{ try { Context initial = new InitialContext(); Object objref = initial.lookup( "Oeuvre" ); OeuvreHome homeOeuvre = ...narrow( ... ) ; Oeuvre oeuvre = homeOeuvre.create( titre, auteur ) ; objref = initial.lookup( "Exemplaire" ); ExemplaireHome homeExemplaire = ...narrow( ... ) ; Exemplaire exemplaire ; for( int i=0; i<nbExemplaires; i++ ){ exemplaire = homeExemplaire.create( titre, auteur, i ) ; oeuvre.addExemplaire( exemplaire ) ; } }catch( DuplicateKeyException e ){ throw new OeuvreException( "oeuvre deja presente" ) ; }catch( Exception e ){ throw new EJBException( e.toString() ) ; } } Benoît Charroux - Session Beans - Mars 00 - 11 Les interfaces locales et distantes • L’interface local : public interface MediathequeHome extends EJBHome { Mediatheque create() throws RemoteException, CreateException ; } • L’interface distante : public interface Mediatheque extends EJBObject { public void addOeuvre( String titre, String auteur, int nbExemplaires ) throws RemoteException, OeuvreException ; } • Exemple d’utilisation : Context initial = new InitialContext(); Object objref = initial.lookup( "Mediatheque" ); MediathequeHome home = (MediathequeHome)PortableRemoteObject.narrow( objref, MediathequeHome.class ) ; Mediatheque mediatheque = home.create() ; mediatheque.addOeuvre( "Don Juan", "Mozart", 3 ) ; Benoît Charroux - Session Beans - Mars 00 - 12 6 Exemple d’un bean récupérant la liste des adhérents 1/2 public class UtilitairesEJB implements SessionBean { Développer un stateless session bean accédant directement à une base de données public Vector getAdherents(){ try{ InitialContext ic = new InitialContext(); DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/MediaDB"); Connection con = ds.getConnection(); String requete = "SELECT ALL * FROM \"AdherentEJBTable\"" ; Statement stmt = con.createStatement() ; ResultSet result = stmt.executeQuery( requete ) ; Vector adherents = new Vector() ; while( result.next() ){ adherents.addElement( result.getString("nom") ) ; } stmt.close() ; con.close() ; return adherents ; } catch( Exception e ){ throw new EJBException( e.getMessage() ) ; } } Benoît Charroux - Session Beans - Mars 00 - 14 7 Exemple d’un bean récupérant la liste des adhérents 2/2 Les interfaces locales et distantes • L’interface local : public class UtilitairesEJB implements SessionBean { // … public interface UtilitairesHome extends EJBHome { Utilitaires create() throws RemoteException, CreateException ; } • L’interface distante : public void ejbCreate() {} public void ejbRemove() {} public void ejbActivate() {} public void ejbPassivate() {} public void setSessionContext(SessionContext sc) {} public UtilitairesEJB() {} } Benoît Charroux - Session Beans - Mars 00 - 15 public interface Utilitaires extends EJBObject { public Vector getAdherents() throws RemoteException ; } • Exemple d’utilisation : Context initial = new InitialContext(); Object objref = initial.lookup( "Utilitaires" ); UtilitairesHome home = (UtilitairesHome)PortableRemoteObject.narrow ... Utilitaires utilitaires = home.create() ; Vector adherents = utilitaires.getAdherents() ; for( int i=0; i<adherents.size(); i++ ){ System.out.println((String)adherents.elementAt(i)); } Benoît Charroux - Session Beans - Mars 00 - 16 8 Le déploiement d’un sesssion bean (avec deploytool de j2ee) 1/2 Déployer un stateless session bean accédant à une base de données Benoît Charroux - Session Beans - Mars 00 - 18 9 Le déploiement d’un entity bean (avec deploytool de j2ee) 2/2 Le cycle de vie des session beans Benoît Charroux - Session Beans - Mars 00 - 19 10 L’utilisation d’un stateless session bean Le cycle de vie d’un session Bean • Le cycle de vie d’un session bean est géré par le conteneur et non pas par l’application. Cycle de vie d’un stateless session bean Benoît Charroux - Session Beans - Mars 00 - 21 Benoît Charroux - Session Beans - Mars 00 - 22 11 Le cycle de vie d’un session Bean Création et suppression d’un stateful session bean Cycle de vie d’un stateful session bean Benoît Charroux - Session Beans - Mars 00 - 23 Benoît Charroux - Session Beans - Mars 00 - 24 12 Activation d’un stateful session bean Utilitaires Benoît Charroux - Session Beans - Mars 00 - 25 13 Obtenir une référence sur un session bean • this ne peut pas être utilisée car le bean est distant ; Accéder à une variable d’environnement • Les variables d’environnement sont utiles pour adapter un composant sans avoir à toucher au code : • utiliser getEJBObject() : public class EJB implements SessionBean{ Context initial = new InitialContext() ; SessionContext context ; public void setSessionContext( SessionContext context ){ this.context = context ; Context env = (Context)initial.lookup( "java:comp/env" ) ; Double var = (Double)env.lookup( "remise" ) ; } public void methode( Bean bean ){ bean.f( context.getEJBObject() ) ; } } Benoît Charroux - Session Beans - Mars 00 - 27 Benoît Charroux - Session Beans - Mars 00 - 28 14