20/04/2015© Robert Godin. Tous droits réservés.1 15 Développement d'application de base de données en Java.

Slides:



Advertisements
Présentations similaires
Présentation de frameworks J2EE
Advertisements

Introduction Fonctionnement PluginsConfigurationLes données Le framework MAG Framework de conception de canaux complexes Implémente IChannel Possède son.
Laboratoire informatique de Paris 6
Introspection et Réflexion Manipulation dynamique de code Java.
Connecter des données métier à Office SharePoint Server 2007 via le Business Data Catalog.
Exposé de Système - Informatique et Réseau
Programmation Web Les JSP.
Plan du cours La sérialisation: – comment stocker et restaurer les Objets? Les interfaces graphiques et la programmation évènementielle. –Comment concevoir.
Cours 6 : XML et les architectures N-tiers – Tier Applicatif
Relations avec les entity beans
Introduction aux Entity Beans
Stéphane Frenot - Département Télécommunication - SID - II - EjbEnt 247 Entity EJB.
Stéphane Frenot - Département Télécommunication - SID - II - EjbServ 227 EJB Session.
Design Pattern MVC En PHP5.
CURSUS DE FORMATION AUX NOUVELLES TECHNOLOGIES DE DEVELOPPEMENT UV EJB Entité Module Java Expert.
CURSUS DE FORMATION AUX NOUVELLES TECHNOLOGIES DE DEVELOPPEMENT UV EJB Session Module Java Expert.
TP 3-4 BD21.
Introduction aux Session Beans
1 ARCHITECTURE DACCÈS la méthode générale modèle de données définitions module daccès / modules métiers construction des modèles les modules daccès, les.
LOG 02 Bases de Données Avancées Rappels sur JSP / Servlet
Architectures Web - N-Tiers
Accès aux données généralisé SQL est presque une solution! Le problème: Le SQL n'est pas une langue complète, et doit être intégré dans un langage de programmation.
JDBC ou comment manipuler une base de données en Java ?
Projet JAVA EE Approfondi
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
© 2007 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java et les Exceptions Peter Van Roy Département dIngénierie Informatique,
Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès.
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
ASP.NET Par: Hugo St-Louis. C ARACTÉRISTIQUES A SP. NET Évolution, successeur plus flexible quASP (Active Server Pages). Pages web dynamiques permettant.
.Net Remoting.
Interopérabilité JOnAS - CORBA
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 5 – Héritage, Interfaces et Listes génériques.
EJB & Serveurs d’applications
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Document élaboré à Centrale Paris par Pascal Morenton LES TECHNOLOGIES DU WEB 1. LES PHASES D UN DEPLOIEMENT DE RESEAUX 2. LE LANGAGE HTML 3. LE LANGAGE.
Développement dapplication avec base de données Semaine 10 : WCF avec Entité Framework Automne 2013.
J2EE vs .NET Réaliser par : SEIF ENNACER BADRA && CHETOUI RIM.
JEE 5 F.Pfister 2 institut eerie JEE – Une plateforme serveur  Développement et exécution d'applications réparties.
Introduction.
Xooctory.
Java Enterprise Edition, anciennement J2EE
La notion de type revisitée en POO
JDBC L'API JDBC est utilisée pour utilisée pour intéragir avec une base de données.
Programmation objet La base.
Créer des packages.
HIBERNATE Mapping Objet / base de données relationnelle
Chapitre 2 Persistance de données De Hibernate au standard JPA 1.0
CEG3585/CEG3555 Tutorat 2 Hi ver 2013.
Enterprise Java Beans 3.0 Cours INF Bases de Données Hiver 2005, groupe 10 Stefan MARTINESCU.
Metro Web Services Ben Yaflah Marouen Dhrif Mohamed Hbib Hajlaoui Nader.
Masters IIGLI et ILGII – Intranet internet extranet – – Claude Montacié 1 Cours n° 10 Accès distant aux bases de données.
Java Enterprise Edition
Tutorat en bio-informatique
Les sockets.
Module 3 : Création d'un domaine Windows 2000
Cours du 5 novembre.
2 Processus de conception de BD
Master 1 SIGLIS Intégration des données dans l’entreprise Stéphane Tallard JDBC: Java Database Connectivity Master 1 SIGLIS1JDBC.
21/04/2015© Robert Godin. Tous droits réservés.1 6Gestion des contraintes d’intégrité en SQL n Contrainte d'intégrité statique – respectée pour chacun.
Héritage Conception par Objet et programmation Java
Les Servlets Présentation Cycle de vie Principe de fonctionnement
02/06/2015© Robert Godin. Tous droits réservés.1 5 Interface entre SQL et un programme n SQL incomplet n Défaut d'impédance (impedance mismatch) – modèle.
1 Structure en MC Principes Stockage des données dans la mémoire volatile d’un ordinateur Problèmes Stockage temporaire «Petits» volumes de données Langages.
Architecture Client/Serveur
Bases de données Singleton pour la connexion
L. Gurret – M. Herve – P. Mignon – J. Prarioz. Introduction  Dernière étape d’analyse  Cahier des charges, spécifications et conception orientée objet.
Architectures Logicielles Java GLG203 GLG204
Parquet Geoffrey 3 ARIL EXIA.CESI ARRAS. Présentation du MLD Présentation de la persistance Présentation récapitulatif du projet JSP/SERVLET MVC Cycle.
Développement d’applications Web
15 Développement d'application de base de données en Java
Transcription de la présentation:

