Introduction à Java Enterprise Edition
Introduction à Java Enterprise Edition
1
Plan
1. Introduction
2. Servlet
3. EJB 3
2
Introduction
Java EE : Java Enterprise Edition
Plates-formes existantes
-implémentation de référence : Java EE 6 SDK GlassFish
-commerciales
WebSphere (IBM), WebLogic (BEA), NEC, Oracle, SAP, Sun, …
-open source
JBoss, JOnAS, Geronimo, OpenEJB, JFox, …
Voir http://www.oracle.com/technetwork/java/javaee/community/
4
Introduction
Java EE : Java Enterprise Edition
• communications distantes
• RMI-IIOP : requête/réponse (TCP + IIOP + sérialisation Java)
• JAX-WS : requête/réponse Web Service (HTTP + SOAP + XML)
• JMS : MOM (message oriented middleware) : message + boîte à lettres
requête
prog. rés- prog.
client eau réponse serveur
retrait
prog. dépose Boîte à prog.
client message lettres serveur
message
5
Introduction
Java EE : Java Enterprise Edition
• services systèmes
• JNDI : annuaire
• JTA : gestion de transactions
• JPA : gestion de la persistence des données
• JASS : sécurité, contrôle d'accès (rôles, droits)
• JMX : administration de la plate-forme
6
Introduction
Java EE : Java Enterprise Edition
7
Introduction
Architecture 3 tiers
Client
• riche : application Java
• léger : navigateur Web
Serveur d'applications
• hébergent des applications à base de
- composants EJB : classes Java conformes au modèle EJB
- composants Web : servlet ou JSP
SGBD
• fournit un support de stockage pour les données de l'application
- 80% : SGBDR (Oracle, SQL Server, PostGreSQL, ...)
- 20% : autres applications de stockage
8
Introduction
Serveur d'applications
9
Introduction
Serveur d'applications
Transaction
Persistance
Nommage
Sécurité
ces services sont intégrés dès le départ
à la plate-forme
10
Introduction
Serveur d'applications
11
Introduction
Composants
• inversion du contrôle
•contenu prend en charge l'exécution du code métier (composant)
•conteneur assure le lien avec la partie technique
•configurer plutôtque programmer
•approche framework vs bibliothèque
• injection de dépendances
•vers d'autres composants, vers des services techniques
•retirer du code métier la gestion des liens vers les autres composants métiers
•faire gérer l'architecture applicative par le conteneur
13
Servlet
14
Servlet
Servlet
Principe
• les fichiers de bytecode(.class) sont stockés sur le serveur
• ils sont désignés par une URL ex. : http://www.upmc.fr/servlet/Prog
• le chargement de l'URLprovoque l'exécution du servlet
Servlets étendent le comportement du serveur Web
Sont exécutées par un "moteur" (ex. Tomcat)
1 2
Serveur Prog.class
Client
HTTP servlet
4 3
Explorer
Firefox JVM
...
15
Servlet
Exemple de servlet
package myPackage;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
16
Servlet
Servlet
Fonctionnalités
17
Enterprise Java Beans 3
18
Plan
1. Composant EJB
1.1 Session Bean
1.2 Entity Bean
1.3 Message Driven Bean
1.4 Fonctionnalitésavancées
2. Services
2.1 Annuaire
2.2 Transaction
2.3 Sécurité
3. Conclusion
19
1. Composant EJB
Enterprise Java Bean (EJB)
traitement
présentation donnée
20
1. Composant EJB
Enterprise Java Bean (EJB)
Types d'EJB
• Session : performs a task for a client
• Entity (deprecated) : represents a business entity object that exists
in persistent storage
• Message-Driven : listener processing messages asynchronously
21
1. Composant EJB
EJB 3
• mais
• trop compliqué, lourd, contraignant
• concepts objets (héritage, typage, polymorphisme, …) difficilement exploitables
• mapping objet/relationel limité
• trop de fichiers XML fastidieux à écrire, maintenir, comprendre
23
1. Composant EJB
Annotations Java 5
Exemple
@Resource(name="myDB", type=javax.sql.DataSource.class)
@Stateful
public class ShoppingCartBean implements ShoppingCart { ... }
24
1. Composant EJB
Annotations Java 5
• chaque annotation est un type (au même titre qu'une classe ou qu'une interface)
• défini dans un package (ex. : javax.ejb.Stateless)
25
1. Composant EJB
Annotations Java 5
• annotation = type
les déclarations d'annotations peuvent être annotées
26
1. Composant EJB
Enterprise Java Bean
machine 1 machine 2
EJ Bean
Remote
interface
client
distant
27
1. Composant EJB
Enterprise Java Bean
machine 2
EJ Bean
Remote Local
interface interface
client
local
1. Définition
2. Développement
3. Client local
4. Client distant
5. Stateful session bean
29
1.1 Session Bean
Définition
3. Singleton session bean : idem stateful, mais une instance pour tous les clients
30
1.1 Session Bean
Développement
Interface
• annotations @javax.ejb.Local ou @javax.ejb.Remote
import javax.ejb.Remote;
@Remote
public interface CalculatriceItf {
public double add(double v1,double v2);
public double sub(double v1,double v2);
public double mul(double v1,double v2);
public double div(double v1,double v2);
}
31
1.1 Session Bean
Développement
Classe
import javax.ejb.Stateless;
@Stateless
public class CalculatriceBean implements CalculatriceItf {
public double add(double v1,double v2) {return v1+v2;}
public double sub(double v1,double v2) {return v1-v2;}
public double mul(double v1,double v2) {return v1*v2;}
public double div(double v1,double v2) {return v1/v2;}
}
32
1.1 Session Bean
Client local serveur d'applications
conteneur EJB
33
1.1 Session Bean
Client distant
34
1.1 Session Bean
Stateful Session Bean
2 annotations principales
• @Stateful : déclare un bean avec état
• @Remove
• définit la méthode de fin de session
• la session expire à l'issuede l'exécution de cette méthode
35
1.1 Session Bean
Stateful Session Bean
@Stateful
public class CartBean implements CartItf {
private List items = new ArrayList();
private List quantities = new ArrayList();
public void addItem( int ref, int qte ) { ... }
public void removeItem( int ref ) { ... }
@Remove
public void confirmOrder() { ... }
}
36
1.2 Entity Bean
1. Définition
2. Développement
3. Gestionnaire d'entité
4. Relation
5. Autres annotations
37
1.2 Entity Bean
Définition
38
1.2 Entity Bean
Développement
39
1.2 Entity Bean
Développement
@Entity
public class Book {
private long id;
private String author;
private String title;
public Book() {}
public Book(String author, String title) {
this.author = author;
this.title = title; }
@Id
public long getId() { return id; }
public void setId(long id) { this.id = id; }
public String getAuthor() { return author; }
public void setAuthor(String author) { this.author = author; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; } }
40
1.2 Entity Bean
Développement
• annotation @GeneratedValue
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public long getId() { return id; }
41
1.2 Entity Bean
Gestionnaire d'entités
Entity Manager
42
1.2 Entity Bean
Gestionnaire d'entités
Exemple
• création de trois enregistrements dans la table des livres
@Stateless
public class MyBean implements MyBeanItf {
@PersistenceContext
private EntityManager em;
public void init() {
Book b1 = new Book("Honore de Balzac","Le Pere Goriot");
Book b2 = new Book("Honore de Balzac","Les Chouans");
Book b3 = new Book("Victor Hugo","Les Miserables");
em.persist(b1);
em.persist(b2);
em.persist(b3);
} }
44
1.2 Entity Bean
Gestionnaire d'entités
Query q =
em.createQuery("select OBJECT(b) from Book b where b.author = :au");
String nom = "Honore de Balzac";
q.setParameter("au",nom);
List<Book> list = (List<Book>) q.getResultList();
45
1.2 Entity Bean
Gestionnaire d'entités
@Entity
@NamedQuery(name="allbooks",query="select OBJECT(b) from Book b")
public class Book { ... }
Query q = em.createNamedQuery("allbooks");
List<Book> list = (List<Book>) q.getResultList();
46
1.2 Entity Bean
Relation
@Entity
public class Author {
private long id;
private String name;
private Collection<Book> books;
public Author() { books = new ArrayList<Book>(); }
public Author(String name) { this.name = name; }
@OneToMany
public Collection<Book> getBooks() { return books; }
public void setBooks( Collection<Book> books ) { this.books=books; }
...
}
47
1.2 Entity Bean
Relation 1-n
@Entity
public class Book {
private long id;
private Author author;
private String title;
public Book() {}
public Book(Author author, String title) {
this.author = author;
this.title = title; } Nom de la colonne
de jointure
@ManyToOne
@JoinColumn(name="Author_id")
public Author getAuthor() { return author; }
public void setAuthor(Authro author) { this.author = author; }
48
1.2 Entity Bean
Relation n-n
49
1.2 Entity Bean
Relation n-n
@Entity @Entity
public class Category { public class Item {
@Id @Id
@Column(name="CATEGORY_ID") @Column(name="ITEM_ID")
protected long categoryId; protected long itemId;
@ManyToMany(mappedBy="items")
protected Set<Category> categories;
@ManyToMany
@JoinTable(name="CATEGORIES_ITEMS",
joinColumns=
@JoinColumn(
name="CI_CATEGORY_ID",
referencedColumnName="CATEGORY_ID"),
inverseJoinColumns=
@JoinColumn(
name="CI_ITEM_ID",
referencedColumnName="ITEM_ID"))
protected Set<Item> items;
50
1.2 Entity Bean
Autres annotations
@Temporal : dates
TemporalType : DATE (java.sql.Date), TIME (java.sql.Time)
TIMESTAMP (java.sql.Timestamp)
@Temporal(TemporalType.DATE)
protected java.util.Date creationDate;
51
1.2 Entity Bean
Autres annotations
@Embeddable et @Embedded : embarque les données d'une classe dans une table
@Embeddable
public class Address implements Serializable {
private String rue; private int codePostal; }
@Entity
public class User {
private String nom;
@Embedded
private Address adresse;
}
52
1.2 Entity Bean
Autres annotations
@Entity
@IdClass(PersonnePK.class)
public class Personne {
@Id public String getName() { return name; }
@Id public String getFirstname() { return firstname; }
}
53
1.2 Entity Bean
Informations complémentaires :
• Les Entity Beans sont maintenant “deprecated” lorsque crées en tant que Beans
• Ils sont désormais des POJOs (plain old java objects) important la JPA.
54
Plan
1. Composant EJB
1.1 Session Bean
1.2 Entity Bean
1.3 Message Driven Bean
1.4 Fonctionnalitésavancées
2. Services
2.1 Annuaire
2.2 Transaction
2.3 Sécurité
3. Conclusion
55
1.3 Message-driven Bean
Message-driven bean (MDB)
retrait
prog. dépose Boîte à prog.
client message lettres serveur
message
CORBA COSEvent
2 modes Queue
-n vers 1 (queue)
-n vers m (topic)
Topic
56
1.3 Message-driven Bean
Caractéristiques
Vocabulaire : producteur/consommateur
57
1.3 Message-driven Bean
Concepts
Connection Factory : fabrique pour créer des connexions vers une queue/topic
Connection : une connexion vers une queue/topic
Session : période de temps pour l'envoi de messages dans 1 queue/topic
Peut être rendue transactionnelle
similitude avec les notions de sessions JDBC, Hibernate, …
Processus
1. Création d'une connexion
2. Création d'une session (éventuellement plusieurs sessions par connexion)
3. Création d'un message
4. Envoi du message
5. Fermeture session
6. Fermeture connexion
58
1.3 Message-driven Bean
Producteur
public class MyProducerBean {
@Resource(name="jms/QueueConnectionFactory") // l'id de la factory
private ConnectionFactory connectionFactory;
@Resource(name="jms/ShippingRequestQueue") // l'id de la queue
private Destination destination;
public void produce() {
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE)
MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage();
message.setText("Hello World!");
producer.send(message);
session.close();
connection.close();
} }
59
1.3 Message-driven Bean
Consommateur
MDB = classe
- annotée @MessageDriven
- implantant interface MessageListener
- méthode void onMessage(Message)
@MessageDriven(name="jms/ShippingRequestProcessor")
public class MyConsumerBean implements MessageListener{
public void onMessage( Message m ) {
TextMessage message = (TextMessage) m;
...
} }
60
Plan
1. Composant EJB
1.1 Session Bean
1.2 Entity Bean
1.3 Message Driven Bean
1.4 Fonctionnalités avancées
2. Services
2.1 Annuaire
2.2 Transaction
2.3 Sécurité
3. Conclusion
61
1.4 Fonctionnalités avancées
Timer beans
Définition automatique
- annotation @Schedule pour définir la périodicité
@Stateless
public class NewsLetterGeneratorBean implements NewsLetterGenerator {
@Schedule(second="0", minute="0", hour="0",
dayOfMonth="1", month="*", year="*")
public void generateMonthlyNewsLetter() {
// ...
} }
Déclenchement tous les 1ers du mois à 00h00
62
1.4 Fonctionnalités avancées
Timer beans
63
1.4 Fonctionnalités avancées
Intercepteurs
javax.interceptor.InvocationContext
64
1.4 Fonctionnalités avancées
Intercepteurs
Plusieurs méthodes dans des classes ≠
public class EnchereBean { peuvent être associées à MyInterceptor
@Interceptors(MyInterceptor.class)
public void ajouterEnchere( Bid bid ) { ... } }
65
1.4 Fonctionnalités avancées
Méthode asynchrone
@Stateless
public class OrderBillingServiceBean implements OrderBillingService {
@Asynchronous
public void billOrder(Order order) { ... }
}
66
1.4 Fonctionnalités avancées
Conteneur EJB embarquable
java:global[/<application-name>]/<module-name>/<bean-name>#<interface-name>
68
Plan
1. Composant EJB
1.1 Session Bean
1.2 Entity Bean
1.3 Message Driven Bean
1.4 Fonctionnalités avancées
2. Services
2.1 Annuaire
2.2 Transaction
2.3 Sécurité
3. Conclusion
69
2. Services
Conteneur
• environnement de création/gestion
des instances de composants
• notion de cycle de vie
70
2. Services
Cycle de vie
Stateful session bean
71
2.1 Annuaire
JNDI
Un service d'annuaire
• accès distant
• accès local javax.naming.Context ic = new InitialContext();
• recherche Object o = ic.lookup("url");
73
2.2 Transactions
Granularité des transactions
74
2.2 Transactions
Granularité des transactions
SUPPORTS
Si l’appelant s’exécute dans une transaction, l’appelé s’y insère
Sinon, l’appelé s’exécute en dehors de toute transaction
75
2.2 Transactions
Granularité des transactions
NOT_SUPPORTED
L’appelé s’exécute toujours en dehors d’une transaction
76
2.2 Transactions
Granularité des transactions
REQUIRED
Si l’appelant s’exécute dans une transaction, l’appelé s’y insère
Sinon, l’appelé débute une nouvelle transaction
77
2.2 Transactions
Granularité des transactions
REQUIRES_NEW
Une nouvelle transaction est systématiquement créée
Si l’appelant s’exécute dans une transaction, l’appelé y imbrique la sienne
78
2.2 Transactions
Granularité des transactions
MANDATORY
Si l’appelant s’exécute dans une transaction, l’appelé l’utilise
Sinon, l’appelé lève une exception
Erreur
throw
new TransactionRequiredLocalException()
or new TransactionRequiredException()
79
2.2 Transactions
Granularité des transactions
NEVER
L’appelant ne doit pas s’exécuter dans une transaction
Erreur
throw
new EJBException()
or new RemoteException()
80
2.2 Transactions
Définition des transactions
2 modes
CMT
81
2.2 Transactions
Définitions des transactions – CMT
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class MyBean implements MyBeanItf {
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void transfert() {
try {
Account a1 = em.find(Account.class,"Bob");
Account a2 = em.find(Account.class,"Anne");
a1.credit(10.5);
a2.widthdraw(10.5);
}
catch( Exception e ) {
sc.setRollbackOnly();
} }
@PersistenceContext
private EntityManager em;
@Resource
private SessionContext sc; }
82
2.2 Transactions
Définition des transactions
BMT
• démarcation explicite avec begin/commit/rollback
• avantage : possibilité granularité plus fine qu'en CMT
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class MyBean implements MyBeanItf {
public void transfert() {
try {
ut.begin();
Account a1 = em.find(Account.class,"Bob");
Account a2 = em.find(Account.class,"Anne");
a1.credit(10.5); @PersistenceContext
a2.widthdraw(10.5); private EntityManager em;
ut.commit();
} @Resource
catch( Exception e ) { ut.rollback(); } } private UserTransaction ut; }
83
2.3 Sécurité
Service de sécurité
À base de rôles
5 annotations
javax.annotation.security.PermitAll
javax.annotation.security.DenyAll
javax.annotation.security.RolesAllowed
javax.annotation.security.DeclareRoles
javax.annotation.security.RunAs
84
2.3 Sécurité
85
2.3 Sécurité
Service de sécurité
Exemple
@Stateless
@RolesAllowed("javaee")
public class HelloEJB implements Hello {
@PermitAll
public String hello(String msg) { return "Hello, " + msg; }
public String bye(String msg) { return "Bye, " + msg; }
}
86
2.3 Sécurité
Service de sécurité
Exemple 2
@Stateless
@DeclaresRoles({"A", "B"})
public class HelloEJB implements Hello {
@Resource private SessionContext sc;
public String hello(String msg) {
if (sc.isCallerInRole("A") && !sc.isCallerInRole("B")) {
...
} else {
...
} } }
•hello : accessible par ceux qui sont dans le rôle A mais pas dans le rôle B
87
Plan
1. Composant EJB
1.1 Session Bean
1.2 Entity Bean
1.3 Message Driven Bean
1.4 Fonctionnalités avancées
2. Services
2.1 Annuaire
2.2 Transaction
2.3 Sécurité
3. Conclusion
88
4. Conclusion
Java EE
Apports
- prise en charge des services techniques par la plate-forme
- le composant se focalise sur le métier
- packaging& déploiement
Mais
- uniquement Java
- nombreux domaines applicatifs concernés par la répartition non couverts par Java EE
temps-réel, embarqué, mobilité, CAO, infographie, …
- déploiement sur un seul serveur à la fois
89
4. Conclusion
EJB Lite : Uneversion allégée des EJB
90
4. Conclusion
Commerciaux
•WebSphere IBM www-01.ibm.com/software/webservers/appserv/wasproductline/
•WebLogic BEA www.weblogic.com
• App Server Borland www.borland.com/appserver
•iPortal IONA www.iona.com/products
• Oracle, Sybase, HP, Fujitsu, ATG, Hitachi, Macromedia, SilverStream, ...
Voir http://www.oracle.com/technetwork/java/javaee/community/
Open source
• Java EE 6 (Sun) http://download.oracle.com/javaee/6/
•JOnAS (ObjectWeb) jonas.ow2.org
•JBoss (Red Hat) www.jboss.org
• Geronimo (Apache) geronimo.apache.org
•Jfox www.huihoo.org/jfox
91
4. Conclusion
Ressources
92