You are on page 1of 12

Le design pattern DTO

Arrivs ce point du tutoriel, la structure de notre application est dj bien avance : toutes les
fonctionnalits ne sont pas encore implmentes mais l'architecture en est clairement dfinie.

Avant d'aller plus loin dans l'implmentation des fonctionnalits, rappelons-nous que nous
dveloppons ici la partie serveur de notre application. Elle gre et traite les donnes stockes
dans la base de donnes dans le but de les envoyer ensuite au client. Et si nous ne nous
sommes pas encore proccup explicitement de cette partie client, il ne faut tout de mme pas
l'oublier.
C'est prcisment l'objet de ce chapitre : prendre en compte le fonctionnement client-serveur et
prvoir les changes de donnes qui s'effectueront entre client et serveur.

Ncessit des DTO

Actuellement, la structure de notre architecture client-serveur induit le fonctionnement suivant :


1. l'utilisateur de l'application veut se connecter et saisit son identifiant et son mot de passe
2. le client envoie ces informations au serveur et appelle le service correspondant la
gestion des utilisateurs (UserService)
3. le service fait appel au DAO correspondant (UserDAO)
4. le DAO renvoie au service l'objet User correspondant l'identifiant et au mot de passe
qu'il a reus
5. le service renvoie au client cet objet User
6. le client valide la rception de l'objet User et connecte l'utilisateur

Mistra Formation - 19 rue Branger 75003 Paris - Mtro Rpublique - 01 82 52 25 25 - contact@mistra.fr

Le design pattern DTO


Dans le droulement de ce processus, nous ne nous proccupons aucun moment du contenu
de l'objet User ni du modle de donnes en rgle gnrale.
Toutefois, la couche de persistance que nous avons implment dans le projet PGE JPA
comporte une association bidirectionnelle entre User et Event. En effet, chaque User possde
une collection d'Event et chaque Event possde un attribut User correspondant son crateur.
Donc lors de l'tape 5 ci-dessus, le service envoie au client un objet User, mais envoie en
mme temps tous les objets Event contenus dans la collection. Et comme chaque Event
possde un User, ces objets User contenus dans dans les Event sont galement envoys, et
les envois bouclent ainsi indfiniment entre les deux entits.

Pour rsoudre ce problme, il existe un design pattern nomm DTO, pour Data Transfer Object.
Il consiste crer une nouvelle reprsentation du modle de donnes, pur et pens pour le
transport des informations fournies par un DAO.

Utilisation des DTO pour l'objet User

Pour mieux comprendre, voyons tout de suite comment crer un DTO correspondant l'objet
mtier User. Nous allons donc crer un nouveau package dans notre projet, que nous
nommerons fr.mistra.pgejee.dto, qui contiendra une classe UserDTO.

Cette classe sera trs semblable la classe mtier User. Mais pour viter les envois en boucle
induits par l'association bidirectionnel User - Event, la classe UserDTO contiendra une
collection, non plus d'Events, mais des identifiants des Events que possdent la classe User.

Ainsi, UserDTO possde une collection d'entiers et non plus d'Event :


package fr.mistra.pgejee.dto;

Mistra Formation - 19 rue Branger 75003 Paris - Mtro Rpublique - 01 82 52 25 25 - contact@mistra.fr

Le design pattern DTO

import java.util.List;

public class UserDTO {


private Integer id;
private String login;
private String email;
private String pass;
private List eventList;

public UserDTO()

// Getters et setters
}

Cration d'un UserDTO partir d'un User

La cration d'un UserDTO partir d'un User donn sera confie au DAO. En effet, c'est cette
couche DAO qui extrait les informations venant de la base de donnes et qui les envoie ensuite
pour qu'elles soient transfres au client.
Dans l'interface UserDAO, nous allons donc ajouter la mthode suivante :

Mistra Formation - 19 rue Branger 75003 Paris - Mtro Rpublique - 01 82 52 25 25 - contact@mistra.fr