20/04/2015© Robert Godin. Tous droits réservés.1 15 Développement d'application de base de données en Java

20/04/2015© Robert Godin. Tous droits réservés.2 Patron d'architecture en couche (layer) n Couche présentation n Couche contrôle (coordonnateur d'application) n Couche domaine d'application (ou métier) n Couche de services – persistance – transaction – communication – sécurité – etc.

20/04/2015© Robert Godin. Tous droits réservés Application Java/JDBC client-serveur

20/04/2015© Robert Godin. Tous droits réservés.4 Cas d ’utilisation EnregistrerPrêts

20/04/2015© Robert Godin. Tous droits réservés.5 Cas de test pour scénario normal

20/04/2015© Robert Godin. Tous droits réservés.6 Cas d ’exception : nombre maximal d'emprunts (ici 2) atteint

20/04/2015© Robert Godin. Tous droits réservés.7 Cas d ’exception : exemplaire non disponible

20/04/2015© Robert Godin. Tous droits réservés.8 Cas d'utilisation et classes métiers concernées

20/04/2015© Robert Godin. Tous droits réservés.9 Patron courtier BD : classes du programme Java et tables concernées ~ Data Access Object: granularité un courtier par entitéData Access Object

20/04/2015© Robert Godin. Tous droits réservés.10 Classe Java pour Personne Lecteurs/modifieurs pour attributs (conventions Java Bean)

20/04/2015© Robert Godin. Tous droits réservés.11 Classe Java pour Utilisateur Lecteur pour donnée dérivée Lecteurs/modifieurs pour naviguer les associations

20/04/2015© Robert Godin. Tous droits réservés.12 Classe Java pour Membre Attributs et méthodes static pour attributs de classe (ou singleton)

20/04/2015© Robert Godin. Tous droits réservés.13 Classe Java pour Employé

20/04/2015© Robert Godin. Tous droits réservés.14 Classe Java pour Prêt

20/04/2015© Robert Godin. Tous droits réservés.15 Classe Java pour PrêtEnCours

20/04/2015© Robert Godin. Tous droits réservés.16 Classe Java pour Exemplaire

20/04/2015© Robert Godin. Tous droits réservés.17 CourtierBDUtilisateur

20/04/2015© Robert Godin. Tous droits réservés.18 Diagramme de séquence pour CourtierBDUtilisateur

20/04/2015© Robert Godin. Tous droits réservés.19 Classe UsineConnection

20/04/2015© Robert Godin. Tous droits réservés.20 Courtier CourtierBDPrêtEnCours : chercherLesPrêtsEnCours

20/04/2015© Robert Godin. Tous droits réservés.21 Matérialisation d ’un PrêtEnCours : insérerPrêtEnCours

