46
JAVA EE - RAPPELS - Pierre-Johan CHARTRE pierre-johan.chartre@logic

Java EE - Rappels -

  • Upload
    yves

  • View
    50

  • Download
    1

Embed Size (px)

DESCRIPTION

Java EE - Rappels -. Pierre-Johan CHARTRE [email protected]. J2EE Layers. Rappel des différentes couches. Définition : JAVABEAN. Classe Java respectant certaines conventions : - PowerPoint PPT Presentation

Citation preview

Page 1: Java EE  -  Rappels -

JAVA EE - RAPPELS -

Pierre-Johan CHARTRE

[email protected]

Page 2: Java EE  -  Rappels -

J2EE Layers

• Rappel des différentes couches

Persistance

Accès aux données

Métier

Interface•Intégration•IHM (Légère, Lourde)

Page 3: Java EE  -  Rappels -

Définition : JAVABEAN• Classe Java respectant certaines conventions :

• la classe doit être "Serializable" pour pouvoir sauvegarder et restaurer l'état d'instances de cette classe

• la classe doit posséder un constructeur sans argument (constructeur par défaut)

• les propriétés privés de la classe doivent être accessibles publiquement via des méthodes accesseurs construit avec get ou set suivi du nom de la propriété avec la première lettre transformée en majuscule

• Le respect de ces conventions rend possible l'utilisation, la réutilisation, le remplacement et la connexion de JavaBeans par des outils de développement.

3

3

Page 4: Java EE  -  Rappels -

Définition : POJO• Plain Old Java Object

• Nom « marketing » désignant un simple objet Java !

• Terme inventé en 2000 pour opposer :• les EJB version 1.x & 2.x qui étaient de véritable usines à gaz :

• objets Java complexes dont les nombreuses contraintes techniques contraignent fortement leur utilisation

• Créations d’un ensembles interfaces, nécessité d’étendre des classe du framework et de redéfinir tout un ensemble de méthodes …

• aux simples Objets Javas classiques

• Martin fowler says :The term was coined while Rebecca Parsons, Josh MacKenzie and I were preparing for a talk at a conference in September 2000. In the talk we were pointing out the many benefits of encoding business logic into regular java objects rather than using Entity Beans. We wondered why people were so against using regular objects in their systems and concluded that it was because simple objects lacked a fancy name. So we gave them one, and it's caught on very nicely. 4

4

Page 5: Java EE  -  Rappels -

EJB 3.0• Dans ce cours, nous nous concentrerons sur les EJB 3.0

venant de Java EE 5.

• Il existe 3 types d’EJBs :• les EJB Entity (entité) utilisés dans la couche d’accès aux

données• les EJB Session utilisés dans la couche métier • les EJB MDB (Message Driven Bean) utilisés dans la couche

d’intégration. Ils sont utilisés conjointement à des MOMs (Message Oriented Middleware)

• On peut distinguer :• les EJBs pré Java EE 5 (EJB 1.x & 2.x)

• Objets java fortement contraints (pas sexy)• Les EJBs depuis Java EE 5 (EJB 3.x)

• Ce sont des POJOs annotés (sexy)

5

Page 6: Java EE  -  Rappels -

Serveurs d’Application• Un AS (conteneur lourd) implémente les spécifications de

Sun prend en charge la gestion de nombreux services :• La concurrence des accès• La gestion des transactions• La persistance des données• Les objets distribués• La réception de messages asynchrones• Un service de nommage• La sécurité• La gestion du cycle de vie des EJBs• …

6

Page 7: Java EE  -  Rappels -

J2EE architecture

Page 8: Java EE  -  Rappels -

J2EE APIs – The big picture

Page 9: Java EE  -  Rappels -

JAVA EE - PERSISTENCE LAYER = JPA -

Pierre-Johan CHARTRE

[email protected]

Page 10: Java EE  -  Rappels -

Contexte• SGBD versus Application

• BDD : • données persistante• monde « relationnel »

• Application• données en mémoire

durée de vie limité au temps d’exécution de l’application soit en Java l’exécution de la JVM

