cours-TA1-Ejb3

cours-TA1-Ejb3

-

Documents
17 pages
Lire
Le téléchargement nécessite un accès à la bibliothèque YouScribe
Tout savoir sur nos offres

Description

ObjectifsIntroduction àn Réduire la complexité des EJBEJB 3 n à l’aide de :n Plain Old Java Object (Pojo)n suppression des interfaces utilisation et HomeCedric Dumoulinn Annotations Java 5Module Technologies AvancéesMaster 2 IPINT n Injectioncedric.dumoulin@lifl.fr n spécifie les propriétés/méthodes utilisésn supprime les interfaces à implémenterSpecifications Containers – similaire j2ee 1.4n J2EE 5 (1.5)n JSR-244 - Java Platform, Enterprise Edition 5 (Java EE 5) Specificationn http://jcp.org/en/jsr/detail?id=244n EJB 3n JSR-220 - Enterprise JavaBeans 3.0n http://jcp.org/en/jsr/detail?id=220n standardisation de la couche de persistance :Java Persistance APIn JSR : Java Specification Request1Java Persistence APIn Java APIn simplifier la persistance et le mapping des objetsn Annotations Java 5n introduit par EJB 3n prend le meilleur de Hibernate, JDO, TopLink, …Annotation Annotations - déclarationn Declaration/** * Describes the Request-For-Enhancement(RFE) that ledn Se placent aux mêmes endroits que les * to the presence of the annotated API element.*/modificateurs (public, protected, public @interface RequestForEnhancement {private, …) int id();String synopsis();String engineer() default "[unassigned]";n Se déclare à la façon d’une interface : String date() default "[unimplemented]";/** * Describes the Request-For-Enhancement(RFE) that led }* to the presence of the annotated API element.n utilisation :*/ ...

Sujets

Informations

