Académique Documents
Professionnel Documents
Culture Documents
Cours JEE 1 PDF
Cours JEE 1 PDF
Cours JEE 1 PDF
Avertissement :
- ce document est une reprise dune partie dun document crit par Serge Tah. En particulier la
base de donnes utilise.
- une mise jour important a t faire par Michael Plan (plan.michael@gmail.com)
Ce support de cours concerne la mise en place dune application JEE avec un client.
JDBC : cette couche gre la connexion avec la (ou les) base(s) de donnes. Ici on utilisera la notion
de pool de connexion. Un pool de connexion est un ensemble de connexions avec la base de
donnes dj instancies. Cela permet aux requtes de sexcuter plus rapidement. On peut venir
connecter plusieurs couches JPA sur la couche JDBC si ncessaire.
JPA : la couche JPA (Java Persistence Annotation) est une couche dabstraction de la couche
JDBC. Elle permet notamment de faire du Mapping Relationnel-Objet (ORM, Object-Relationnal
Mapping en anglais) qui consiste modliser la base de donnes sous forme dobjets pour une
manipulation plus simple travers le code Java (requtes pr-crites, gestion des liens entre les
tables,). Gnralement la couche JPA contient une classe (entit) par table, des contrleurs
(fonctions de base implmentes) et des gestionnaires dexceptions.
DAO : Cette couche reprsente lintelligence de lapplication. Elle est compose dun ensemble
dinterfaces locales (local) et distantes (remote). Les DAO (Data Access Object) permettent
1
daccder aux objets et proposent des mthodes de CRUD (Create, Read, Update, Delete). Un EJB
(Entreprise Java Bean) sera pilot partir dune autre application distante ou locale (client EJB).
Web Services : Cette couche a pour but de dfinir des services qui pourront tre appels selon le
protocole SOAP. Ainsi les informations pourront circuler entre les applications sous forme de
messages XML. Cela peut servir faire communiquer deux applications qui peuvent tre codes
dans deux langages diffrents, en local ou distance.
2
1) Tlchargement de MySQL
Choisir ensuite votre systme dexploitation. Par exemple Windows 32 bits et lancer le
tlchargement.
Aprs un questionnaire (un peu long ) vous demandant de vous identifier, vous pourrez accder
la page de tlchargement.
3
Ou vous pouvez cliquer sur le lien No thanks, just take me to the downloads!
4
Remarquons que pendant linstallation, nous avons accs au numro de port (par dfaut 3309).
Si linstallation se passe bien elle devrait se terminer par lcran qui suit :
5
1.3. Tlchargement et Installation de MySQL WorkBench
Cet outil nest pas indispensable mais trs efficace et permet de manipuler MySQL de manire trs
simple. Il est vivement recommand de linstaller. Cette interface graphique est en fait une couche
de manipulation de MySQL.
6
Lancer linstallation
7
1.4. Cration dune base de donnes
8
En cliquant sur Add Table on peut ajouter une table qui par dfaut porte le nom table1.
9
Modifions ensuite le nom de la table en EMPLOYE et validons. Nous pouvons ensuite facilement
ajouter les champs NOM, PRENOM et AGE.
Sauvegarder le modle.
10
1.5. Cration dune base de donnes laide dun script
Utilisez le numro de port par dfaut donn lors de linstallation de MySQL (3306, 3309,).
Puis tester la connexion.
11
Au retour sur lcran principal, double-cliquez sur localhost . Une nouvelle fentre de SQL
Query souvre.
12
Donner un nom la base de donnes : par exemple base_medecin.
Valider les diffrentes tapes. La base_medecin apparat ensuite dans la colonne de gauche.
13
Et choisir le fichier createbd.sql (cf. Fichier joint) :
14
Assurez-vous davoir slectionner Et finalement excuter le script.
base_medecins dans la partie Default.
15
1.6) Tlcharger et Installer Netbeans
Avant de tlcharger Netbeans, il est important dinstaller un JDK sur sa machine. Il sagit dun
ensemble de librairie Java pour le dveloppement.
Pour ce tutorial, nous avons utilis la version 1.6.21 du JDK :
fc.isima.fr/~phan/WebService/jdk-6u21-windows-i586.zip
Comme utilitaire de dveloppement, nous allons utiliser NetBeans 6.9. Il sera ncessaire davoir au
minimum la version Java (avec le serveur Glassfish intgr).
Lien pour le tlchargement :
fc.isima.fr/~phan/WebService/netbeans-6.9-ml-java-windows.exe.zip
Suivez le guide dinstallation jusqu lendroit o lon vous demande de choisir un rpertoire
dinstallation de Glassfish. ce moment l prenez soin de prciser un chemin daccs sans
espace. Pour les utilisateurs de Windows nous conseillons : C:\glassfish3 (Ceci permettra
dviter un bug des versions rcentes de Glassfish et Java).
16
1.7) Configurer Netbeans
Dans la section Drivers, choisir MySQL et par un clic droit faire Connect Using.
17
Et choisir la base base_medecin.
18
Si la connexion russie, on obtient alors :
19
Partie 2. Cration dun EJB
Nous venons de crer la base de donnes et de configurer la partie SGBD. Nous nous intressons
la dfinition du conteneur EJB.
20
21
2.2. Cration dune ressource JDBC au serveur Glassfish
22
Maintenant nous allons donner un nom JNDI (Java Naming and Directory Interface) notre
ressource. Ce nom sera celui utilis par le serveur dapplication pour retrouver la ressource.
Afin dviter toute confusion, le nom JNDI sera jdbc/base_medecin_JNDI:
23
Dautre part, le pool de connexion sera nomm : base_medecin_pool.
Pour cela, faire dans un premier temps Next>.
24
Si on examine le fichier sun-resources.xml, on trouve toute les informations de connexion la base.
25
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource
Definitions //EN" "http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd">
<resources>
<jdbc-resource enabled="true" jndi-name="jdbc/base_medecin_JNDI" object-type="user" pool-
name="connectionPool">
<description/>
</jdbc-resource>
<jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false"
connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10"
connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-
method="auto-commit" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" fail-all-
connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-
isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-
enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-
wait-time-in-millis="60000" name="connectionPool" non-transactional-connections="false" pool-resize-
quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8"
validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
<property name="URL" value="jdbc:mysql://localhost:3309/base_medecin"/>
<property name="User" value="root"/>
<property name="Password" value="admin"/>
</jdbc-connection-pool>
</resources>
26
2.3. Cration dune unit de persistance
Elle va configurer la couche JPA. Dans notre cas, nous allons utiliser limplmentation propose par
Eclipse.
Dans un premier temps nous allons crer une unit de persistance (faire Clic Droit sur
EJBModule1 et choisir New->Others).
27
Attention ne pas choisir une stratgie englobant la gnration des tables. Elles existent dj grce
au script SQL que nous avons utilis au dpart.
28
Dans la partie Configuration Files , le fichier persistence.xml apparat.
29
Dans un deuxime temps, nous allons crer des entits JPA. Comme prcdemment faire Clic
Droit / New / Other.
30
31
32
Etant donn quil sagit de la gnration dentits JPA, on peut choisir jpa comme nom de package.
Veuillez bien choisir java.util.List pour Collection Type (pour avoir plus de lisibilit).
33
Rappel :
java.util.List : il sagit dune extension de collection fournissant les mthodes pour manipuler des
listes ordonnes.
Les entits JPA gnres apparaissent. Une entit pour chaque table de la base de donnes
Dans la classe Rv nous ajoutons un nouveau constructeur permettant de crer un rendez vous en
donnant une date, un client et un jour.
Afin dviter davoir des rfrences circulaires qui peuvent gnrer des boucles infinies (notamment
lors de la conversion en XML par les web services), il est ncessaire dajouter le mot cl
transient dans les classes Creneaux, Medecins et Clients, lendroit o elles mappent avec
dautres objets sous forme de listes.
34
Clients.java
Medecins.java
Creneaux.java
Dans ce package, crer ensuite une classe java nomm par exemple : MedecinException.
35
Le code de cette classe pourrait tre celui-ci :
package medecin.exception;
import javax.ejb.ApplicationException;
@ApplicationException(rollback=true)
// champs privs
private int code = 0;
// constructeurs
public MedecinException() {
super();
}
public MedecinException(String message) {
super(message);
}
public MedecinException(String message, Throwable cause) {
super(message, cause);
}
public MedecinException(Throwable cause) {
super(cause);
}
public MedecinException(String message, int code) {
super(message);
setCode(code);
}
public MedecinException(Throwable cause, int code) {
super(cause);
setCode(code);
}
public MedecinException(String message, Throwable cause, int code) {
super(message, cause);
setCode(code);
}
// getters and setters
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
}
36
2.4.bis Cration dun nouveau projet (Ajout de Michael Plan)
37
Faire glisser le package jpa dans le dossier Packages de sources du projet JavaLibrary4 ,
pour obtenir larborescence suivante (ne pas faire attention aux erreurs) :
Ajouter la rfrence du projet JavaLibrary4 dans le projet EJBModule2 . Pour cela, faire
clic droit sur EJBModule2 > Proprits
38
Cliquer sur Add Project et slectionner JavaLibrary4
Cliquer sur OK
39
2.5. Cration de la couche daccs aux entits JPA : Beans Session
Elle va utiliser la couche JPA. Dans notre cas, nous allons utiliser limplmentation propose par
EclipseLink.
40
41
42
Le projet se prsente alors comme suit :
43
Cet ensemble de classes, contient des interfaces distantes et locales pour implmenter les mthodes
du CRUD. Rappelons que CRUD dsigne les quatre oprations de base pour la persistance des
donnes, en particulier le stockage d'informations en base de donnes. Soit : Create, Read (ou
Retrieve), Update et Delete (ou Destroy).
Enfin nous allons crer un package nomme dao, qui reprsente linterface de lEJB pour laccs
aux donnes.
44
Le projet se prsente alors comme suit :
45
Ajoutons une Session Bean dans le package dao. Cette interface va permettre davoir plusieurs
mthodes sur une seule interface (contrairement aux classes du package ejb qui sont en fait une
interface par entit).
Rappels :
Stateless : Ltat du Bean nest pas conserv. Sa dure de vie correspond la dure de vie dune
requte utilisateur (ex : Calculatrice).
Stateful : Ltat du Bean est conserv. Sa dure de vie correspond la dure de vie dune session
utilisateur (ex : Panier dachat).
46
47
Fusionner maintenant les packages dao et ejb du projet JavaLibrary4 dans les packages de
mmes noms de EJBModule2 (dragndrop de leur contenu).
De la mme faon, dplacer le package jpa depuis JavaLibrary4 vers EJBModule2.
48
Ainsi le package Dao contient 4 fichiers comme indiqus ci-dessous :
49
Le fichier Idao.java
package dao;
import java.util.*;
import jpa.*;
IdaoLocal.java
package dao;
import javax.ejb.Local;
@Local
public interface IdaoLocal extends Idao{
}
IdaoRemote.java
package dao;
import javax.ejb.Remote;
@Remote
public interface IdaoRemote extends Idao {
}
DaoJpa.java
package dao;
import javax.ejb.Stateless;
import javax.*;
import jpa.*;
import java.util.*;
import javax.ejb.*;
import javax.persistence.*;
import java.text.*;
//import javax.transaction.Transaction;
import medecin.exception.*;
@Stateless(mappedName = "Interface")
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class DaoJpa implements IdaoLocal, IdaoRemote {
50
@PersistenceContext
private EntityManager em;
// ajout d'un Rv
// jour : jour du Rv
// creneau : crneau horaire du Rv
// client : client pour lequel est pris le Rv
public Rv ajouterRv(String jour, Creneaux creneau, Clients client) {
try {
Rv rv = new Rv(new SimpleDateFormat("yyyy:MM:dd").parse(jour), client, creneau);
em.persist(rv);
return rv;
} catch (Throwable th) {
throw new MedecinException (th, 5);
}
}
// suppression d'un Rv
// rv : le Rv supprim
public void supprimerRv(Rv rv) {
try {
em.remove(em.merge(rv));
} catch (Throwable th) {
throw new MedecinException (th, 6);
}
}
51
}
// rcuprer un Rv donn
public Rv getRvById(Long id) {
try {
return (Rv) em.find(Rv.class, id);
} catch (Throwable th) {
throw new MedecinException (th, 9);
}
}
Avant de compiler assurez-vous que les Dautre part, il faut inclure la librairie MySQL :
librairies EclipseLink sont incluses dans le
projet :
52
Le fichier cr doit contenir le texte suivant :
java.naming;factory.initial = com.sun.enterprise.naming.SerialInitContextFactory
java.naming.factory.url.pkgs = com.sun.enterprise.naming
java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl
53
4) Dploiement de lEJB
54
4.3. Dployer
Ensuite, le dploiement a russi et on peut constater que lEJB a t ajout la partie Applications
du serveur Glassfish.
55
56
Partie 3. Cration dun Web Service
3.1. Cration du projet
57
Parmi les frameworks installs vous pouvez par exemple choisir Java Server Faces ou ne rien
choisir (il ny aura pas dexemple dutilisation du framework dans ce tutorial).
Faire un clic droit sur la partie librairies de lapplication Web et choisir Add Jar
Choisir ensuite EJBModule1.jar.
58
Le projet WebApplication1 devrait se prsenter comme suit :
Il est possible de stocker cette classe dans un package rendezvous par exemple.
59
Utilisez le bouton parcourir pour slectionner linterface sur laquelle on va crer le service web.
Slectionner DaoJpa.
60
Utilisons comme nom WSDaoJpa.
Valider le choix pour revenir la dfinition du web service.
61
Pour crer le web service, nous allons faire une couche devant la partie DaoJpa de lEJB. Rappelons
que la partie DaoJpa contient un ensemble de mthodes contrlant laccs aux donnes.
62
package rendezvous;
import javax.ejb.EJB;
import javax.jws.*;
import jpa.*;
import dao.*;
import dao.IdaoLocal;
import java.util.*;
@WebService()
public class WSDaoJpa implements Idao {
@EJB
private IdaoLocal dao;
// rcuprer un Rv donn
@WebMethod
public Rv getRvById(Long id) {
return dao.getRvById(id);
}
63
3.3. Test du web service
Vrifier que ni lEJB ni la web application nest dploy dans les services. Si ce nest pas le cas,
supprimer toutes les applications dployes.
64
Puis, faire un clic droit sur WsDaoJpa dans le projet WebApplication1. Choisir Test WebService.
Ceci permet de tester les web services directement partir dun navigateur !
65
66
Avec la rponse SOAP :
67
Il peut arriver que cette partie ne fonctionne pas soit parce que vous navez pas
dploy correctement, soit parce que le port est dj utilis par une autre
application. Dans ces cas, vous aurez le message suivant
Si cest un problme de dploiement, il faut vrifier tous les paramtres prcdemment entrs. Si
cest un problme de port, il suffit de changer le port de glassfish.
Pour sassurer que cest bien un problme de port, on va entrer localhost:8080 (cf. message
derreur) dans un navigateur.
68
Par exemple, nous avons obtenu ceci sur une machine de test :
Cela indique que le port est occup par oracle. Il faut donc dire Glassfish dutiliser un autre port.
69
Puis valider les options par dfaut.
En regardant dans la proprit des serveurs, on remarque que le nouveau domaine nutilise plus le
port 8080 :
Il faut alors configurer le web service pour quil utilise le nouveau serveur (et pareillement pour les
autre applications si besoin).
70
71
Ensuite reconfigurer lEJB pour quil utilise le mme nouveau serveur glassfish.
72
Enfin, redployer le web service.
A moins que le nouveau port soit aussi utilis, normalement, vous navez plus de problme de port.
73
Partie 4. Cration dune EntrepriseApplication
4.1. Cration du projet
74
Attention dcocher les deux cases comme indiqu ci-dessous :
LEJB et la WebApplication que nous venons de crer doivent tre inclus dans lapplication
entreprise que nous venons de crer. Un clic droit sur le package Java EE Modules fait
apparatre un menu contextuel qui recense les projets actuellement connus de NetBeans et
rfrencs dans la partie projet.
Vrifier que vous avez slectionn le mme serveur glassfish pour la web application
lEJB, et lEntreprise application.
75
Une fois inclus dans le projet EntrepriseApplication, on doit obtenir ceci :
76
4.2. Tester le web service (again)
77
Dans un deuxime temps, il faut dployer le projet EntrepriseApplication1. Avant de dployer
lapplication assurez-vous davoir enlev lEJB dploy et/ou le Webservice afin dviter des
conflits (Services Servers Glassfish Application EJB Clic droit Undeploy).
78
Attention, il peut tre ncessaire de lancer le dploiement deux fois ...
Finalement, faire un clic droit sur WsDaoJpa dans le projet WebApplication1. Choisir Test
WebService.
79
Ceci permet de tester les web services directement partir dun navigateur !
80
Avec la rponse SOAP :
81
Il peut arriver que cette partie ne fonctionne pas soit parce que vous navez pas
dploy correctement, soit parce que le port est dj utilis par une autre
application. Dans ces cas, vous aurez le message suivant
Si cest un problme de dploiement, il faut vrifier tous les paramtres prcdemment entrs. Si
cest un problme de port, il suffit de changer le port de glassfish.
Pour sassurer que cest bien un problme de port, on va entrer localhost:8080 (cf. message
derreur) dans un navigateur.
82
Par exemple, nous avons obtenu ceci sur une machine de test :
Cela indique que le port est occup par oracle. Il faut donc dire Glassfish dutiliser un autre port.
83
Puis valider les options par dfaut.
En regardant dans la proprit des serveurs, on remarque que le nouveau domaine nutilise plus le
port 8080 :
Il faut alors configurer le web service pour quil utilise le nouveau serveur (et pareillement pour les
autre applications si besoin).
84
85
Ensuite reconfigurer lEJB pour quil utilise le mme nouveau serveur glassfish.
86
Enfin, redployer le web service.
A moins que le nouveau port soit aussi utilis, normalement, vous navez plus de problme de port.
87
Partie 5. Cration dun client
88
Ce qui donne au final :
89
Cliquer sur Broswer .
90
Faire ensuite : Browse et choisir WebApplication1 puis WSDaoJpa.
91
Le fichier main.java peut ensuite tre modifi comme suit :
package applicationclient1;
import rendezvous.WSDaoJpaService;
Ceci donne :
package applicationclient1;
import java.util.*;
import rendezvous.* ;
import rendezvous.WSDaoJpaService;
92
Medecins MedecinCourant = myArr_m.get(i) ;
System.out.println(MedecinCourant.getNom());
}
}
}
Ce qui donne :
93