• monde « objet »

10

Page 11: Java EE  -  Rappels -

Contexte

• Schéma• Tables

• colonnes• Une ligne = un tuple

• Relations entre table • 1-1• 1-n• n-m

• Interrogation via SQL (Structured Query Language) Opération CRUD

• Create• Read• Update• Delete

• Objets

• Metadonnées :• Fichiers de configuration• Annotations en Java

SGBD Application

11

Page 12: Java EE  -  Rappels -

Problématique• Problèmes à résoudre :

• i : Représentation des éléments du SGBD au sein de l’application (en mémoire)

• ii : « Dialogue » avec le SGBD depuis l’application• Connexion au SGBD• Envoi de requêtes au SGBD• Exploitation des données envoyées par la base

12

Page 13: Java EE  -  Rappels -

Une approche répandue d’ORM• i : Représentation des éléments du SGBD

• Objet <> Table• Propriété Objet <> Colonne Table

• Mapping de Type

• Instance Objet <> Tuple Table

• Ces liens sont définis par des métadonnées• Fichier de configuration .xml• Annotation Java

13

Page 14: Java EE  -  Rappels -

Une approche répandue d’ORM ii : Dialogue avec le SGBD depuis l’application

Design pattern DAO (Data Access Object) Se connecte à la SGBD pour mettre en œuvre les opérations

CRUDCreate

entiteDAO.create( EntiteBean )Read

entiteDAO.findByCriteria ( EntiteBean ) : List <EntiteBean>entiteDAO.findById( cle ) : EntiteBean

Update :entiteDAO.update( EntiteBean )

Delete :entiteDAO.delete ( EntiteBean )

Manipule des objets représentant des données de la base, ici nommés EntiteBean

14

Page 15: Java EE  -  Rappels -

JPA (Java Persistence Api)• JPA 1.0

• Mécanisme de persistance des EJBs Entity

• EJB 3 de Java EE 5

• Comporte• Représentation élément SGBD (i)

• EJB « Entity »• POJO annoté (de type JavaBean)

• Objet permettant opération CRUD (ii)• EntityManager

• Fichier de configuration• persistence.xml

JPA• Implémentation (

EclipseLink, Hibernate, TopLink …)

JDBC• Driver

SGBD

15

Page 16: Java EE  -  Rappels -

