Vous êtes sur la page 1sur 13

Cycle de Formations

Technologique
avances :
Framework : Spring

M. Belhassen OUESLATI
Ingnieur Java/J2EE

Travaux pratique TP N4
Passage vers Spring

Objectifs
Dvelopper un premier exemple de composants lis
Dtecter le besoin d'Ioc

Pr-requis
TP N2 : HIBERNATE : RECHERCHE DUN OBJECT DANS LA SESSION

Belhassen.oueslati@gmail.com

Passage vers Spring


Page 1

1. Cas pratique : Gestion des contacts (cahier technique)


1.1

Sujet
Le but de cet exercice est de crer une application permettant de grer une
liste de contacts.
On doit pouvoir lister, ajouter, supprimer, modifier, rechercher ces contacts.

1.2 Analyse
Dans un premier temps, avant lcriture des premires lignes de codes, nous
allons dfinir les entits et les fonctionnalits requises pour notre application.
1.2.1 Dfinition des entits
Daprs le sujet, on a besoin de "grer une liste de contacts".
Cela signifie donc que lon doit crer une classe Contact qui aura pour
attributs toutes les informations dun contact : nom, prnom,
1.2.2 Dfinition des fonctionnalits
On a besoin dajouter, lister, supprimer nos contacts.
Cas dutilisation Ajouter un contact
1. Entre des informations du contact.
2. Validation des entres.
a. Vrification de la conformit des informations (nom, prnom, ).
i. Si les donnes sont conformes, le programme ajoute le contact et
indique un message positif au client.
ii. Si les donnes ne sont pas conformes, le programme renvoie une
erreur lutilisateur.

Belhassen.oueslati@gmail.com

Passage vers Spring


Page 2

Cas dutilisation Lister les contacts


1. Rcupration de lensemble des informations du support de stockage.
a. Si la rcupration sest bien passe :
i. Sil existe au moins un contact dans le support de stockage, le
programme affiche la liste des contacts (nom, prnom, adresse,
email).
ii. Sil nexiste aucun contact dans la base de donnes, le programme
affiche un message indiquant quaucun contact na t trouv.
b. Si la rcupration sest mal passe, le programme renvoie au client un
message derreur logicielle.

Cas dutilisation Supprimer un contact


1. Liste des contacts affiche dans la console avec le numro Id
correspondant.
2. Choix du numro Id du contact supprimer.
3. Le programme vrifie que le contact existe bien :
o Si le contact existe bien, le programme tente de supprimer le contact
demand :
Si la suppression a chou, le programme renvoie lutilisateur
une erreur lui indiquant une erreur logicielle.
Si la suppression a russi, le programme renvoie lutilisateur un
message de confirmation de suppression du contact.
o Si le contact nexiste pas, le programme renvoie un message indiquant
labsence de ce contact dans le support de stockage.

Belhassen.oueslati@gmail.com

Passage vers Spring


Page 3

2. Architecture technique
Nous allons sparer au maximum les diffrents types de traitement de
lapplication en tenant compte des explications du cours (Prsentation,
mtiers/Service, Dao, Persistance).
2.1 Table contact
Table contact
CREATE TABLE "DEV"."CONTACT"
(
"NUM_MAT_CNT" VARCHAR2(10 BYTE) NOT NULL ENABLE,
"NOM_NOM_CNT" VARCHAR2(120 BYTE) NOT NULL ENABLE,
"NOM_PRN_CNT" VARCHAR2(120 BYTE) NOT NULL ENABLE,
"NUM_GSM_CNT" VARCHAR2(8 BYTE) NOT NULL ENABLE,
"ADR_EMAIL_CNT" VARCHAR2(120 BYTE) NOT NULL ENABLE,
CONSTRAINT "CONTACT__PK" PRIMARY KEY ("NUM_MAT_CNT") ENABLE
);

2.2 Nouveau projet de type Dynamic Web : TP_SPRING


Crer un nouveau projet de type dynamic web qui porte le nom : TP_SPRING
2.3 Configuration de la connexion
Voir TP N2
2.4 Couche Objets persistance : Classe Contact
Cette couche est compose d'objets Java simples qui reprsentent les
donnes persistantes de l'application comme par exemple un client ou une
facture.
Pour cette partie, nous utilisons la technologie Hibernate qui va permettre de
mapper ces objets avec la base de donnes.
Nous y ajoutons la classe Contact avec, pour variables dinstances :
o String nomNomCnt;
o String nomPrnCnt;
o .

Ces variables doivent videmment tre dclares en prives et des


getter/setter sont implments.
Belhassen.oueslati@gmail.com

Passage vers Spring


Page 4

Implmentation de la classe persistante Contact