Le design pattern DTO


// Renvoie l'UserDTO cr partir du User pass en paramtre
public abstract UserDTO createDTO(User u);
dont l'implmentation dans la classe UserDAOHibernate est la suivante :
package fr.mistra.pgejee.dao;

import java.util.ArrayList;
import org.hibernate.Session;
import fr.mistra.pgejee.dto.UserDTO;
import fr.mistra.pgejee.utils.Factory;
import fr.mistra.pgejpa.model.Event;
import fr.mistra.pgejpa.model.User;

public class UserDAOHibernate implements UserDAO {


private Session s = null;
private EventDAO eDAO = Factory.getEventDAO();

// Renvoie l'utilisateur possdant le login pass en paramtre


public User getFromLogin(String login) {
// Voir implmentation au chapitre Gestion des utilisateurs
}

Mistra Formation - 19 rue Branger 75003 Paris - Mtro Rpublique - 01 82 52 25 25 - contact@mistra.fr

Le design pattern DTO

// Enregistre dans la base de donnes l'entit passe en paramtre


public User makePersistent(User entity) {
// Voir implmentation au chapitre Gestion des utilisateurs
}

// Renvoie l'utilisateur possdant le login et le mot de passe passs en paramtres


public User getFromLoginPassword(String login, String password) {
// Voir implmentation au chapitre Gestion des utilisateurs
}

// Renvoie l'UserDTO cr partir du User pass en paramtre


public UserDTO createDTO(User u) {
UserDTO uDTO = new UserDTO();

// Recopie des attributs "simples"


uDTO.setId(u.getId());
uDTO.setLogin(u.getLogin());
uDTO.setPass(u.getPass());
uDTO.setEmail(u.getEmail());

Mistra Formation - 19 rue Branger 75003 Paris - Mtro Rpublique - 01 82 52 25 25 - contact@mistra.fr

Le design pattern DTO

// Gestion de la collection d'Events


ArrayList idsList = new ArrayList();
if (u.getEventList() != null) {
// Rcupration de l'id de chaque vnement
for (Event e : u.getEventList())
idsList.add(e.getId());
}

// UserDTO contient une collection des ids des Events


uDTO.setEventList(idsList);

return uDTO;
}
}

Les attributs dits "simples" (id, login, mot de passe et adresse email) voient simplement leurs
valeurs recopies depuis l'User pass en paramtre.
Pour les Events, par contre, il faut creer une liste d'entiers que nous remplissons l'aide des
identifiants des Events contenus dans l'User donn en paramtre (lignes 41 45).

Mistra Formation - 19 rue Branger 75003 Paris - Mtro Rpublique - 01 82 52 25 25 - contact@mistra.fr

Le design pattern DTO


Cration d'un User partir du DTO

Puisque les changes de donnes entre client et serveur se feront dans les deux sens, nous
aurons galement besoin de la mthode inverse qui permettra, partir d'un UserDTO, de
rcuprer l'objet mtier User. L encore, c'est le DAO qui s'en charge :
package fr.mistra.pgejee.dao;

import java.util.ArrayList;
import org.hibernate.Session;
import fr.mistra.pgejee.dto.UserDTO;
import fr.mistra.pgejee.utils.Factory;
import fr.mistra.pgejpa.model.Event;
import fr.mistra.pgejpa.model.User;

public class UserDAOHibernate implements UserDAO {


private Session s = null;
private EventDAO eDAO = Factory.getEventDAO();

// Autres mthodes prcdemment implmentes...

// Renvoie l'User cr partir du UserDTO pass en paramtre

Mistra Formation - 19 rue Branger 75003 Paris - Mtro Rpublique - 01 82 52 25 25 - contact@mistra.fr

Le design pattern DTO


public User createBean(UserDTO uDTO) {
User u = new User();

// Recopie des attributs "simples"


u.setId(uDTO.getId());
u.setLogin(uDTO.getLogin());
u.setPass(uDTO.getPass());
u.setEmail(uDTO.getEmail());

// Gestion de la collection d'Events


ArrayList eventList = new ArrayList();
if (uDTO.getEventList() != null) {
// Rcupration de l'id de chaque vnement
for (Integer id : uDTO.getEventList())
eventList.add(eDAO.getFromId(id));
}

// User contient une collection d'Events


u.setEventList(eventList);

Mistra Formation - 19 rue Branger 75003 Paris - Mtro Rpublique - 01 82 52 25 25 - contact@mistra.fr

Le design pattern DTO


return u;
}
}