JPA : EJBs Entitéimport javax.persistence.Entity;import javax.persistence.Id; @Entitypublic class Customer { @Id private Long id; private String firstName; private String lastName;  // getters et setters

// Constructeurs}

• Par défaut• Nom entité = Nom classe

• @Table(• name = «  »• schema = «  » …)

• Nom propriété = Nom colonne• @Column(

• name= «  », • nullable = true/false,• lenght = 100 …)

16

Page 17: Java EE  -  Rappels -

JPA : Relations bidirectionnelle 1-n@Entity@Table (name = “t_category”)public class Category{ (…) @OneToMany(mappedBy = “category”) private List <Product> products; (…)}

@Entity@Table (name = “t_products”)public class Product{ (…) @ManyToOne @JoinColumn(name = “category_fk”) private Category category; (…)}

17

Page 18: Java EE  -  Rappels -

Relations : Eager vs Lazy loading Problème du chargement des entités liées à une entités (par des

relations 1-1, 1-n, n-m)

On peut les charger au plus tôt Eager loading Illustration

Quand je charge une instance de Category, tous les Product associés sont chargés et figurent dans la liste products

Problème de chargement récursif

On peut les charger au plus tard Lazy loading Illustration

Quand je charge une instance de Category, tous les Product associés ne sont pas chargés

Ce n’est que lorsque que je demande pour la première fois d’accéder aux produits (Category.getProducts()) que la liste products est chargée

Plus de problème de chargement récursif Comportement par défaut pour les relations 1-n et n-m

18

Page 19: Java EE  -  Rappels -

JPA : EntityManager

Customer c = new Customer();c.setId(123);c.setFirstName(“dupond”);

em.persist(c);

Customer c;

c = em.find(Customer.class, 123);

Create Read

Customer c;

c = em.find(Customer.class, 123);

c.setFirstName(“durand”);

em.merge(c);

Customer c;

c = em.find(Customer.class, 123);

em.remove(c);

Update Delete

19

em est l’EntityManager

Page 20: Java EE  -  Rappels -

JPA : JPQL

Query query = em.createQuery("select p from Customer p where p.firstName=‘Durand'");Customer customer = (Customer) query.getSingleResult();if (customer != null) {(…)}

20

JPA Query Langage : Langage de requêtage de haut niveau

Query query = em.createQuery("select p.firstName from Customer p where p.id > 2");

List noms = query.getResultList();

for (Object nom : noms)

{(…)}

Query query = em.createQuery("select p.firstName from Customer p where p.id > :id");

query.setParameter("id", 1);

List noms = query.getResultList();

for (Object nom : noms)

{(…)}

em est l’EntityManager

Page 21: Java EE  -  Rappels -

JPA : TransactionsEntityTransaction transaction = em.getTransaction();transaction.begin();

// do database stuff

// Everything ok, committransaction.commit();

// Something went wrong (Exception thrown or something)transaction.rollback();

21

em est l’EntityManager

Page 22: Java EE  -  Rappels -

JPA : Fichier persistence.xml<?xml version="1.0"  encoding="UTF-8"?><persistence  xmlns="http://java.sun.com/xml/ns/persistence"              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"              version="1.0"  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence              http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">   <persistence-unit  name="TestPU">

    <provider>oracle.toplink.essentials.PersistenceProvider</provider>

    <class>com.isima.test.jpa.Category</class>    <class>com.isima.test.jpa.Product</class>    <class>com.isima.test.jpa.Customer</class>

    <properties>      <property name="toplink.jdbc.driver"  value="org.apache.derby.jdbc.EmbeddedDriver"/>      <property name="toplink.jdbc.url«  value="jdbc:derby:C:/Program 

Files/Java/jdk1.6.0/db/MaBaseDeTest"/>      <property name="toplink.jdbc.user" value="APP"/>      <property name="toplink.jdbc.password" value=""/>      <property name="toplink.logging.level" value="INFO"/>    </properties>

  </persistence-unit>

</persistence>

22

Page 23: Java EE  -  Rappels -

Obtention de l’EntityManager (#1)import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.EntityTransaction;import javax.persistence.Persistence;

public class MainTest { public static void main(String[] argv) {  EntityManagerFactory emf = Persistence.createEntityManagerFactory("TestPU"); EntityManager em = emf.createEntityManager();

(…)

em.close(); emf.close(); }}

23

Page 24: Java EE  -  Rappels -

JPA : Stratégie de génération • Entités JPA -> Obtention d’une BDD

• Génération de DDL pour générer la base

• BDD pré existante -> Entités JPA• Génération des EJBs Entity à partir schéma BDD

• Stratégie mixte

24

Page 25: Java EE  -  Rappels -

Environnement d’exécution• Pour fonctionner, JPA à besoin :

• D’une librairie implémentant sa spécification • .jar(s) de TopLink, OpenJPA…

• Du driver JDBC associé à la base accédée

• JPA et les EJBs Entités peuvent s’exécuter :• au sein d’un serveur d’application• dans une application java SE en ajoutant les librairies

appropriés• c’est le seul type d’EJB de Java EE 5 dans ce cas

25

Page 26: Java EE  -  Rappels -

Autres Frameworks Similaires• Sous Java

• Hibernate• EJB Entity 1.x & 2.x (JAVA Entreprise < 5.0)

• Sous Dotnet• ADO.Net

26

Page 27: Java EE  -  Rappels -

JAVA EE - BUSINESS LAYER = EJB -

Pierre-Johan CHARTRE

[email protected]

Page 28: Java EE  -  Rappels -

Couche métierLe but de la couche métier est de contenir et

exposer la logique applicative.

Cette couche repose : sur la couche d’accès aux données fournissant une

représentation objet des donnéesPar exemple, des EJB Entity 3.0 avec JPA

Cette couche peut être invoquée : par une ou plusieurs couches IHM

Client léger/riche (voir suite du cours)Client lourd

par une couche d’intégration au SI de l’entreprise

28

Page 29: Java EE  -  Rappels -

Approches possibles avec java ee 5• La couche métier peut être construite uniquement à

partir de simples Objets Java (POJOs).

• Java EE fournit également les EJB Session : • ils peuvent être appelés localement (dans la même JVM) ou

à distance (depuis une autre JVM).• ils permettent de facilement exposer des traitements métiers

aux couches supérieures. Ils sont souvent utilisés comme Façade (Pattern Gof).

• ils sont hébergés au sein du conteneur d’EJB d’un serveur d’application.

• Depuis Java EE 5.0 (EJB 3.0), ce sont des POJOs annotés

29

Page 30: Java EE  -  Rappels -

EJB Session : les 2 types d’interfaces• Un EJB Session peut implémenter :

• Une interface locale définissant les méthodes qui peuvent être appelées par un autre EJB s'exécutant dans la même JVM que le conteneur.

• Une interface distante définissant les méthodes qui peuvent être appelées par un client en dehors de la JVM du conteneur.

30

Page 31: Java EE  -  Rappels -

EJB Session : Interface Localeimport java.util.List;import javax.ejb.Local;

@Localpublic interface CustomerLocal{ void create(Customer customer);

   Customer find(Object id); List<Customer> findAll();

   void update(Customer customer);

void remove(Customer customer);}

31

Page 32: Java EE  -  Rappels -

EJB Session : Interface Distanteimport java.util.List;import javax.ejb.Remote;

@Remotepublic interface CustomerRemote{ void create(Customer customer);

   Customer find(Object id); List<Customer> findAll();

   void update(Customer customer);

void remove(Customer customer);}

32

Page 33: Java EE  -  Rappels -

EJB Session : gestion de l’état de l’ejb

• Un EJB Session peut être de 2 types distincts.

• EJB Session Stateless : • ne conserve pas d’état entre 2 appels• peut être utilisé par plusieurs clients• annoté @Stateless

• EJB Session Statefull :• conserve son état entre 2 appels• est dédié à un client• annoté @Stateful

33

Page 34: Java EE  -  Rappels -

EJB SESSION : IMPLÉMENTATION STATELESS@Statelesspublic class CustomerFacade implements CustomerLocal, CustomerRemote { @PersistenceContext private EntityManager em;

   public void create(Customer customer) { em.persist(customer); }

public Customer find(Object id) { return em.find(com.isima.test.jpa.Customer.class, id); }

   public List<Customer> findAll() { return em.createQuery("select object(o) from Customer as o").getResultList(); } public void update(Customer customer) { em.merge(customer); }

public void remove(Customer customer) { em.remove(em.merge(customer)); }}

34

Page 35: Java EE  -  Rappels -

EJB SESSION STATELESS : Invocation#1 Old Schoolimport javax.naming.InitialContext;

public class TestService { public static void main(String[] args) throws Exception { // Récupération via JNDI de l’EJBSession InitialContext ctx = new InitialContext(); CustomerRemote c = (CustomerRemote) ctx.lookup("CustomerFacade/remote");

List<Customer> customers = c.findAll(); } }

35

Page 36: Java EE  -  Rappels -

EJB SESSION STATELESS : Invocation#2 Injection de dépendancepublic class TestService { @EJBprivate CustomerLocal customerLogic;

( … ) 

public void update() { customerLogic.update( getSelectedCustomer() ); }

( … )

}

36

36

Page 37: Java EE  -  Rappels -

Environnement d’exécution• Les EJBs Session ne peuvent s’exécuter qu’au sein

du conteneur d’EJB d’un serveur d’application.

37

Page 38: Java EE  -  Rappels -

JAVA EE - INTEGRATION LAYER= EJB + MDB + WS -

Pierre-Johan CHARTRE

[email protected]

Page 39: Java EE  -  Rappels -

INVOCATION DISTANTE D’EJB• Principes :

• Intégration entre 2 composants Java (JVMs)• Invocation à vocation synchrone• Basé sur :

• Annuaire JNDI pour identification EJB• RMI pour transport (Appel d’objet distant en Java)

• Performant• Pas « firewall friendly »

39

39

Page 40: Java EE  -  Rappels -

INVOCATION DISTANTE D’EJB#1 - Principe

40

40

Page 41: Java EE  -  Rappels -

INVOCATION DISTANTE D’EJB#1 - Principe• (1) Obtention de l’objet via JNDI (le service de nommage de J2EE). Accès via

un « remote stub », un proxy (pattern GOF) généré automatiquement qui a connaissance de l’interface de l’objet à invoquer et masque les détails du transit sur le réseau.

• (2) Le « remote stub » retransmet l’appel de méthode au travers du réseau via RMI (sauf cas de l’invocation en local).

• (3) Le client ne connaît que l’interface de l’objet qu’il interroge, ce qui est traduit par le fait qu’il s’adresse à ce que l’on nomme l’interface IBusiness. Cette interface est l’interface métier proposée par l’EJB. L’appel sera en réalité traité par l’implémentation de l’interface métier, l’ « EJB object »

• (4) Celui-ci fourni un niveau d’indirection entre l’objet auquel les clients s’adressent et le bean lui-même géré par le conteneur lourd. Ceci permet au conteneur lourd d’introduire des services (la gestion de la concurrence des accès, la sécurité, la gestion du cycle de vie du bean …) lors de l’accès au bean (5)

41

41

Page 42: Java EE  -  Rappels -

INVOCATION DISTANTE D’EJB#2 – Le coté « client »• Un client peut être :

• une application de type « client lourd » distante• Scénario de type Client/Serveur avec « client lourd »

• N Front-end en client lourd (Swing/Swt par exemple) dans une JVM spécifique

• 1 Back-end sur un AS • Intégration via JNDI (over RMI)

• Une application de type « client léger » • Scénario « client léger »

• N Front-end en client léger (Navigateur) sans JVM• 1 Back-end sur un AS contenant :

• Des composants webs : Servlets/JSPs, JSF• Invocation des POJOs ou EJBs en local dans l’AS

• Intégration entre le navigateur et l’AS en http/https

42

42

Page 43: Java EE  -  Rappels -

INVOCATION DISTANTE D’EJB#2 – Le coté « client »• Principe du proxy (Stub) pour une gestion transparente de

l'appel distant• Sérialisation & Désérialisation• RMI (Remote Method Invocation)

• Dans le cas particulier d’un client local, au sein de la même JVM• Il existe également un proxy mais particulier car dépourvu des

accès réseau. Ce proxy permet au conteneur d'assurer certains services tout en garantissant de bonne performance (pas d’appels réseau inutiles)

43

43

Page 44: Java EE  -  Rappels -

Services Web• Principe :

• Invocation de service à vocation synchrone• Permet l’intégration d’application hétérogène

• Java, Dotnet …

• « firewall friendly » :• XML, SOAP• HTTP/HTTPS• Verbeux donc moins performant

• Voir cours intégration pour détail

44

44

Page 45: Java EE  -  Rappels -

MOM• Message Oriented Middleware• Principe :

• Invocation de service à vocation asynchrone• Permet intégration application hétérogène

• « Bus d’intégration », « Enterprise Service Bus »• Doit s’entendre sur :

• Format message• Type de publication

• En Java :• API JMS• Utilisation des EJBs MDB

45

45

Page 46: Java EE  -  Rappels -

Keywords

J2EE@RolesAllowed

EJB

JPA

@EmbededId

@TransactionnalAttribute

@Column

@Id

@Stateful

@Stateless

@Embedable

@OneToMany

@Entity

@ManyToMany

@OneToMany

@ManyToOne

@OneToOne

@Table

@Local

@Remote

CRUD

DOA

ORM

EntityManager

persistence.xml

Lazy loading

JPQL

CriteriaBuilder

@MessageDrivenBean