20/04/2015© Robert Godin. Tous droits réservés.22 Enjeux de la conception des courtiers n Granularité des courtiers n Granularité de matérialisation/dématérialisation – minimiser les appels au serveur de BD – limiter le volume de données à transférer – dématérialisation paresseuse ou agressive ?

20/04/2015© Robert Godin. Tous droits réservés.23 Classe de contrôle ControleEnregistrerPrets

20/04/2015© Robert Godin. Tous droits réservés.24

20/04/2015© Robert Godin. Tous droits réservés Enjeux de conception d'une application Java/JDBC Dépendance au temps de réflexion

Réduire le niveau d’isolation ? n Limiter les verrouillages n Découpage en transactions plus courtes n Considérer l’impact d’un niveau d’isolation plus faible 20/04/2015© Robert Godin. Tous droits réservés.26

20/04/2015© Robert Godin. Tous droits réservés.27 Limiter les verrouillages

20/04/2015© Robert Godin. Tous droits réservés.28 Vérification des contraintes par le serveur Non sérialisabilité perçue par T2

20/04/2015© Robert Godin. Tous droits réservés.29 Contrôle de concurrence optimiste par estampillage explicite n Lecture en une première transaction – Note l’estampille courante (ou numéro de version, …) n Écriture en une deuxième transaction distincte – Vérifie si l’état a changé depuis la lecture n Si non, met à jour les données et l’estampille n Si oui, annulation n Ne bloque pas les objets lus n Populaire dans les applications Web

20/04/2015© Robert Godin. Tous droits réservés.30 Réduire l'interactivité

20/04/2015© Robert Godin. Tous droits réservés.31 ControleEnregistrerPretsSimple

20/04/2015© Robert Godin. Tous droits réservés.32 Libérer la connexion entre les appels n Transaction ne peut chevaucher les appels n Ouverture/fermeture couteuse – Solution : connection pooling (JDBC 2)

20/04/2015© Robert Godin. Tous droits réservés Gestion de la sécurité n Qui gère l ’idUtilisateur et le mot de passe ? – par les données : le SGBD – par les traitements : le programme client

20/04/2015© Robert Godin. Tous droits réservés.34 ControleEnrPretsSecuriteParDonnees

20/04/2015© Robert Godin. Tous droits réservés.35 ControleEnrPretsSecuriteParTraitement

20/04/2015© Robert Godin. Tous droits réservés Façade pour les services de la couche application

20/04/2015© Robert Godin. Tous droits réservés.37 Diagramme de séquence pour ControleEnregistrerPretAvecFacade Dépendance réduite par rapport à la couche persistence

20/04/2015© Robert Godin. Tous droits réservés.38 Patron d'objet de transfert de données (OTD)

20/04/2015© Robert Godin. Tous droits réservés.39 ControleEnregistrerPretsSimpleAvecFacade Connexion libérée entre les appels

15.2 Persistance transparente avec JPA n Persistance transparente – Doter la classe métier de persistance – Spécification du mappage objet/relationnel – Matérialisation/dématérialisation automatique n Paramétrage – Approche aggressive/paresseuse – Gestion d’anté-mémoire – Comportement transactionnel 20/04/2015© Robert Godin. Tous droits réservés.40

Java Persistence API (JPA) n Norme de persistance en Java – POJO, POJI – Mappage par annotations – Injection n Incorporée à EJB3 – remplace entités EJB2 – n Compatible JSE/JEE 20/04/2015© Robert Godin. Tous droits réservés.41

Exemple de mappage 20/04/2015© Robert Godin. Tous droits réservés.42

n Entité JPA – Classe capable de persistance 20/04/2015© Robert Godin. Tous droits … public class Editeur implements Serializable … public class Livre implements Serializable {…

n Par défaut attribut traduit par colonne du même nom n Types SQL par défaut pour mappage n Paramétrage – Sur attribut XXX ou méthode setXXX() 20/04/2015© Robert Godin. Tous droits … public class Editeur implements Serializable { = false) private String = false) private String ville;

n Entité doit avoir un identifiant – Correspond à la clé primaire de la table 20/04/2015© Robert Godin. Tous droits … public class Livre implements = false) private String isbn;