Le passage d'un User vers un UserDTO ncessite la rcupration d'Events partir de leur
identifiant (lignes 28 32). Ce type de rcupration est du ressort de l'EventDAO, auquel nous
allons donc ajouter une mthode getFromId :
// Renvoie l'Event dont l'id est pass en paramtre
public abstract Event getFromId(Integer id);
dont l'implmentation dans EventDAOHibernate consiste en une simple requte HQL :
// Renvoie l'Event dont l'id est pass en paramtre
public Event getFromId(Integer id) {
// Rcupration d'une session Hibernate
if(s == null)
s = HibernateUtils.getSession();

// Requte de rcupration de l'Event correspondant l'id donn


Query q = s.createQuery("from Event e where e.id=:id").setInteger("id", id);

// Rcupration et renvoi du rsultat unique


return (Event)q.uniqueResult();

Mistra Formation - 19 rue Branger 75003 Paris - Mtro Rpublique - 01 82 52 25 25 - contact@mistra.fr

Le design pattern DTO


}

Utilisation des DTOs dans UserServices

Ceci tant fait, nous pouvons maintenant modifier la classe UserService pour intgrer notre
nouveau modle DTO : les objets envoys et reus par le Service doivent dsormais tre des
UserDTO et non plus des User.
Le passage de l'un l'autre se faisant toujours par l'intermdiaire du UserDAO, la nouvelle
classe UserService est donc la suivante :
package fr.mistra.pgejee.services;

import fr.mistra.pgejee.dao.UserDAO;
import fr.mistra.pgejee.dto.UserDTO;
import fr.mistra.pgejee.utils.Factory;
import fr.mistra.pgejpa.model.User;

public class UserServices {


UserDAO uDAO = Factory.getUserDAO();

// Rcupration dun utilisateur daprs son login

Mistra Formation - 19 rue Branger 75003 Paris - Mtro Rpublique - 01 82 52 25 25 - contact@mistra.fr

Le design pattern DTO


public UserDTO getUserByLogin (String login) {
User u = uDAO.getFromLogin(login);
return uDAO.createDTO(u);
}

// Sauvegarde dun nouvel utilisateur et rcupration de l'entit persistante


public UserDTO saveUser(UserDTO entity) {
User savedUser = null;

// S'il n'existe pas dj un utilisateur possdant le mme login


if (uDAO.getFromLogin(entity.getLogin()) == null) {
// Appel la couche DAO pour rendre l'User persistant
savedUser = uDAO.makePersistent(uDAO.createBean(entity));
}

return uDAO.createDTO(savedUser);
}

// Rcupration de l'utilisateur correspondant au couple login/password donn


public UserDTO connectUser(String login, String password) {

Mistra Formation - 19 rue Branger 75003 Paris - Mtro Rpublique - 01 82 52 25 25 - contact@mistra.fr

Le design pattern DTO


User u = uDAO.getFromLoginPassword(login, password);
return uDAO.createDTO(u);
}
}

Nous comprenons maintenant l'utilit des DTO et savons les crer et les manipuler. Etudions
donc les ajouts ncessaires l'intgration des DTOs dans la dernire fonctionnalit non
modifie : l'enregistrement d'un nouvel vnement.

Mistra Formation - 19 rue Branger 75003 Paris - Mtro Rpublique - 01 82 52 25 25 - contact@mistra.fr


Powered by TCPDF (www.tcpdf.org)

You might also like