Académique Documents
Professionnel Documents
Culture Documents
2èmes Années
GI - SIG
Ecole Hassania des Travaux publics
Karim Guennoun
1
Le framework java
Comporte 3 éditions:
– JSE: Java Standard Edition destinée au
développement d’applications locales
exécutables sur des ordinateurs personnels
– JEE: Java Enterprise Edition destinée au
développement d’applications distribuées
impliquant des serveurs
– JME: Java Micro Edition destinée au
développement d’applications embarquées pour
les terminaux mobiles.
2
La plateforme JEE
4
Exemple d’une architecture JEE
Container
EJB
Serveur Web Serveur BD
Requêtes relationnel
HTTP JSP
Client léger BD
EJB
Servlets EJB
EJB
EJB
8
Les clients applicatifs
9
Les clients Web
12
Les servlets
14
Les composants Java
Bean
15
Les EJB
16
Les EJB
17
Les composants
gestion de ressources
18
La gestion de ressources
20
Les containers
Le container EJB
– Gère l’exécution des EJBs.
– Les EJBs et leurs containers s’exécutent au sein du serveur JEE
– La majorité des serveurs JEE offrent des containers EJB intégrés
Le container Web
– Gère l’exécution des servlets et des JSPs
– Les composants Web et leurs containers s’exécutent au sein du
serveur JEE
23
Présentation de l’API
JEE
24
Quelques éléments de l’API
28
C’est quoi une servlet?
29
Fonction
– Garbage collector
31
Fonctionnement d’une servlet
33
Fonctionnement d’une servlet
utilisant le protocole HTTP
Tomcat (apache)
36
Rôle du serveur Web
41
Le manager de Tomcat
url: http://localhost:8080/manager/html
Permet de gérer le cycle de vie des composants
Web
Par défaut, il faut positionner un administrateur
avec le rôle manager
Aller sur le fichier TomcatRep/conf/tomcat-
users.xml
Rajouter un utilisateur avec la balise
– <role rolename="manager-gui"/>
42 – <user username="karim" password="karim" roles="manager-gui"/>
L’API Servlet
43
Les packages
Deux packages
– javax.servlet:
Permet de développer des servlets génériques
indépendantes du protocole d’interaction
– javax.servlet.http
Permet de développer des servlets interagissant avec le
protocole HTTP
44
Le package
javax.servlet
45
Les interfaces
46
Les classes
47
Les exceptions
48
L’interface Servlet
Méthodes
– ServletInputStream getInputStream()
– BufferedReader getReader()
– Permettent d'obtenir un flux pour les données de
la requête
50
L’interface ServletResponse
Méthodes
– SetContentType: Permet de préciser le type de la
réponse
/text/html pour une page html
– ServletOutputStream getOutputStream()
Permet d'obtenir un flux pour envoyer la réponse
– PrintWriter getWriter()
Permet d'obtenir un flux pour envoyer la réponse
51
Exemple simple
52
Implémentation d’une servlet
54
Implémentation des méthodes de
l’interface Servlet
55
La méthode service
public void service (ServletRequest req, ServletResponse res )
throws ServletException, IOException {
res.setContentType( "text/html" );
PrintWriter out = res.getWriter();
out.println( "<HTML>" );
out.println( "<HEAD>");
out.println( "</HEAD>" );
out.println( "<BODY>" );
out.println( "<H1 align=\"center\">Je suis content ma premiere Servlet me
repond:</H1>" );
out.println( "<H2>Bonjour</H2>" );
out.println( "</BODY>" );
out.println( "</HTML>" );
56
out.close();}}
Déploiement de la servlet sous
tomcat
57
Compilation de la servlet
Déployer la servlet
– Copier le fichier MaPremiereServlet.class dans le
répertoire
CheminTomcat\webapps\servlets-examples\WEB-INF\classes
– Modifier le descripteur de déploiement, fichier :
CheminTomcat\webapps\servlets-examples\WEB-INF\web.xml
59
Modification du descripteur
Rajouter l’élément
– <servlet>
<servlet-name>MaPremiereServlet</servlet-name>
<servlet-class>MaPremièreServlet</servlet-class>
</servlet>
– Permet de définir une servlet à déployer
– Spécifie le nom de la classe java associée
– Spécifie le nom attribué à cette servlet
60
Modification du descripteur
web.xml
Rajouter l’élément
– <servlet-mapping>
<servlet-name>MaPremiereServlet</servlet-name>
<url-pattern>/MaPremiereServlet</url-pattern>
</servlet-mapping>
– Spécifie le nom de la servlet concernée
– Spécifie l’url par laquelle elle est accessible à distance
61
Exécution
Lancer Tomcat
Ouvrir le bowser
Envoyer une requête à la servlet sur l’url:
– http://localhost:8080/examples/MaPremiereServlet
Personnaliser les messages bonjour et appeler
la servlet du voisin
– http://adresseIP:8080/examples/MaPremiereServlet
62
Les servlets HTTP
Le package
63
La classe HttpServlet
64
Interaction avec les servlets http
Les interfaces
– HttpServletRequest: Hérite de ServletRequest et
définit un objet contenant une requête selon le
protocole http
– HttpServletResponse: Hérite de ServletResponse
et définit un objet contenant la réponse de la
servlet
– HttpSession: Définit un objet qui représente une
session
66
Un petit exemple
67
Implémentation d’une servlet http
68
Une servlet http qui dit bonjour
69
Implémentation de la méthode Get
71
Déploiement de la servlet sur
Tomcat5.5
Déployer la servlet
– Copier le fichier MaDeuxiemeServlet.class dans le
répertoire
CheminTomcat\webapps\servlets-examples\WEB-INF\classes
– Modifier le descripteur de déploiement, fichier :
CheminTomcat\webapps\servlets-examples\WEB-INF\web.xml
72
Modification du descripteur
web.xml
Rajouter l’élément
– <servlet>
<servlet-name>MaDeuxiemeServlet</servlet-name>
<servlet-class>MaDeuxiemeServlet</servlet-class>
</servlet>
73
Modification du descripteur
web.xml
Rajouter l’élément
– <servlet-mapping>
<servlet-name>MaDeuxiemeServlet</servlet-name>
<url-pattern>/MaDeuxiemeServlet</url-pattern>
</servlet-mapping>
74
Exécution
75
Utilisation des
formulaires
76
Une servlet http qui dit bonjour en
réponse à un formulaire
77
Implémentation de la méthode Get
78
Implémentation de la méthode Get
…
out.println("<body>");
out.println("<FORM ACTION=\"http://localhost:8080/servlets-
examples/MaTroisiemeServlet\" METHOD=\"POST\">");
out.println("<H3> Votre nom s il vous plaît:");
out.println("<INPUT NAME=\"NOM\">");
out.println("<INPUT TYPE=\"SUBMIT\" Value=\"envoyer\">");
out.println("</FORM>");
out.println("</body>");
out.println("</html>");
}
79
Implémentation de la méthode
Post
80
Implémentation de la méthode
Post
…
out.println( "<BODY>" );
out.println( "<H1 align=\"center\">Je suis content ma Troisième
Servlet me répond personellement!</H1>" );
out.println( "<H2>Bonjour "+request.getParameter("NOM")+"</H2>" );
out.println( "</BODY>" );
out.println( "</HTML>" );
out.close();
}
}
81
Déploiement de la servlet sur
Tomcat5.5
Déployer la servlet
– Copier le fichier MaTroisiemeServlet.class dans le
répertoire
CheminTomcat\webapps\examples\WEB-INF\classes
– Modifier le descripteur de déploiement, fichier :
CheminTomcat\webapps\examples\WEB-INF\web.xml
82
Modification du descripteur
Rajouter l’élément
– <servlet>
<servlet-name>MaTroisiemeServlet</servlet-name>
<servlet-class>MaTroisiemeServlet</servlet-class>
</servlet>
83
Modification du descripteur
Rajouter l’élément
– <servlet-mapping>
<servlet-name>MaTroisiemeServlet</servlet-name>
<url-pattern>/MaTroisiemeServlet</url-pattern>
</servlet-mapping>
– Spécifie le nom de la servlet concernée
– Spécifie l’url par laquelle elle est accessible à distance
84
Exécution
85
Un petit exercice:
– import= "{package.class}":
Permet de spécifier les packages à importer pour le
code java inclus dans la jsp
– info="Les infos":
permet de spécifier la chaîne de caractères renvoyée
par la méthode getServletInfo
– isThreadSafe="true|false":
permet de spécifier au serveur web le mode
d’interaction de la servlet générée (un seul traitement de
requête à la fois ou plusieurs en parallèle)
– …
La directive include
Syntaxe:
– <%@ include file="chemin du fichier" %>
Permet d’inclure un fichier dans le code source de la jsp
Ce fichier peut correspondre à
– Du code HTML (ne contenant pas les balises HTML et BODY)
– Un fragment de jsp
– Du code java
Permet de réutiliser le même fragment
Avant génération du code de la servlet, le fragment est
inclus
Une mini démo
Syntaxe :
– <%! Declaration %>
Permet de déclarer des variables et des
méthodes
Ne génère pas de code HTML dans la JSP
Les tags d’expression
Syntaxe:
– <%= expression à évaluer%>
L'expression est évaluée et convertie en
chaîne avec un appel à la méthode toString()
Le résultat est inclus dans la page générée
Mini démo
Syntaxe:
– <% code java %>
Permettent d’insérer du code java dans la
méthode service de la servlet générée
Le code doit contenir exclusivement du java
– Pas de balises HTML ou jsp
Petite démo
113
Un EJB, c’est quoi?
11
8
Bénéfices des EJBs
Transactions (2/3)
11
9
Bénéfices des EJBs
Accès concurrents (3/3)
12
0
Les types des EJBs
Session:
– Réalisent des tâches pour le client
– Peuvent implémenter des services Web
Entity:
– Représentent un objet relatif à une entité
business avec un stockage persistant
Message-Driven:
– Réalisent des tâches pour le client
12 – Traitent des interactions asynchrones
1
Les beans Session
12
2
Tout d’abord, c’est quoi?
13
0
C’est quoi?
– Container-managed
Le container de l’EJB génère automatiquement les
appels d’accès à la base de données.
13 Le code de l’EJB ne contient pas ces appels
4
Les accès partagés
13
9
C’est quoi?
14
5
Avant tout:
Qui fait quoi?
14
6
Les rôles dans la production
d’applications EJB
15
1
Liens entre les rôles
Bean Provider Administrateur Gère l’exécution
de l’application
Construit
des EJBs
Déploie
l’application
Construit
l’application
15
Assembleur Déployeur
2
L’avant version 3
15
3
La vision EJB
15
8
L’interface Home
Fichier XML
Permet d’informer le container des besoins
niveau middleware
– Gestion du cycle de vie
– Contrôle des transactions
– Sécurité..
16
0
Le fichier Ejb-jar
Un package jar
Après la génération des classes et des
interfaces home et remote et du descripteur
de déploiement, le tout est compressé dans
un fichier jar
C’est ce fichier qui est transmis par le bean
provider à l’assembleur de l’application (pour
la phase de déploiement)
16
1
Fichiers d’implémentation des EJBs
Interfaces
Home
Interface
Local
Interfaces
Remote
16 Descripteur
Déploiement
2
Exemple de
développement selon
EJB2.1
HelloWorld
16
3
Implantation de l’application
Bonjour avec EJB2.1
16
6
L’interface local
16
8
Le code
17
2
Le descripteur, suite
– <enterprise-beans>
– <session>
– <ejb-name>BonjourEJB</ejb-name>
– <home>BonjourHome</home>
– <remote> Bonjour</remote>
– <local-home> BonjourLocalHome<local-home>
– <local>BonjourLocal</local>
– <ejb-class> BonjourBean</ejb-class>
– <session-type>Stateless</session-type>
– <transaction-type>Container</transaction-type>
– </session>
17 – </enterprise-beans>
3 – </ejb-jar>
Le code du client
import javax.naming.Context;
import javax.naming.InitialContext;
public class LeClient{
public void main() throws Exception{
context ctx=new InitialContext();
BonjourHome bh=((BonjourHome) ctx.lookup("BonjourHome"));
Bonjour bonjour =bh.create();
System.out.println(bonjour.bonjour());
bonjour.remove();
}
17
4
Les limitations du 2.1
17
5
Fichiers de code dans 2.1
17
6
Rappel des utilités de l’interface
home (les stateless)
17
8
Utilités de la séparation
local/Remote
18
4
De la version 2 à la version 3
19
0
RMI-IIOP
1: Création
d’un objet Services implicites
CLIENT EJB EJB HOME
du container
5: appeler l’API du
9: retour de la méthode container pour les
services avant invocation
2: Création d’une
8: appeler l’API du
instance EJB
container pour les
services après invocation
4: Appeler 6: invocation de
une méthode EJB la méthode
EJB CLASS
OBJECT
19 7: retour de la
méthode
5
Architecture dans la version 3
1:Appel de
méthode Interface Services implicites
CLIENT
Business du container
3: appeler l’API du
container pour les
services avant invocation
2: invocation de
5: appeler l’API du
la méthode
container pour les
services après invocation
4: invocation de
6: retour de la méthode Classe la méthode
d’encapsulation EJB CLASS
(container)
19
6
Les annotations
19
8
Exemple: l’application bonjour
A faire maintenant:
– Ecrire le code de l’interface business et de la
classe bean
– Compiler les sources java
– Produire un descripteur de déploiement
– Créer l’Ejb-jar
– Déployer l’Ejb-jar
– Ecrire le code du client
19
9
L’interface business
20
0
La classe du bean
20
3
Gestion des instances par le container
21
0
L’interface business
package lesStatefuls
public interface Compter
{
public int LeCompte();
public void set(int val);
public void remove();
}
21
1
Remarques
package lesStatefuls;
import javax.ejb.*;
import javax.interceptor.*;
@Stateful
@Remote(Compter.class)
public class CompterBean implements Compter
{
private int val;
public int LeCompte()
{
System.out.println("Je compte!");
21 return ++val;}
3
La classe du bean (2/2)
21
6
Le Client
package LesStatefuls;
import javax.naming.*;
public class LeClient{
public static final int nbrClients=3;
public static void main(){
try{
Context ctx=new InitialContext();
21
7
Le Client
22
0
Java Persistence?
22
2
Le mapping objet-relationnel
22
Elles peuvent être utilisées dans un contexte
7
JEE ou JSE
Exemple: classe de l’entité
package entites;
import java.io.Serialisable;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Compte implements Serializable{
@Id
public int NumeroCompte;
22 public int Solde;
8
Exemple
public Compte(){
NumeroCompte=(int) System.nanoTime();
}
public void crediter(int val){
Solde+=val;
}
}
22
9
Remarques
package entites;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.PersistenceContext;
import javax.persistence.EntityManager;
import javax.persistence.Query;
@Stateless
23 @Remote(Banque)
2 public class BanqueBean implements Banque{
Exemple
@PersistenceContext
private EntityManager manager;
public List<Compte> listAccounts(){
Query q=manager.createQuery("SELECT a FROM Compte a");
return q.getResultList();
}
public int getSolde(int num)
{
Compte c=manager.find(Compte.class,num);
return c.Solde;
23 }
3
Exemple
public Compte ouvrir(int s)
{
Compte c=new Compte();
c.Solde=s;
Manager.persist(c);
return c;
}
public void fermer(int num)
{
Compte c=manager.find(Compte.class,num);
manager.remove(c);
}
public void crediter(int num, int somme)
{
Compte c=manager.find(Compte.class,num);
23 c.deposer(somme);
4 }
}
Remarques
package entites
import javax.ejb.Remote;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;
@Stateful
@Remote(CompteRemote.class)
Public class Compte implements CompteRemote{
23
7
Accès via un stateful (2/3)
@PersistenceContext(type=PersistenceContextType.EXTENDED,
unitName="intro")
private EntityManager manager;
private Compte cmpt=null;
Invocation unique
– Bean session: stateless
– Contexte de persistance: TRANSACTION
24
1
Les unités de persistance (1/2)
Exemple simple
– <?xml version="1.0" encoding="UTF-8"?>
– <persistence
xmlns="http://java.sun.com/xml/ns/persistence">
– <persistence-unit name="intro"/>
– </persistence>
Il faut fournir au moins une unité de persistance
Il est possible d’en définir plusieurs (c’est le nom
24 qui va permettre d’indiquer lequel est utilisé)
3
L’API EntityManager
New()
new
persist()
refresh()
remove()
managed removed
persist()
Exemple
– Dans la classe de l’entité
@Entity
@EntityListeners(Ecouteur.class)
public class Compte{….
– Dans la class Ecouteur
@PrePersist
void AvantEnregistrement(Compte c) {
System.out.println("l’entité va être synchronisée avec la
25 base");
1 }
Les méthodes de synchronisation
25
5
Problématique
Deux phases
– Phase une:
commence par l’envoie d’un message « avant commit »
Dernière chance pour les ressources de faire échouer la
transaction
– Si une des ressources échoue, toute la transaction est
supprimée, pas de mise à jour des données
– Sinon, la transaction continue et ne peut être stoppée
– Toutes les mises à jours sont logées dans un journal persistant
– Phase deux:
26 Réalisée seulement si la phase une est complétée. Tous les
gestionnaires de ressources réalisent les mises à jour de
4
données
Object Transaction Service
La technologie EJB réutilise les concepts définies
dans CORBA pour l’implantation des services de
support des transactions
Le service standard spécifié par l’OMG s’appelle
OTS (Object Transaction Service)
– Service optionnel de CORBA
– Un ensemble d’interfaces utilisé par les transactions
managers, les gestionnaires de ressources, les objets
transactionnels pour collaborer
26
Le service JTS utilisé dans les EJBs comme une
5
L’API Java Transaction (JTA)
Serveur
d’application
JTS
26 OTS 1.1
8
Le système d’abstraction des
transactions
Code
Client
Le container EJB
1: Appel Classes du
container 2: Délégation
méthode
implémentant du traitement
business 3: Appel du
le bean
begin
Le bean Service
transaction
5: Appel du
commit ou du
abort
27 4: Réalisation
des opérations
1 business
Container-Managed
Code
Client
Le container EJB
1: Appel
méthode Classes du 2: Appel du
business container begin
implémentant 5: Appel du commit
Service
le bean ou du abort
transaction
3: Délégation
Le bean
du traitement
27 4: Réalisation
des opérations
3 business
Client-controlled
Le container EJB
1: Appel du
Code begin
Client 5: Appel du commit
Service
ou du abort
transaction
2: Appel Classes du
méthode container 3: Délégation
Le bean
business implémentant du traitement
le bean
27 4: Réalisation
des opérations
4 business
Le choix du style
Bean-managed
– Le développeur possède un contrôle total
– Possibilité de définir plusieurs mini transactions à l’intérieur
du même méthode
Container-managed
– Robustesse
– Allègement et gain en temps de développement
Client-controlled
– Permet de prendre en compte les défaillances sur les
communications client-bean (RemoteException)
27
– Si crash impossibilité de savoir si la transaction a réussi ou
5 a échoué sans rajouter du code
Le transactions gérées
par le container
27
6
Attributs des transactions EJB
Required:
– permet de spécifier que le bean s’exécute toujours à
l’intérieur d’une transaction
– Si une transaction existe déjà, il s’inscrit dedans
– Sinon, une nouvelle transaction est démarrée par le
container
RequiresNew:
– Exige la création d’une nouvelle transaction pour le bean
– Si une transaction existe déjà, elle est suspendue
27
8 – Après la fin de la transaction du bean, celle-ci peut
Valeurs des attributs
Supports:
– Si une transaction existe déjà, le bean s’exécute à
l’intérieur de cette transaction
– Sinon, il s’exécute en dehors de toute transaction
Mandatory
– Le bean doit s’exécuter dans une transaction pré-
existante
– Si une transaction existe déjà, le bean s’exécute à
l’intérieur de cette transaction
27
– Sinon, l’exception
9
javax.ejb.EJBTransactionRequiredException est levée
Valeurs des attributs
NotSupported
– Le bean ne peut être impliqué dans aucune
transaction
– Si une transaction existe, elle est suspendue
jusqu’à la fin de l’exécution du bean
Never
– Le bean ne peut être impliqué dans aucune
transaction
28 – Si une transaction existe, le container lève
0 l’exception javax.ejb.EJBException
Résumé
Attribut Transaction du client Transaction du bean
Required Aucune T2
T1 T1
RequiredNew Aucune T2
T1 T2
Supports Aucune Aucune
T1 T1
Mandatory Aucune Exception
T1 T1
NotSupported Aucune Aucune
T1 Aucune
28
Never Aucune Aucune
1 T1 Exception
Exemple CMT
import javax.ejb.*;
import javax.annotation.Resource;
import javax.persistence.PersistenceContext;
import javax.persistence.EntityManager;
@Stateless
@TransactionManagement(javax.ejb.TransactionManagementType.
CONTAINER)
public class banqueBean implements banque{
@PersistenceContext private EntityManager em;
28 @Resource private SessionContext ctx;
2
Exemple CMT
@TransactionAttribute(javax.ejb.transactionAttributeType.Required)
public void virement(float montant, int A_Debiter, int A_Crediter)
{
Compte c1=em.find(Compte.class,A_Debiter);
Compte c2= c1=em.find(Compte.class,A_Crediter);
if(c1.Solde<montant)
{ctx.setRollbackOnly();}
c1.retrait(montant);
c2.depot(montant);
em.persist(c1);
28 em.persist(c2);
3 }}
Descripteur de déploiement
équivalent
<?xml version="1.0" encoding=" UTF-8" ?>
<ejb-jar
xmlns=" http://java.sun.com/xml/ns/JEE"
xmlns:xsi =" http://www.w3.org/2001/XMLScheam-instance"
xsi:schemaLocation= " http://java.sun.com/xml/ns/JEE
http://java.sun.com/xml/ns/JEE/ejb-jar_3_0.xsd"
Version="3.0" >
<entreprise-beans>
– <session>
– <display-name>banqueBean</display-name>
– <ejb-name>banqueBean</ejb-name>
28 – <business-remote>banque</business-remote>
– <ejb-class>banqueBean</ejb-class>
4 – <session-type>Stateless</session-type>
Descripteur de déploiement
équivalent
– <transaction-type>Container</transaction-type>
– </session>
<entreprise-beans>
<assembly-descriptor>
– <container-transaction>
– <method>
– <ejb-name>banqueBean</ejb-name>
– <method-name>virement</method-name>
– </method>
– <trans-attributs>Required<trans-attribute>
– </container-transaction>
</assembly-descriptor>
28
</ejb-jar>
5
FIN
28
6