n Pour clé primaire composée n Classe de la clé primaire composée – implémente Serializable – equals() – hashCode() – constructeur vide 20/04/2015© Robert Godin. Tous droits réservés.46

Association entre entités n Unidirectionnelle ou bidirectionnelle n Entité propriétaire – Correspond au côté de la clé étrangère n Annotation pour les attributs ou lecteurs n Types permis pour multiplicité * – java.util.Collection, Set, List ou Map n 20/04/2015© Robert Godin. Tous droits réservés.47

: clé étrangère 20/04/2015© Robert Godin. Tous droits … public class Livre implements Serializable = "NOMEDITEUR", referencedColumnName = "NOMEDITEUR") private Editeur editeur;

n public enum CascadeType { ALL, PERSIST, MERGE, REMOVE, REFRESH} – transitivité des opérations – défaut : {} n mappedBy – attribut de l’entité propriétaire de l’association n public enum FetchType { LAZY, EAGER } – défaut : LAZY (dématérialisation paresseuse) 20/04/2015© Robert Godin. Tous droits … public class Editeur implements Serializable mappedBy ="editeur") private Collection livreCollection;

Manipulation des entités n Gestionnaire d’entité – Instance de EntityManager – Réfère à une unité de persistance n Unité de persistance – Ensemble de classes dotées de persistance – Définie dans le descripteur persistence.xml n Contexte de persistance – Ensemble des entités gérées par le EntityManager 20/04/2015© Robert Godin. Tous droits réservés.50

Exemple de création d’un gestionnaire de persistance 20/04/2015© Robert Godin. Tous droits réservés.51 Fichier persistence.xml: <persistence xmlns:xsi=" xsi:schemaLocation=" version="1.0" xmlns=" projectexemplejpa.Editeur projectexemplejpa.Livre <property name="toplink.jdbc.url" <property name="toplink.jdbc.password" value="A0D145248EE31051EAA1C822B80C610A"/> Création du EntityManager : EntityManagerFactory unEMF = Persistence.createEntityManagerFactory("ProjectExempleJPA-1"); EntityManager unEM = unEMF.createEntityManager();

Création d’entités persistantes 20/04/2015© Robert Godin. Tous droits réservés.52 EntityTransaction uneET = unEM.getTransaction(); System.out.println("Transaction 1: Créer un éditeur avec deux livres associés"); uneET.begin(); Editeur unEditeur = new Editeur(); unEditeur.setNomEditeur("Loze-Dion"); unEditeur.setVille("Longueuil"); unEditeur.setLivreCollection(new ArrayList());

Création d’entités (suite) 20/04/2015© Robert Godin. Tous droits réservés.53 Livre unPremierLivre = new Livre(); unPremierLivre.setIsbn(" "); unPremierLivre.setTitre("Systèmes de gestion de bases de données"); unPremierLivre.setAnneeParution(new Long(2006)); unPremierLivre.setCode("101"); // Il faut maintenir les liens bidirectionnels dans l'application de manière explicite unPremierLivre.setEditeur(unEditeur); unEditeur.getLivreCollection().add(unPremierLivre); Livre unDeuxiemeLivre = new Livre(); unDeuxiemeLivre.setIsbn(" "); unDeuxiemeLivre.setTitre("Programmation des réseaux sous UNIX"); unDeuxiemeLivre.setAnneeParution(new Long(2000)); unDeuxiemeLivre.setCode("101"); unDeuxiemeLivre.setEditeur(unEditeur); unEditeur.getLivreCollection().add(unDeuxiemeLivre); // Les livres deviennent persistants par référence (cascade = ALL) unEM.persist(unEditeur); uneET.commit();

Recherche d’une entité avec find() 20/04/2015© Robert Godin. Tous droits réservés.54 uneET.begin(); Editeur e = unEM.find(Editeur.class,"Loze-Dion"); System.out.println("Nom de l'éditeur:"+e.getNomEditeur()); System.out.println("Ville de l'éditeur:"+e.getVille()); assert (unEditeur == e); Collection lesLivres = e.getLivreCollection(); if (lesLivres == null || lesLivres.size() != 2) { throw new RuntimeException("Nombre de livres non conforme: " + ((lesLivres == null)? "null" : "" + lesLivres.size())); } for (Livre l : lesLivres) { System.out.println(l.getIsbn()); System.out.println(l.getTitre()); } uneET.commit(); Dématérialisation paresseuse (LAZY)

