IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Design patterns > Transfer Object
        Qu'est ce que le pattern Transfer Object?

rechercher
precedent    sommaire       telecharger


Qu'est ce que le pattern Transfer Object?
auteur : request
Le pattern transfer Object précédemment appelé Value Object est une classe implémentant l'interface Serializable.
Ce pattern est essentiellement utilisé pour échanger des données entre une application cliente et des EJB de type Entity (EntityBean).

Pourquoi me direz-vous?

Tout simplement parce que, comme vous le savez, les EntityBean comme tous les EJB sont des objets distants, ce qui induit, pour chaque accès à celui-ci, un aller-retour à travers le réseau, avec en plus démarrage/validation de transactions.
Par exemple, pour lire un objet Personne avec 5 attributs, il vous faudra 6 allers-retours pour récupérer vos informations (1 findByPrimaryKey + 5 lectures d'attribut).

C'est pour cette raison que les Transfer Object sont là.
les EntityBean ne sont là que pour être utilisé sur le serveur EJB (dans les EJB 2.0, ils sont maintenant "local", ils ne peuvent pas être accessible de l'exterieur). L'idée est de fournir un service avec des EJB stateless qui vont vous fournir les service qui vous intéressent (Lecture/création/modification/suppression ... d'un objet). Cet EJB utilise des Entity en interne pour faire les opérations, et créer des classes de transport (avec uniquement les attributs + get/set), cette classe doit implémenter Serializable pour pouvoir passer sur RMI/IIOP. C'est cette classe que l'on appelle Transfer Object

L'avantage de ce modèle, c'est avoir une programmation distante (N tiers) avec le transit de veritables objets que vous allez pouvoir manipuler puis renvoyer au serveur pour modification... .

Voici un petit exemple qui venir étayer la partie théorique.

Entity Bean
L'interface Home
package com.societe.monserveur; 

import javax.ejb.EJBLocalObject; 

/** 
 * Classe d'accès à une entité. 
 * L'accès est local, cette classe n'est pas accessible depuis l'exterieur. 
 */ 
public interface PersonneEJBCMP 
    extends EJBLocalObject { 
  public java.lang.Integer getCodePersonne(); 

  public java.lang.String getNom(); 

  public void setNom(java.lang.String nom); 
}
L'interface Local
package com.societe.monserveur; 

import javax.ejb.CreateException; 
import javax.ejb.EJBLocalHome; 
import javax.ejb.FinderException; 

/** 
 * Home (Factory) de l' Entité CMP 
 */ 
public interface PersonneEJBCMPHome 
    extends EJBLocalHome { 
  public PersonneEJBCMP create(java.lang.Integer codePersonne) throws 
      CreateException; 

  public PersonneEJBCMP create(java.lang.Integer codePersonne, 
                               java.lang.String nom) throws CreateException; 

  public PersonneEJBCMP findByPrimaryKey(java.lang.Integer codePersonne) throws 
      FinderException; 
}
Le Bean
package com.societe.monserveur; 

import javax.ejb.CreateException; 
import javax.ejb.EntityBean; 
import javax.ejb.EntityContext; 
import javax.ejb.RemoveException; 

/** 
 * Implémentation de l'entité CMP 
 */ 
public abstract class PersonneEJBCMPBean 
    implements EntityBean { 
  EntityContext entityContext; 
  public abstract java.lang.Integer getCodePersonne(); 

  public abstract void setCodePersonne(java.lang.Integer codePersonne); 

  public abstract java.lang.String getNom(); 

  public abstract void setNom(java.lang.String nom); 

  public java.lang.Integer ejbCreate(java.lang.Integer codePersonne) throws 
      CreateException { 
    setCodePersonne(codePersonne); 
    return null; 
  } 

  public java.lang.Integer ejbCreate(java.lang.Integer codePersonne, 
                                     java.lang.String nom) throws 
      CreateException { 
    setCodePersonne(codePersonne); 
    setNom(nom); 
    return null; 
  } 

  public void ejbPostCreate(java.lang.Integer codePersonne) throws 
      CreateException { 
  } 

  public void ejbPostCreate(java.lang.Integer codePersonne, 
                            java.lang.String nom, java.lang.String prenom, 
                            java.lang.Integer age, 
                            java.lang.Integer codeEntreprise) throws 
      CreateException { 
  } 

  public void ejbLoad() { 
  } 

  public void ejbStore() { 
  } 

  public void ejbRemove() throws RemoveException { 
  } 

  public void ejbActivate() { 
  } 

  public void ejbPassivate() { 
  } 

  public void setEntityContext(EntityContext entityContext) { 
    this.entityContext = entityContext; 
  } 

  public void unsetEntityContext() { 
    this.entityContext = null; 
  } 
}
Le SessionBean
L'interface Home
package com.societe.monserveur; 

import java.rmi.RemoteException; 
import javax.ejb.CreateException; 
import javax.ejb.EJBHome; 

public interface PersonneEJBFacadeHome 
    extends EJBHome { 
  public PersonneEJBFacade create() throws RemoteException, CreateException; 
}
L'interface Remote
package com.societe.monserveur; 

import java.rmi.RemoteException; 
import javax.ejb.EJBObject; 

public interface PersonneEJBFacade 
    extends EJBObject { 
  public void insert(Personne obj) throws RemoteException; 

  public void update(Personne obj) throws RemoteException; 

  public void delete(Personne obj) throws RemoteException; 

  public Personne findObject(Integer codePersonne) throws RemoteException; 
}
Le Bean
package com.societe.monserveur; 

import javax.ejb.EJBException; 
import javax.ejb.SessionBean; 
import javax.ejb.SessionContext; 
import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 

public class PersonneEJBFacadeBean 
    implements SessionBean { 
  private SessionContext sessionContext; 
  public void ejbCreate() { 
  } 

  public void ejbRemove() { 
  } 

  public void ejbActivate() { 
  } 

  public void ejbPassivate() { 
  } 

  public void setSessionContext(SessionContext sessionContext) { 
    this.sessionContext = sessionContext; 
  } 

  public void insert(Personne obj) { 
    try { 
      getCMPHome().create(obj.getCodePersonne(), 
                          obj.getNom()); 
    } 
    catch (Exception ex) { 
      throw new EJBException(ex); 
    } 
  } 

  public void update(Personne obj) { 
    try { 
      PersonneEJBCMP personneEJBCMP = getCMPHome().findByPrimaryKey(obj. 
          getCodePersonne()); 
      personneEJBCMP.setNom(obj.getNom()); 
    } 
    catch (Exception ex) { 
      throw new EJBException(ex); 
    } 
  } 

  public void delete(Personne obj) { 
    try { 
      getCMPHome().remove(obj.getCodePersonne()); 
    } 
    catch (Exception ex) { 
      throw new EJBException(ex); 
    } 
  } 

  public Personne findObject(Integer codePersonne) { 
    try { 
      PersonneEJBCMP personneEJBCMP = getCMPHome().findByPrimaryKey( 
          codePersonne); 
      Personne obj = new Personne(personneEJBCMP.getCodePersonne(), 
                                  personneEJBCMP.getNom()); 
      return obj; 
    } 
    catch (Exception ex) { 
      throw new EJBException(ex); 
    } 
  } 

  public static PersonneEJBCMPHome getCMPHome() throws NamingException { 
    Context ctx = new InitialContext(); 
    PersonneEJBCMPHome personneEJBCMPHome = (PersonneEJBCMPHome) ctx.lookup( 
        "com/societe/monserveur/PersonneEJBCMP"); 
    return personneEJBCMPHome; 
  } 

}
Le Transfer Object
package com.societe.monserveur; 

import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.rmi.PortableRemoteObject; 

/** 
 * Value Object Personne 
 */ 
public class Personne implements java.io.Serializable { 
  private Integer codePersonne; 
  private String nom; 

  /** Constructeur sans argument */ 
  public Personne() { 
    super(); 
  } 

  /** 
   * Constructeur avec arguments 
   */ 
  public Personne(Integer codePersonne, String nom) { 
    this.codePersonne = codePersonne; 
    this.nom = nom; 
  } 

  /** 
   * Rechercher un objet à partir de son identifiant 
   * @return L'objet touvé 
   */ 
  public static Personne findObject(Integer codePersonne) throws Exception { 
    return getFacade().findObject(codePersonne); 
  } 

  /** Insertion de l'objet dans la base */ 
  public void insert() throws Exception { 
    getFacade().insert(this); 
  } 

  /** Modification de l'objet dans la base */ 
  public void update() throws Exception { 
    getFacade().update(this); 
  } 

  /** Suppression de l'objet dans la base */ 
  public void delete() throws Exception { 
    getFacade().delete(this); 
  } 

  /** 
   * Geter / Seter 
   */ 
  public Integer getCodePersonne() { 
    return codePersonne; 
  } 

  public void setCodePersonne(Integer codePersonne) throws Exception { 
    this.codePersonne = codePersonne; 
  } 

  public String getNom() { 
    return nom; 
  } 

  public void setNom(String nom) throws Exception { 
    this.nom = nom; 
  } 

  /** 
   * Récupération de l'EJB facade 
   * @return la facade 
   */ 
  private static PersonneEJBFacade getFacade() throws Exception { 
    Context ctx = new InitialContext(); 
    Object ref = ctx.lookup("com/societe/monserveur/PersonneEJBFacade"); 
    PersonneEJBFacadeHome personneEJBFacadeHome = (PersonneEJBFacadeHome) 
        PortableRemoteObject.narrow(ref, PersonneEJBFacadeHome.class); 
    return personneEJBFacadeHome.create(); 
  } 

}
Et enfin le Client
package com.societe.monclient; 

import com.societe.monserveur.Personne; 

public class Test { 
  public static void main(String[] args) throws Exception { 
    //Création de toto 
    Personne toto = new Personne(new Integer(1), "Toto"); 
    toto.insert(); 

    //Modification de toto 
    toto.setNom("Titi"); 
    toto.update(); 

    //Suppression de toto 
    toto.delete(); 

    //Récupération d'une autre personne 
    Personne autre = Personne.findObject(new Integer(99)); 
  } 
}
L'avantage avec cette solution (EJB + VO) c'est que l'accès et les régles de gestion sont centralisés sur un seul serveur. Si une autre application (back office) ou un autre serveur web, veut accèder à la même information, il pourra réutiliser tout cela.


rechercher
precedent    sommaire       telecharger

Consultez les autres F.A.Q's

Valid XHTML 1.1!Valid CSS!


Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2004 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.