Utiliser la mthode de gnration de code avec la perspective Hibernate (Voir TP N2)


package com.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "CONTACT")
public class Contact implements java.io.Serializable {

private String numMatCnt;


private String nomNomCnt;
private String nomPrnCnt;
private String numGsmCnt;
private String adrEmailCnt;
public Contact() {
}
public Contact(String numMatCnt, String nomNomCnt, String nomPrnCnt,
String numGsmCnt, String adrEmailCnt) {
this.numMatCnt = numMatCnt;
this.nomNomCnt = nomNomCnt;
this.nomPrnCnt = nomPrnCnt;
this.numGsmCnt = numGsmCnt;
this.adrEmailCnt = adrEmailCnt;
}
+ getter/setter
}

Note : Hibernate permet une certaine indpendance vis vis du SGBD qu'on
souhaite utiliser avec l'application dveloppe.

Belhassen.oueslati@gmail.com

Passage vers Spring


Page 5

2.5 Couche Dao : Classe ContactDaoImp


Cette couche a pour objectif d'encapsuler et d'abstraire l'accs aux donnes.
Concrtement, les dveloppeurs vont utiliser cette couche pour rcuprer,
mettre jour, supprimer ou insrer des nouvelles donnes. L'utilit de cette
couche est que le dveloppeur va utiliser des fonctions simples qui vont
masquer toute la complexit sous jacente.
Le dveloppeur utilisateur de ces fonctions n'aura mme pas connaitre les
dtails de l'implmentation, il ne saura mme pas si la technologie utilise est
Hibernate, SQL ou EJB3. Il ne verra que de simples fonctions Java.
Nous ajoutons par ailleurs linterface GenericDao
Interface GenericDao
package com.dao;
import java.io.Serializable;
import java.util.List;
import org.hibernate.criterion.Criterion;
public interface GenericDao {
public void saveOrUpdate(Object entity);
public void delete(Object entity);
public List<Object> findAll(Class clazz);
public List findByCriteria(Class clazz, Criterion critere);
public Object findById(Class clazz, Serializable id);
}

Belhassen.oueslati@gmail.com

Passage vers Spring


Page 6

Nous ajoutons par ailleurs la classe GenericDaoImp


Implmentation de linterface GenericDao
package com.dao.impl;
// import
public class GenericDaoImpl implements GenericDao {
private Session hibernateSession;
private Transaction tx;
public GenericDaoImpl() {
hibernateSession = HibernateUtil.currentSession();
}
@Override
public void saveOrUpdate(Object entity) {
try {
startOperation();
hibernateSession.saveOrUpdate(entity);
tx.commit();
} catch (HibernateException e) {
handleException(e);
} finally {
hibernateSession.close();
}
}
@Override
public void delete(Object entity) {
try {
startOperation();
hibernateSession.delete(entity);
tx.commit();
} catch (HibernateException e) {
handleException(e);
} finally {
hibernateSession.close();
}
}
@Override
public List<Object> findAll(Class clazz) {
List objects = null;
try {
startOperation();
Query query = hibernateSession.createQuery("from "
+ clazz.getName());
Belhassen.oueslati@gmail.com

Passage vers Spring


Page 7

objects = query.list();
} catch (HibernateException e) {
handleException(e);
} finally {
hibernateSession.close();
}
return objects;
}
@Override
public List findByCriteria(Class clazz, Criterion critere) {
List objects = null;
try {
startOperation();
Criteria crit = hibernateSession.createCriteria(clazz).add(critere);
objects = crit.list();
} catch (HibernateException e) {
handleException(e);
} finally {
hibernateSession.close();
}
return objects;
}
@Override
public Object findById(Class clazz, Serializable id) {
Object obj = null;
try {
startOperation();
obj = hibernateSession.load(clazz, id);
} catch (HibernateException e) {
handleException(e);
} finally {
hibernateSession.close();
}
return obj;
}
protected void startOperation() throws HibernateException {
hibernateSession = HibernateUtil.currentSession();
tx = hibernateSession.beginTransaction();
}
protected void handleException(HibernateException e)
throws DataAccessLayerException {
tx.rollback();
throw new DataAccessLayerException(e);
}
}
Belhassen.oueslati@gmail.com

Passage vers Spring


Page 8

Classe DataAccessLayerException
package com.dao.impl;
public class DataAccessLayerException extends RuntimeException {
public DataAccessLayerException() {
}
public DataAccessLayerException(String message) {
super(message);
}
public DataAccessLayerException(Throwable cause) {
super(cause);
}
public DataAccessLayerException(String message, Throwable cause) {
super(message, cause);
}
}

Nous ajoutons par ailleurs linterface ContactDao implmente par la classe


ContactDaoImp.
Interface ContactDao
package com.dao;
public interface ContactDao extends GenericDao {
}