Publié par
Ajouté le 24 septembre 2011
Nombre de lectures 194
Langue Français
Signaler un problème
Introduction à EJB 3
Cedric Dumoulin Module Technologies Avancées Master 2 IPINT cedric.dumoulin@ lifl.fr
Specifications n J2EE 5 (1.5) n (JJSaR-2 4E4E  -5)J aSvpae cPilfaitcfaotriomn, EnterpriseEdition5 va n http://jcp.org/en/jsr/detail?id=244 n EJB 3 n JSR-220 - Enterprise JavaBeans 3.0 n http://jcp.org/en/jsr/detail?id=220 n standardisation de la couche de persistance : Java Persistance API n JSR : Java Specification Request
Objectifs n Réduire la complexité des EJB à l’aide de : n n Plain Old Java Object (Pojo) n suppression des interfaces utilisation et Home n Annotations Java 5 n Injection n spécifie les propriétés/méthodes utilisés n supprime les interfaces à implémenter
Containers –similaire j2ee 1.4
Java Persistence API n Java Persistence API n simplifier la persistance et le mapping des objets n introduit par EJB 3 n prend le meilleur de Hibernate, JDO, TopLink, …
Annotation n Se placent aux mêmes endroits que les modificateurs (public, protected, private, …) n Se déclare à la façon d’une interface : /** * Describes the Request -For- Enhancement(RFE) that led * to the presence o f the annotated API element. */ public @interface RequestForEnhancement { int id(); String synopsis(); String engineer() default "[unassigned ]"; String date() default "[ unimplemented]"; }
n Annotations Java 5
Annotations - déclaration n Declaration /** * Describes the Request -For- Enhancement(RFE) that led * to the presence o f the annotated API element. */ public @interface RequestForEnhancement { int id(); String synopsis(); String engineer() default "[unassigned ]"; String date() default "[ unimplemented]"; } n utilisation : @RequestForEnhancement ( id = 2868724, synopsis = "Enable time-travel", engineer = "Mr. Peabody", date = "4/1/3007" ) public static v o i d travelThroughTime ( Date destination) { ... }
Annotations - déclaration n Annotation sans propriétés n les () peuvent être omises n Déclaration /** Indicates that the specification of the annotated API element is preliminary and subject to change. */ public @interface Preliminary { } n Utilisation @Preliminary public class TimeTravel { ... }
Annotation n Processing par le compilateur : n generation de fichiers (descripteurs, classes, …) n preprocessing n metadonnées accessibles dans le programme n Method m = obj.getMethods(); if (m.isAnnotationPresent(Copyright.class)) {…} n RequestForEnhancement req = obj.getAnnotation(RequestForEnhancement.class); String engineer = req.engineer(); n En savoir plus : n ihotntps.:h/t/jmalva.sun.com/j2se/1.5.0/docs/guide/language/annotat
Annotations - déclaration n Annotation avec 1 propriétés n le nom de la propriété peut être omise n la propriété doit s’appeler « value » n Déclaration /** Associates a copyright notice with the annotated API element. * */ public @interface Copyright { String value (); } n Utilisation @Copyright("2002 Yoyodyne Propulsion Systems ") public class OscillationOverthruster { ... }
n Principe de l’injection
Injection - principe  n Principe : n annoter la propriété à « injecter » n le container positionne la propriété avant l’utilisation de l’objet n Utilise les annotation java 5 n Avantages n plus besoin d’implémenter une interface n seule les propriétés réellement utilisés sont positionnées
Injection dans EJB3 n Le container « injecte » les références demandés (par les annotations) n avant le 1er appel à une méthode business n après l’appel a setSessionContext (si présente)
Injection - exemple n ex :  n Specifier l’utilisation d’un EJB package com.example […] @EJB private ShoppingCart myCart ; n Utilise les valeurs par défaut n Recherche automatique du bean java: comp/ env/com.example. myCart dans l’environement du composant n Spécifier plus d’argument @EJB( name = “ ejb/shopping -cart”, beanName = “cart1”, beanInterface = ShoppingCart.class , description = “The shopping cart for this application” ) private Cart myCart;
Injection et descripteur de déploiement n injection et descripteur de déploiement peuvent être utilisé en même temps n injection n défini les points d ’injections n utilisé par défaut n descripteur n optionnel n permet de surcharger (redéfinir) les annotations n ne peut pas créer de nouveaux points d’injection
n EJB 3
Packaging des entités n ejb-3_0-pfd-spec-persistence.pdf/chapter6 n Persistence unit - unité logique incluant : n fabrique de managers; managers d’entités + fichiers de configuration n classe managées n métadonnées d’association objet/rdb n dans fichier xml n dans classes annotés n
Ressource de données n Declaration d’utilisation d’une ressource de données // The employee database. @Resource javax.sql.DataSource employeeAppDB; public void changePhoneNumber(...) { ... // Invoke factory to obtain a resource. The security // principal for the resource is not given, and // therefore it will be configured by the Deployer. java.sql.Connection con = employeeAppDB.getConnection(); ... }
Packaging des entités n Peuvent définir une ou plusieurs unités de persistance : n EJB-JAR, WAR, EAR, ou JAR client d’application n Une unité de persistance est définie à l’aide de : n un fichier persistence.xml n dans META-INF/persistence.xml n peut définir plusieurs unités n un nom unique  n est packagé dans n un jar; un ejb-jar; un war n WEB-INF/classes; WEB-INF/lib
persistence.xml Exemple simple <entity- manager > < name>cal</ name > < jta-d a t a-source>java:/DefaultDS </ jta -data -source > < properties > < property n a m e="hibernate.hbm2ddl.auto" value="create -drop "/> < /properties> </entity -manager> n name n Nom du manager n <jta-data-source> n Nom JNDI de la ressource de données
EJB Session Stateless Le Bean n Definir l’implémentation @Stateless public class CalculatorBean implements Calculator, RemoteCalculator { public double calculate (int start, int end , double growthrate, double saving) { double tmp = Math.pow (1. + growthrate / 12., 12. * ( end - start) 1); + return saving * 12. * (tmp - 1) / growthrate; } } n Par defaut, n nom JNDI = nom de la classe n utilisation locale
EJB Session Stateless Interface d’utilisation n Definir l’interface d’utilisation public interface Calculator { public double calculate (int start, int end, double growthrate, double saving); } n Pas d’annotations n Pas d’extension d’interface n Utilisé par les clients
EJB Session Stateless Le client n Recherche dans JNDI private Calculator c a l = null ; public v o i d jspInit () { try { InitialContext ctx = new InitialContext (); cal = (Calculator )ctx.lookup( Calculator.class.getName ()); } catch (Exception e) { e.printStackTrace (); } cal. calculate (start, end, growthrate, saving ); } n Par defaut , nom JNDI = nom de la classe
EJB Session Stateless Interface Remote n L’interface : public interface RemoteCalculator { public double calculate (int start, int end, double growthrate, double saving); public String getServerInfo (); } n L’implémentation : @Stateless @Local ({Calculator.class}) @Remote ({RemoteCalculator.class}) public class CalculatorBean implements Calculator, RemoteCalculator { public double calculate (int start, int end, double growthrate, double saving ) { double tmp = Math.pow(1. + growthrate / 12., 12. * (end - start) + 1); return saving * 12. * (tmp - 1) / growthrate; } public String getServerInfo () { return "This is the JBoss EJB 3.0 TrailBlazer"; } } n ou tagger l’interface (à la place de l’implémentation) @Remote public interface RemoteCalculator { // ... ... }
EJB Session Stateful L’implémentation @Stateful public class CalculatorBean implements Calculator , Serializable { public ArrayList <Integer > starts = new ArrayList <Integer> (); public ArrayList <Integer > ends = new ArrayList < Integer> (); public ArrayList <Double> growthrates = new ArrayList <Double> (); public ArrayList <Double> savings = new ArrayList <Double> (); public ArrayList <Double> results = new ArrayList <Double> (); public double calculate ( int start, int end , double growthrate, double saving) { // calculate the result ... starts.add( Integer.valueOf(start)); ends.add(Integer.valueOf(end)); growthrates.add(Double.valueOf(growthrate )); savings.add (Double.valueOf(saving) ) ; results.add (Double.valueOf(result) ) ; return result; } public ArrayList <Integer > getStarts () { return starts ; } // O t he r getter methods for the attributes ... }
EJB Session Stateful L’interface n L’interface d’utilisation : public interface Calculator { public double calculate (int start, int e n d, double growthrate, double saving); public ArrayList <Integer> getStarts (); public ArrayList <Integer> getEnds (); public ArrayList <Double> getGrowthrates (); public ArrayList <Double> getSavings (); public ArrayList <Double> getResults (); }
EJB Session Stateful Le client (servlet) Calculator cal = (Calculator) session.getAttribute("sfsb cal"); _ if (cal == null) { try { InitialContext ctx = new InitialContext(); cal = (Calculator) ctx.lookup( Calculator.class.getName()); session.setAttribute ("sfsb cal", cal); _ } catch (Exception e) { e.printStackTrace (); } } n Le servlet utilise toujours le même stub pour avoir le même EJB (et ses info persistente pour la session).
Session Bean Cycle de vie n Utilisation de l’injection n Plusieurs annotations permettent d’être avertis des événements du cycle de vie n La méthode annoté est appelé par le container n pas besoin d’implémenter une interface n @postConstruct
Session Bean Cycle de vie - Exemple @Stateful public class CalculatorBean implements Calculator, Serializable { // ... ... public ArrayList <Integer> starts, ends; public ArrayList <Double> growthrates, savings, results ; @PostConstruct public void initialize () { starts = new ArrayList <Integer> (); ends = new ArrayList <Integer> (); growthrates = new ArrayList <Double> (); savings = new ArrayList <Double> (); results = new ArrayList <Double> (); SessionRecord.totalSess++; SessionRecord.activeSess++; } @PreDestroy public void exit () { SessionRecord.activeSess--; } // ... ... }
Session Bean Cycle de vie n @PostConstruct n immédiatement après l’instanciation n @PreDestroy avant la destruction par le container n n @PrePassivate n avant la passivation d’un statefull par le container (mise en cache) n @PostActivate n après la reactivation d’un statefull n @Init n Designe la méthode d’initialisation d’un statefull n Peut exister plusieurs méthodes taggé @ Init (une par constructeur) n @PostConstruct appelé après @Init n @Remove n Spécifie la méthode « remove » n Est appelé par l’application, pas par le container
Session Bean - Séparation business et cycle de vie n Utiliser @CallbackListener n Implémenter une classe avec les méthodes cycle de vie n chaque méthode du cycle de vie reçoit l’instance du bean en paramétre n L’implémentation : @Stateful @CallbackListener(CalculatorCallbackListener.class ) public class CalculatorBean implements Calculator { // ... ... } n du c cle de vie : n L’ p im ub p l i m c e c n l ta a t s io s Calcu y latorCallbackListener { @PostConstruct public initialize (CalculatorBean cal) { // ... ... } @PreDestroy public exit (CalculatorBean cal) { // ... ... } }
EJB Message Driven @MessageDriven (activateConfig = { @ActivationConfigProperty(propertyName="destinationType" , propertyValue="javax.jms.Queue"), @ActivationConfigProperty(propertyName="destination", propertyValue=" queue/mdb ") }) public class CalculatorBean implements MessageListener { public void onMessage (Message msg) { try { TextMessage tmsg = ( TextMessage) msg; [ … ] } catch (Exception e) { e.printStackTrace ( ) ; } } // ... ... } n L’annotation spécifie : n Le type de la destination (ici une file) n Le nom JNDI de la desination
Injection de dépendances @EJB n Pour obtenir les objets n Pour s’affranchir des noms JNDI n éviter les problèmes de nommage n fonctionne uniquement sur les objets EJB local n pas sur les objets Pojo (servlet) n pas sur les remotes L
EJB Message Driven Le client try { InitialContext ctx = new InitialContext(); queue = (Queue) ctx.lookup(" queue/ mdb "); QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory"); cnn = factory.createQueueConnection (); sess = cnn.createQueueSession(false, _ QueueSession.AUTO ACKNOWLEDGE ); } catch (Exception e) { e.printStackTrace (); } TextMessage msg = sess.createTextMessage( request.getParameter ("start ") + "," + request.getParameter ("end") + "," + request.getParameter ("growthrate") + "," + request.getParameter ("saving") ); sender = sess.createSender (queue); sender.send(msg );
Injection de dépendances @EJB n @EJB PropertyType propName; n spécifie une propriété à remplir par le container n remplace le lookup( ) n nom JNDI = nom complet du type n type = type spécifié n Exemple : public class CalculatorMDB implements MessageListener { @EJB Calculator cal; @EJB RecordManager rm; // use the cal and rm variables // ... ... }
Injection de dépendances @EJB n @EJB public void setPropName(PropertyType value) n spécifie une propriété à remplir par le container n remplace le lookup( ) n nom JNDI = nom complet du type (nom méthode sans le set) n Exemple :  public class CalculatorMDB implements MessageListener { Calculator cal; @EJB public void setCal (Calculator cal) { this.cal = cal; } // use the cal variable // ... ... }
Injection de dépendances @Resource n Pour injecter des ressources (DataSource, Factory, … n Exemple : Datasource public class Rrec{ordManagerBeanimplements RecordManage // Inject resources based on jndi names @Resource (mappedName="java:/DefaultDS") DataSource myDb; // use myDb to obtain JDBC connection // and operate the database ... } n Utilise le nom JNDI complet
Injection de dépendances @EJB n Attributs optionels n name –spécifie le nom EJB2 du bean à injecter n beanInterface –spécifie l’interface remote ou locale à utiliser. n Cast automatique si la propriété est spécifiée avec un type parent n beanName –nom du bean n si plusieurs beans implémentent la même interface n @EJB permet aussi une injection sur des tableaux
Injection de dépendances @Resource n Recherche JNDI dans le contexte local du bean n sans spécifier le prefix java:comp/env n Exemple : @Resource (mappedName="ConnectionFactory") QueueConnectionFactory factory; @Resource (mappedName="queue/A") Queue queue;
EJB Entity @Entity n Objets pouvant être persistant n Pojo n chaque instance a une entrée dans la BD n Annotations spécifiant comment l’objet doit être stocké dans la BD n Le container se charge du mapping
EJB Entity @Entity - exemple @Entity @Id marque la clé @Table(name = "fund") public class Fund implements Serializable { n private int id; private String name; private double growthrate; primaire public Fund () { } public Fund (String name, double growthrate) { this.name = name; n Le container appel this.growthrate = growthrate; } setId() pour chaque  @Id(generate = GeneratorType.AUTO) instan réée public int getId () { ce c return id; } }ppuutbbhlliiiscc.  ivSdotiri=d nigsedt;Id(int(i)d {) { n Peluotn nspe épciofiuerr  la getName } co return name; public void setName (String name ) { chaque propriété this.name = name; } // Other getter and setter methods ... }
EJB Entity @Entity - exemple n Record est en relation One->many avec Fund et Investor.
EJB Entité Relation inter bean @@ETnabtiltey(name= "record") n @ManyToOne p/u/ppb rrl.ooi.ttc.ee  cc.ctt.lee.adds  sFi unRntedc iofdru;dn id;mplements Serializable{ n Sepléactiifoien le type de r pprrootteecctteedd  dIonuvbelset osra viinnvge;stor; n un Record peut avoir un p/r/o t.e.c.t e.d. .double result; seul Fund @@pJMuoabinlnyiCTcoo lOFuunmnend(( onpgatemiteoF=nu"anmldy=_f(fa)ul ns{dei)d") n Uplnu sFiuenurds pReeuct oarvdoir return fund; } n @JoinColumn /@/M aUnsyeT otOhnee (soypsttieomn-aslp=efcailfsiee)d join column n spécifie le nom de la pubrleitcu rInn viensvteosrt ogre;tInvestor() { colonne contenant les /}/ Other getter and setter methods clés étrangère (foreign ... } ID)