Recherche d’une entité avec JPQL et Query 20/04/2015© Robert Godin. Tous droits réservés.55 uneET.begin(); Query q = unEM.createQuery("SELECT e FROM Editeur e WHERE e.nomEditeur = :unNomEditeur"); q.setParameter("unNomEditeur", "Loze-Dion"); e = (Editeur)q.getSingleResult(); System.out.println("Nom de l'éditeur:"+e.getNomEditeur()); System.out.println("Ville de l'éditeur:"+e.getVille());

20/04/2015© Robert Godin. Tous droits = "Livre.findAll", query = "select o from Livre o") public class Livre implements Serializable { … List listeDesLivres; listeDesLivres = unEM.createNamedQuery("Livre.findAll").getResultList(); System.out.println("Liste des livres:"); for (Livre l : listeDesLivres) { System.out.println(l.getIsbn()); …

Modification d’une entité 20/04/2015© Robert Godin. Tous droits réservés.57 uneET.begin(); Query q2 = unEM.createQuery("SELECT leLivre FROM Livre leLivre WHERE leLivre.isbn = :unIsbn"); q2.setParameter("unIsbn", " "); Livre l = (Livre)q2.getSingleResult(); l.setAnneeParution(new Long(2003)); uneET.commit();

Suppression d’entité avec remove() 20/04/2015© Robert Godin. Tous droits réservés.58 unEM.remove(e); // Les livres sont supprimés en cascade

Entité détachée 20/04/2015© Robert Godin. Tous droits réservés.59 … Editeur e1 = new Editeur(); e1.setNomEditeur("Presses XYZ"); e1.setVille("Une ville"); unEM.persist(e1); // unEditeur devient géré uneET.commit(); unEM.close(); // Contexte de persistance et EntityManager sont supprimés, l'éditeur devient détaché

Rattachement avec merge() 20/04/2015© Robert Godin. Tous droits réservés.60 … e1.setVille("Une autre ville"); // Modification sur objet détaché System.out.println("Session 2"); unEM = unEMF.createEntityManager(); uneET = unEM.getTransaction(); Editeur e2 = unEM.merge(e1); // e2 devient géré et intégre les modifs sur e1 uneET.commit();

Façade JPA pour EnregistrerPrêt n ControleEnregistrerPretsAvecFacadeJPA – Utilise FacadeEnregistrerPretsJPA n Entités à traiter – Personne, Utilisateur, Employé, Membre, PretEnCours et Exemplaire 20/04/2015© Robert Godin. Tous droits réservés.61 public class FacadeEnregistrerPretsJPA { private EntityManagerFactory emf = Persistence.createEntityManagerFactory("ProjectJPA-1"); private EntityManager em = emf.createEntityManager(); private EntityTransaction et = em.getTransaction(); …

@MappedSuperclass 20/04/2015© Robert Godin. Tous droits réservés.62 import javax.persistence.Inheritance; import // Classe non persistante mais qui définit des propriétés persistantes pour les sous-classes public class Personne {…}

20/04/2015© Robert Godin. Tous = "Utilisateur.findAll", query = "select o from Utilisateur o") public class Utilisateur extends Personne implements Serializable Inheritance { InheritanceType strategy() default SINGLE_TABLE; } public enum InheritanceType { SINGLE_TABLE, JOINED, TABLE_PER_CLASS };

@DiscriminatorValue 20/04/2015© Robert Godin. Tous @NamedQuery(name = "Membre.findAll", query = "select o from Membre o") public class Membre extends Utilisateur implements Serializable {

OTDUtilisateurPrets() de FacadeEnregistrerPretsJPA 20/04/2015© Robert Godin. Tous droits réservés.65 public OTDUtilisateurPrets chercherOTDUtilisateurPrets(String idUtilisateur)throws Exception { et.begin(); // Début explicite de transaction avec JPA unUtilisateur = em.find(Utilisateur.class, idUtilisateur); // Retourner l'objet de transfert de donnees OTDUtilisateurPrets if (unUtilisateur instanceof Membre){ Membregeneral unMembregeneral; unMembregeneral = em.find(Membregeneral.class,new Long(1)); Membre.setDureeMaxPrets((int)unMembregeneral.getDureemaxprets()); Membre.setNbMaxPrets((int)unMembregeneral.getNbmaxprets()); Membre unMembre = (Membre)unUtilisateur; return new OTDUtilisateurPrets( unMembre.conditionsPretAcceptees(), unMembre.getNbPretsEnCours(), Membre.getNbMaxPrets(), unMembre.getNbRetards()); } else { return new OTDUtilisateurPrets( true,unUtilisateur.getNbPretsEnCours(),0,0); } JPA ne traite pas les static !!!

getStatutExemplaire() 20/04/2015© Robert Godin. Tous droits réservés.66 public String getStatutExemplaire(String idExemplaire)throws Exception{ unExemplaire = em.find(Exemplaire.class,idExemplaire); return unExemplaire.getStatut(); }

insererPretEnCours() 20/04/2015© Robert Godin. Tous droits réservés.67 public Timestamp insererPretEnCours() throws Exception{ Calendar maintenant = Calendar.getInstance(); // Calendrier avec date actuelle Timestamp dateMaintenant = new Timestamp(maintenant.getTime().getTime()); PretEnCours leNouveauPretEnCours = new PretEnCours(); leNouveauPretEnCours.setUtilisateur(unUtilisateur); leNouveauPretEnCours.setDatepret((Timestamp)dateMaintenant); leNouveauPretEnCours.setExemplaire(unExemplaire); em.persist(leNouveauPretEnCours); return dateMaintenant; }

Contrôle de concurrence JPA n JPA 1 – Optimiste sans verrouillage par défaut – Activé par attribut de version – Peut forcer un verrouillage avec lock() de EM n JPA 2 – Introduit le verrouillage pessimiste – Modes PESSIMISTIC_READ et PESSIMISTIC_WRITE 20/04/2015© Robert Godin. Tous droits réservés.68

20/04/2015© Robert Godin. Tous droits réservés Développement d'applications Web par servlet Java

20/04/2015© Robert Godin. Tous droits réservés Principe de base du Web : le protocole HTTP et le langage de présentation HTML

20/04/2015© Robert Godin. Tous droits réservés Développement de servlet Java

20/04/2015© Robert Godin. Tous droits réservés.72 Diagramme de séquence de l'invocation de la servlet ServletEnregistrerPretSimpleFacade Réutilisation des classes du client-serveur

20/04/2015© Robert Godin. Tous droits réservés.73

20/04/2015© Robert Godin. Tous droits réservés.74

20/04/2015© Robert Godin. Tous droits réservés Cycle de vie d'une servlet n Compilation et démarrage à la première invocation (par conteneur) – init() appelé une fois n permet d ’initialiser des ressources (e.g. connexion) – nouveau fil à chaque invocation d ’une méthode de service (doGet, doPost,…) – destroy() à la fin n e.g. fermer connexion

20/04/2015© Robert Godin. Tous droits réservés Gestion d'une session HTTP dans une servlet La FORM n ’envoie que le idUtilisateur

20/04/2015© Robert Godin. Tous droits réservés.77 FormIdentificationUtilisateurFacade.html

20/04/2015© Robert Godin. Tous droits réservés.78 EnregistrerPrets en deux servlets

20/04/2015© Robert Godin. Tous droits réservés.79

20/04/2015© Robert Godin. Tous droits réservés.80

20/04/2015© Robert Godin. Tous droits réservés DataSource, ConnectionPoolDataSource et PooledConnection n Passage par serveur JNDI (Java Naming and Directory Interface) – e.g. service d’annuaire LDAP – repérage de ressources (e.g. serveur BD) – accès sécurisé

20/04/2015© Robert Godin. Tous droits réservés.82 Ouverture d ’une Connection en passant par DataSource

20/04/2015© Robert Godin. Tous droits réservés.83 Enregistrement du DataSource par descripteur de déploiement XML pour serveur embarqué OC4J de Oracle9i JDevelopper (généré par JDevelopper)

20/04/2015© Robert Godin. Tous droits réservés.84 Partage d'un pool de connexions

20/04/2015© Robert Godin. Tous droits réservés Mécanismes de sécurité pour l'accès à un servlet n Sécurité programmatique n Sécurité déclarative par le conteneur – rôles/utilisateurs – géré par conteneur

20/04/2015© Robert Godin. Tous droits réservés Norme EJB de J2EE ( n Transparence « extrême » – persistance – répartition – services n Spécification déclarative de services – comportement transactionnel – sécurité – gestion de ressources (CPU, mémoire, serveurs,...) n e.g. partage transparent d’un bassin d’objets EJB (pooling) entre clients n robustesse, « scalabilité » n Prise en charge des services par le conteneur à EJB

20/04/2015© Robert Godin. Tous droits réservés.87 Séparation propre des responsabilités (rôles) n Fournisseur de EJB (EnterpriseBean Provider) – développe les composantes EJB n Assembleur d'application (Application Assembler). – assemble EJB + servlet, JSP, HTML, etc. n Déployeur (Deployer) – déploie les EJB dans leur environnement d'exécution n Fournisseur de serveur EJB (EJB Server Provider). – serveur EJB : services de bas niveau pour le conteneur EJB n Fournisseur de conteneur EJB (EJB Container Provider) – conteneur EJB : environnement de déploiement et d'exécution des EJB n Administrateur de Système (System Administrator) – administre serveur et le conteneur EJB

20/04/2015© Robert Godin. Tous droits réservés.88 Catégories de EJB n EJB session (Session Bean) – service d ’objet distant – un seul client à la fois par objet – partage d’un bassin d’objets entre clients – état au besoin entre les appels n stateful/stateless session EJB – non persistent (perdu suite à une panne) n EJB entité (Entity Bean) – services d'objet distant persistant – objet ~ proxy pour une ligne d'une table – un objet EJB entité peut être partagé par plusieurs clients n EJB message (Message Bean) – service de message

20/04/2015© Robert Godin. Tous droits réservés.89 Codage d ’un EJB n Interface home – usine à objet EJB n Interface à distance (remote) – accès aux méthodes d'un objet EJB n Classe bean (bean class) – implémente les méthodes de l'objet EJB

20/04/2015© Robert Godin. Tous droits réservés Développement d'un EJB session sans état : FacadeEnrPretSimpleSessionEJB n Interface home (usine à EJB) n Interface remote (interface à l’objet EJB) NB Paramètres sérialisables (au sens de Java) passés par valeur

20/04/2015© Robert Godin. Tous droits réservés.91

20/04/2015© Robert Godin. Tous droits réservés.92 Descripteur de déploiement XML

20/04/2015© Robert Godin. Tous droits réservés.93 Client du EJB : façade locale qui délègue à la façade EJB distante (patron Business Delegate)Business Delegate

20/04/2015© Robert Godin. Tous droits réservés.94 JDevelopper 10g (déploiement de défaut différent)

20/04/2015© Robert Godin. Tous droits réservés.95 Interposition transparente d ’objets Conteneur de bean

20/04/2015© Robert Godin. Tous droits réservés.96 Dans ServletEnregistrerPretsSimpleFacade remplacer FacadeEnregistrerPretsSimple par une FacadeEJBEnregitrerPretSimple

20/04/2015© Robert Godin. Tous droits réservés Développement d'un EJB session avec état

20/04/2015© Robert Godin. Tous droits réservés.98 Classe bean État maintenu entre les appels Méthode du cycle de vie appelée à la création de l’objet avant ejbCreate() NB setSessionContext() permet d’initialiser la connexion au DataSource (interdit dans ejbCreate()…)

20/04/2015© Robert Godin. Tous droits réservés.99 Classe Bean (suite) : méthode métier identique à FacadeEnregistrerPrets

20/04/2015© Robert Godin. Tous droits réservés.100 Processus de création d ’un EJB avec état

20/04/2015© Robert Godin. Tous droits réservés.101 Client du EJB : façade locale qui délègue à la façade EJB distante

20/04/2015© Robert Godin. Tous droits réservés.102 Dans ServletIdentificationUtilisateurFacade et ServletTerminerPretFacade remplacer FacadeEnregistrerPrets par une FacadeEJBEnregistrerPrets

20/04/2015© Robert Godin. Tous droits réservés Support de transactions distribuées n Plusieurs ressources indépendantes – serveur BD, serveur JMS,... n Protocole transparent de transaction répartie n Démarcation programmatique ou déclarative

20/04/2015© Robert Godin. Tous droits réservés Démarcation programmatique de transaction distribuée (bean managed transaction demarcation) Deux connexions indépendantes !

20/04/2015© Robert Godin. Tous droits réservés.105 Classe bean Deux connexions

20/04/2015© Robert Godin. Tous droits réservés.106 Classe bean

20/04/2015© Robert Godin. Tous droits réservés.107 Descripteur de déploiement XML

20/04/2015© Robert Godin. Tous droits réservés Démarcation déclarative de transaction (container managed transaction demarcation)

20/04/2015© Robert Godin. Tous droits réservés.109 Classe bean

20/04/2015© Robert Godin. Tous droits réservés.110 balise n NotSupported n Required n Supports n RequiresNew n Mandatory n Never

20/04/2015© Robert Godin. Tous droits réservés.111 EJB 3 n Simplification de l’architecture EJB n Annotation par métadonnées dans le code – Mapping objet-relationnel – Comportement transactionnel n Injection de dépendances pour ressources – DataSource, EntityManager, … n EJB codé comme une classe ordinaire (POJO) n Java Persistence API (JPA) – interface Java indépendante de l’architecture (JSE ou JEE) – test hors conteneur – pas de home (cycle de vie géré par EntityManager)

EJB session avec EJB3 20/04/2015© Robert Godin. Tous droits public interface EnregistrerPretSimpleJPASessionEJB { Timestamp insererPretEnCours(String idUtilisateur, String idExemplaire); public interface EnregistrerPretSimpleJPASessionEJBLocal { Timestamp insererPretEnCours(String idUtilisateur, String idExemplaire); public class EnregistrerPretSimpleJPASessionEJBBean implements EnregistrerPretSimpleJPASessionEJB, EnregistrerPretSimpleJPASessionEJBLocal private EntityManager em; private Utilisateur unUtilisateur; private Exemplaire unExemplaire; … Injection du EntityManager de type TRANSACTION Démarcation déclarative Défaut : REQUIRED

insererPretEnCours() 20/04/2015© Robert Godin. Tous droits réservés.113 public Timestamp insererPretEnCours(String idUtilisateur, String idExemplaire){ unUtilisateur = em.find(Utilisateur.class, idUtilisateur); unExemplaire = em.find(Exemplaire.class,idExemplaire); Calendar maintenant = Calendar.getInstance(); // Calendrier avec date actuelle Timestamp dateMaintenant = new Timestamp(maintenant.getTime().getTime()); PretEnCours leNouveauPretEnCours = new PretEnCours(); leNouveauPretEnCours.setUtilisateur(unUtilisateur); leNouveauPretEnCours.setDatepret((Timestamp)dateMaintenant); leNouveauPretEnCours.setExemplaire(unExemplaire); // Materialiser le PretEnCours dans la BD em.persist(leNouveauPretEnCours); return dateMaintenant; }

ServletEnregistrerPretsSimpleFacadeEJB3 n Plus besoin du patron délégué d’affaires 20/04/2015© Robert Godin. Tous droits réservés.114 final Context context = new InitialContext(); EnregistrerPretSimpleJPASessionEJB enregistrerPretSimpleJPASessionEJB = (EnregistrerPretSimpleJPASessionEJB)context.lookup("EnregistrerPretSimpleJPASessionEJB"); // Appel de méthode sur la façade EJB3 java.sql.Timestamp datePret = enregistrerPretSimpleJPASessionEJB.insererPretEnCours( idUtilisateur, idExemplaire );