Implmentation de linterface ContactDao

package com.dao.impl;
import com.dao.ContactDao;
public class ContactDaoImp extends GenericDaoImpl implements ContactDao {
}

Note : Comme vous vous en doutez, les dveloppeurs ne verront jamais


l'implmentation, ils se contenteront d'utiliser l'interface ContactDAO.
En cas de changement de technologie, il suffira de rcrire seulement
l'implmentation, tout le reste du code n'aura pas tre migr.
Belhassen.oueslati@gmail.com

Passage vers Spring


Page 9

2.6 Couche Business : Classe ContactBusiness


Cette couche contient le logique mtier de l'application.
Voici un exemple qui illustre la diffrence entre couche DAO et couche
service :
Dans la couche DAO, la mthode delete(Object entity) supprime un
contact quel quil soit.
Dans la couche business, la mthode supprimerContact(String numero)
ajoute le code qui va grer les rgles particulires de l'application, par
exemple, nous allons peut tre tester que le contact n'est pas un
administrateur, dans le cas o s'en est un, nous allons dclencher une
exception qui indiquera qu'une rgle interdit la suppression de cet
utilisateur particulier.
Ce qu'il faut bien saisir avec cet exemple, c'est que les DAO se chargent de
grer la persistance des donnes de manire basique, la couche business
elle y ajoute la logique lie au mtier.
Interface ContactBusiness:
package com.business;
import java.util.List;
import org.hibernate.criterion.Criterion;
import com.model.Contact;
public interface ContactBusiness {
public void ajouterContact(Contact contact);
public Contact recupererContactByCriteria(Criterion critere);
public void supprimerContact(String numero);
public List<Contact> recupererListContacts();
}

Belhassen.oueslati@gmail.com

Passage vers Spring


Page 10

Implmentation de linterface ContactBusiness


package com.business.impl;
// import
public class ContactBusinessImp implements ContactBusiness {
ContactDao ctDAO = new ContactDaoImp();
@Override
public void ajouterContact(Contact contact) {
if (contact != null) {
ctDAO.saveOrUpdate(contact);
}
}
@Override
public Contact recupererContactByCriteria(Criterion criterion) {
Session session = HibernateUtil.currentSession();
Criteria crit = session.createCriteria(Contact.class);
crit.add(criterion);
crit.setMaxResults(1);
List<Contact> result = crit.list();
Contact ct = result.get(0);
session.close();
return ct;
}
@Override
Public void supprimerContact(String numero) {
Contact ct = (Contact) ctDAO.findById(Contact.class, numero);
ctDAO.delete(ct);
}
@Override
public List<Contact> recupererListContacts() {
List result = ctDAO.findAll(Contact.class);
return result;
}
}

Belhassen.oueslati@gmail.com

Passage vers Spring


Page 11

2.7

Raliser l'exemple
Excuter la classe TestPassageVersSpring.java
Implmentation de la classe TestPassageVersSpring
package com.util;
// import .
public class TestPassageVersSpring {
public static void main(String[] args) {
ContactBusiness ctBusiness = new ContactBusinessImp();
// cration d'un nouveau Contact
Contact ct = new Contact();
ct.setNumMatCnt("4822");
ct.setNomNomCnt("Mhamed");
ct.setNomPrnCnt("Ben Saleh");
ct.setNumGsmCnt("99731434");
ct.setAdrEmailCnt("Mohamed.saleh@gmail.com");
ctBusiness.ajouterContact(ct);
// Suppression d'un Contact
Criterion criterion = Restrictions.like("nomNomCnt", "Mohamed%");
ctBusiness.recupererContactByCriteria(criterion);
Contact ct = ctBusiness.recupererContactByCriteria(criterion);
List<Contact> results = new ArrayList();
results.add(ct);
displayList(results);
ctBusiness.supprimerContact(ct.getNumMatCnt());
// Recuperation de ts ls Contact
List results = ctBusiness.recupererListContacts();
displayList(results);
}
static public void displayList(List list) {
Iterator iter = list.iterator();
if (!iter.hasNext()) {
System.out.println("La lsite est vide");
return;
}
while (iter.hasNext()) {
Contact ct = (Contact) iter.next();
System.out.println("Matricule :" + ct.getNumMatCnt() + " Nom :"
+ ct.getNomNomCnt() + " Prnom :" + ct.getNomPrnCnt());
}
}
}

Belhassen.oueslati@gmail.com

Passage vers Spring


Page 12

2.8

Question ?
Qu'est ce qu'on remarque ?
Si on veut utiliser une autre implmentation de ContactDao, qu'est ce qu'il faut
faire?

Belhassen.oueslati@gmail.com

Passage vers Spring


Page 13