[INF21] TP4 : JEE 6 - EJB (Enterprise Java Beans)

publicité
[INF21] TP4 : JEE 6 - EJB (Enterprise Java Beans)
Extrait du La page de Julien Seinturier
http://www.seinturier.fr/spip/spip.php?article53
[INF21] TP4 : JEE 6 - EJB
(Enterprise Java Beans)
- Enseignements - Archives - 2010 / 2011 - USTV - INF21 - Systèmes d'Information sur Internet -
Date de mise en ligne : mardi 11 janvier 2011
Description :
Introduction aux EJB pour Java EE 6
Copyright © La page de Julien Seinturier - Tous droits réservés
Copyright © La page de Julien Seinturier
Page 1/11
[INF21] TP4 : JEE 6 - EJB (Enterprise Java Beans)
1. Source
Ce TP va nous faire suivre une partie du tutoriel de Sun sur les Enterprise Beans disponible à l'adresse :
http://download.oracle.com/javaee/6/tutorial/doc/. Une version PDF de cette documentation est disponible depuis le
répertoire où le serveur JEE 6 (glassfish) est installé. Celle-ci se trouve dans le sous-répertoire
glassfish/docs/javaee-tutorial/doc/JavaEETutorial.pdf ou sur le web à l'adresse
http://docs.oracle.com/javaee/6/tutorial/doc/javaeetutorial6.pdf
Nous nous interessons aujourd'hui au chapitre 15 : Getting Started with Enterprise Beans, page 319. Cette section
concerne la mise en place d'un application simple à partir d'Enterprise Beans et de Java Server Pages (JSP).
Afin de bien comprendre les mécanismes mis en places ici, vous devrez avoir au préalable lu le chapitre 20 du
même tutoriel, Enterprise Beans, pages 299-318.
Le tutoriel étant écrit pour des personnes utilisant Netbean, vous trouverez dans les sections ci dessous des
indications pour la mise en place des exemples du tutoriel avec Eclipse.
2. Préparation de l'environnement
Ce TP va reposer sur deux parties distinctes :
•
•
Des Enterprise Java Beans (EJB) composant une applications
Une application Web et des JSP faisant office d'application cliente.
Afin de représenter ces 2 parties, nous créons 2 projets dans Eclipse.
2.1. Projet EJB
Créons un projet Eclipse consacré au développement d'EJB. Pour cela :
•
•
•
Ouvrez le menu "File"
Sélectionnez l'item "New"
Sélectionnez "EJB Project" (Si cet item n'est pas directement disponible, choisissez simplement "Project" puis
dans l'arbre des projets cherchez "EJB Poject")
La fenêtre de création d'un nouveau projet EJB s'ouvre alors.
•
•
•
Donnez au projet le nom de GettingStarted ;
vérifiez bien que "GlassFish Server Open Source Edition 3 (Java EE 6)" est sélectionné comme "Target
Runtime" ;
assurez vous que le EJB module est bien 3.1.
Copyright © La page de Julien Seinturier
Page 2/11
[INF21] TP4 : JEE 6 - EJB (Enterprise Java Beans)
•
Le champ Configuration doit être à la valeur Default Configuration for GlassFish Server Open Source
Edition 3 (Java EE 6)
Cliquer sur le bouton "Finish" afin de créer le projet.
2.2. Dynamic Web project
Créons maintenant un projet Eclipse consacré au développement d'applications web. Pour cela :
•
•
•
Ouvrez le menu "File"
Sélectionnez l'item "New"
Sélectionnez "Dynamic Web Project" (Si cet item n'est pas directement disponible, choisissez simplement "
Project" puis dans l'arbre des projets cherchez "Dynamic Web Poject")
La fenêtre de création d'un nouveau projet Dynamic Web s'ouvre alors.
•
•
•
•
Donnez au projet le nom de GettingStartedWeb ;
vérifiez bien que "GlassFish Server Open Source Edition 3 (Java EE 6)" est sélectionné comme "Target
Runtime" ;
assurez vous que le Dynamic Web module version est bien 3.0.
Le champ Configuration doit être à la valeur Default Configuration for GlassFish Server Open Source
Edition 3 (Java EE 6)
Cliquer sur le bouton "Finish" afin de créer le projet.
2.3 Java project
Créons pour finir un projet Java standard dans lequel nous allons stocker les applications java indépendantes
(comme les clients applicatifs). Pour cela :
•
•
•
Ouvrez le menu "File"
Sélectionnez l'item "New"
Sélectionnez "Java Project" (Si cet item n'est pas directement disponible, choisissez simplement "Project" puis
dans l'arbre des projets cherchez "Java Poject")
La fenêtre de création d'un nouveau projet Java s'ouvre alors.
•
•
Donnez au projet le nom de GettingStartedStandalone ;
Assurez-vous que le radio bouton du panneau JRE est bien sur "Use Default JRE"
Cliquer sur le bouton "Finish" afin de créer le projet.
Les applications qui se trouvent dans ce projet doivent pouvoir dialoguer avec un serveur JEE 6 GlassFish. Pour
cela, le projet doit intégrer une bibliothèque spécifique aux applications clientes JEE 6 fournie par GlassFish.
Copyright © La page de Julien Seinturier
Page 3/11
[INF21] TP4 : JEE 6 - EJB (Enterprise Java Beans)
L'intégration de cette bibliothèque est faite de la manière suivante :
•
•
•
•
•
•
•
cliquer avec le bouton droit sur le projet GettingStartedStandalone ;
choisir l'item "Build path" ;
cliquer sur le sous item Configure build path... ;
dans la nouvelle fenêtre, activer l'onglet "Libraries"
cliquer sur le bouton "Add External JARs..."
dans la nouvelle fenêtre, aller chercher le jar gf-client.jar qui se trouve dans le répertoire
l'installation de glassfish et cliquer sur le bouton "Ouvrir" ;
cliquer sur le bouton "Ok"
glassfish/modules
de
3. Premier exemple d'EJB
Maintenant que nos deux projets sont prêts, nous allons créer un petit EJB. Cette section résume les pages 319-324
du tutoriel.
Un EJB nécessite toujours au moins :
•
•
Une interface (appelée Business Interface, ou Interface Métier) qui permettra la communication entre le
serveur et les clients. Cette interface doit décrire les méthodes publiques du bean qui seront invoquables depuis
les clients.
Une classe qui codera le bean lui même. Cette classe implantera l'interface métier et sera annotée en fonction
du comportement que l'on veut donner au bean.
3.1. Interface Métier
Cet exemple nous permet de représenter un bean utilisé pour faire de la conversion monétaire entre des dollards et
des yens.
Afin de créer cette interface, nous n'utiliserons pas les assistants d'eclipse permettant de générer directement
l'interface métier et le bean associé. Nous utiliserons la méthode classique :
1.
2.
3.
4.
5.
6.
Faire un click droit sur l'EJB projet GettingStarted créé précédemment.
Dans le menu contextuel, sélectionnez le sous-menu "New" ;
dans la liste des items, choisissez "Interface" ;
donnez comme nom de package com.sun.tutorial.javaee.ejb ;
nommez l'interface Converter ;
cliquez sur le bouton "Finish".
L'interface métier est maintenant crée. Vous devez la retrouver dans le "Project explorer", à l'intérieur du dossier "
ejbModule" et dans le package com.sun.tutorial.javaee.ejb du projet "GettingStarted"
Editez maintenant l'interface vide Converter et donnez lui le code suivant :
package com.sun.tutorial.javaee.ejb;
Copyright © La page de Julien Seinturier
Page 4/11
[INF21] TP4 : JEE 6 - EJB (Enterprise Java Beans)
import java.math.BigDecimal;
import javax.ejb.Remote;
@Remote
public interface Converter {
public BigDecimal dollarToYen(BigDecimal dollars);
public BigDecimal yenToEuro(BigDecimal yen);
}
L'annotation :
@Remote
Indique que les beans qui implanterons cette interface pourront être accessibles depuis des clients s'exécutant sur
d'autres JVM, et donc également sur d'autre machines.
Si nous voulions que les beans implantant cette interface soit accessibles localement (c'est à dire par des clients
exécutés sur le même serveur) nous aurions du utiliser l'annotation :
@Local
3.2. Bean
L'interface métier définie, nous pouvons coder le bean qui sera charger de l'exécution des méthodes. Pour cela,
nous utilisons encore la création simple de classe depuis l'interface d'eclipse :
1.
2.
3.
4.
5.
6.
7.
Faire un click droit sur l'EJB projet GettingStarted créé précédemment.
Dans le menu contextuel, sélectionnez le sous-menu "New" ;
dans la liste des items, choisissez "Class" ;
donnez comme nom de package com.sun.tutorial.javaee.ejb ;
nommez la classe ConverterBean ;
ajoutez à la liste des interfaces Converter ;
cliquez sur le bouton "Finish".
Comme pour l'interface précédente, vous trouverez la classe ConverterBean dans le répertoire "ejbModule" du
projet "GettingStarted".
Editez cette nouvelle classe et remplacer son code par :
package com.sun.tutorial.javaee.ejb;
import java.math.BigDecimal;
import javax.ejb.Stateless;
@Stateless
public class ConverterBean implements Converter {
private BigDecimal yenRate = new BigDecimal("115.3100");
private BigDecimal euroRate = new BigDecimal("0.0071");
Copyright © La page de Julien Seinturier
Page 5/11
[INF21] TP4 : JEE 6 - EJB (Enterprise Java Beans)
public BigDecimal dollarToYen(BigDecimal dollars) {
BigDecimal result = dollars.multiply(yenRate);
return result.setScale(2, BigDecimal.ROUND_UP);
}
public BigDecimal yenToEuro(BigDecimal yen) {
BigDecimal result = yen.multiply(euroRate);
return result.setScale(2, BigDecimal.ROUND_UP);
}
}
Une seule annotation est utilisée avec ce Bean :
@Stateless
Celle-ci signifie que ce bean est de type Session et sans état. Un bean session est un bean qui est créé pour une
session interactive (une connexion client-serveur). La notion de bean sans état implique que lorsque le bean n'est
plus utilisé par le client, son état n'est pas maintenu. D'un point de vue plus pratique, il n'est pas garanti qu'entre
deux invocations de méthodes du bean, ce soit le même bean qui soit utilisé.
Un autre type de session est stateful, contrairement au précédent, ce type de session maintient l'état du bean durant
toute la session client-serveur. Lors d'invocations différentes, le même bean est utilisé et il reste dans le même état.
Pour déclarer un bean de session en stateful il suffit de l'annoter avec :
@Stateful
3.3. Client applicatif
L'enterprise bean prêt, nous nous concentrons sur la partie client. Le premier client que nous développons est
applicatif, c'est une simple application Java qui va communiquer avec le serveur pour effectuer les opérations
demandées.
Pour implanter le client, créez une nouvelle classe ConverterClient dans le package com.sun.tutorial.javaee.ejb
pour le projet GettingStartedStandalone et définissez la avec le code suivant :
package com.sun.tutorial.javaee.ejb;
import java.math.BigDecimal;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class ConverterClient {
private Converter converter = null;
public ConverterClient(String[] args){
try {
InitialContext initialContext = new InitialContext();
converter = (Converter) initialContext.lookup(Converter.class.getName());
} catch (NamingException e) {
Copyright © La page de Julien Seinturier
Page 6/11
[INF21] TP4 : JEE 6 - EJB (Enterprise Java Beans)
System.out.println("Cannot initialize context: "+e.getMessage());
e.printStackTrace();
}
}
public static void main(String[] args) {
ConverterClient client = new ConverterClient(args);
client.doConversion();
}
public void doConversion() {
if (converter != null){
try {
BigDecimal param = new BigDecimal("100.00");
BigDecimal yenAmount = converter.dollarToYen(param);
System.out.println("$" + param + " is " + yenAmount+ " Yen.");
BigDecimal euroAmount = converter.yenToEuro(yenAmount);
System.out.println(yenAmount + " Yen is " + euroAmount+ " Euro.");
System.exit(0);
} catch (Exception ex) {
System.err.println("Caught an unexpected exception!");
ex.printStackTrace();
}
} else {
System.err.println("Converter not initialized, cannot do conversion...");
}
}
}
La classe ConverterClient est un programme tout à fait basique. Le lien vers le bean se fait au moyen d'une
référence sur l'interface métier :
private Converter converter = null;
Le bean qui sera référencé par ce champ doit être demandé au serveur d'application, c'est l'utilité de la partie du
code :
try {
InitialContext initialContext = new InitialContext();
converter = (Converter) initialContext.lookup(Converter.class.getName());
} catch (NamingException e) {
System.out.println("Cannot initialize context: "+e.getMessage());
e.printStackTrace();
}
L'objet InitialContext permet le lien entre le serveur et le client. Afin de l'initialiser, il faut lui indiquer l'adresse du
serveur, ce qui est fait par l'intermédiaire des propriétés et en particulier de :
Copyright © La page de Julien Seinturier
Page 7/11
[INF21] TP4 : JEE 6 - EJB (Enterprise Java Beans)
-Dorg.omg.CORBA.ORBInitialHost=localhost
-Dorg.omg.CORBA.ORBInitialPort=3700
Ces propriétés spécifient l'adresse du serveur d'EJB et son port. Elles doivent être spécifiées comme propriétés de la
machine virtuelle.
Une fois le serveur identifié, la demande d'un bean correspondant à l'interface métier est faite grâce à :
converter = (Converter) initialContext.lookup(Converter.class.getName());
Cette instruction demande au serveur un bean correspondant à l'interface métier et le retourne. Il peut alors être
utilisé comme un objet standard par le client.
3.4. Première exécution
Il nous faut maintenant tester notre serveur et notre client. Le déploiement d'un module au sein du serveur
d'application est très simple depuis eclipse :
1.
2.
3.
4.
5.
faites un click droit sur le projet "GettingStarted" ;
dans le menu contextuel, choisissez le sous-menu "Run As..." ;
choisissez l'item "Run on server..." ;
dans le fenêtre qui vient de s'ouvrir, choisissez GlassFish Server Open Source Edition 3 (Java EE 6) ;
Cliquez sur le bouton "Finished".
Vous allez voir sur la console les instructions de déploiement du module au sein du serveur.
Une fois cette étape terminée, il nous reste à lancer le client. Celui-ci étant une application Java standard, il suffit
pour l'exécuter de procéder comme suit :
1.
2.
3.
dans le "Project Explorer", faire un click droit sur la classe ConverterClient ;
choisissez le sous-menu "Run As" ;
choisissez alors l'item "Java Application".
L'application se lance et doit afficher sur la console le résultat de la conversion.
Vous pouvez si vous le souhaitez essayer de vous connecter au serveur d'application d'une autre machine,
pour cela, il vous suffit de changer les valeurs des propriétés org.omg.CORBA.ORBInitialHost et
org.omg.CORBA.ORBInitialPort en spécifiant respectivement l'IP ou le DNS et le port d'un autre serveur JEE.
3.5. Client web
La technologie JEE permet également l'écriture de clients web ne reposant pas forcement sur une classe Java
codée en dur.
Copyright © La page de Julien Seinturier
Page 8/11
[INF21] TP4 : JEE 6 - EJB (Enterprise Java Beans)
Le serveur d'application peut également être utilisé comme un serveur web et interpréter des pages dynamiques (les
Java Server Pages) ou JSP. Une description détaillée des JSP est disponible dans le tutoriel aux pages 133-284.
Nous allons développer maintenant un client web au moyen d'une JSP. Ce client sera le pendant web de notre
application cliente. Pour cela :
1.
2.
3.
4.
5.
dans le "Project Explorer", faites un click droit sur le projet web dynamique nommé GettingStartedWeb ;
dans le menu contextuel, choisissez le sous-menu "New" ;
choisissez ensuite l'item "JSP" ;
dans la fenêtre qui vient de s'ouvrir, entrez comme "filename" la valeur converter.jsp ;
cliquez sur le bouton "Finish".
Une nouvelle JSP nommée converter.jsp a été crée dans le répertoire WebContent du projet GettingStartedWeb.
Éditez cette JSP et donnez lui le code suivant :
<%@ page import="com.sun.tutorial.javaee.ejb.Converter, java.math.*, javax.naming.*"%>
<%!
private Converter converter = null;
public void jspInit() {
try {
InitialContext ic = new InitialContext();
converter = (Converter)
ic.lookup(Converter.class.getName());
} catch (Exception ex) {
System.out.println("Could not create converter bean."+ ex.getMessage());
}
}
public void jspDestroy() {
converter = null;
}
%>
Converter ref: <%= converter.hashCode() %>
Converter ref: <%= converter.hashCode() %>
Enter an amount to convert:
Copyright © La page de Julien Seinturier
Page 9/11
[INF21] TP4 : JEE 6 - EJB (Enterprise Java Beans)
<%
String amount = request.getParameter("amount");
String hashCode = ""+converter.hashCode();
if ( amount != null && amount.length() > 0 ) {
BigDecimal d = new BigDecimal(amount);
BigDecimal yenAmount = converter.dollarToYen(d);
%>
Converter: <%= hashCode %> answered that <%= amount %> dollars are <%= yenAmount %> Yen.
<%
BigDecimal euroAmount =
converter.yenToEuro(yenAmount);
%>
<%= amount %> Yen are <%= euroAmount %> Euro.
<%
}
%>
Une JSP est une page mêlant des instructions Java et des instructions HTML. Nous pouvons une peu
maladroitement la définir comme l'équivalent JEE du PHP ou de ASP.
Une fois la JSP sauvée, des erreurs doivent vous être signalées. En effet, la classe
com.sun.tutorial.javaee.ejb.Converter est inconnue étant donné que nous ne somme pas dans le même projet que
celui définissant les EJB.
Il faut en effet faire connaitre l'interface métier Converter à la JSP. Pour cela, nous allons recopier cette interface
dans la partie Java du projet :
1.
2.
3.
4.
5.
6.
faire un click droit sur le projet GettingStartedWeb ;
dans le menu contextuel, sélectionnez le sous-menu "New" ;
dans la liste des items, choisissez "Interface" ;
donnez comme nom de package com.sun.tutorial.javaee.ejb ;
nommez l'interface Converter ;
cliquez sur le bouton "Finish".
Copier le code de l'interface Converter du projet GettingStarted dans l'interface Converter du projet
GettingStartedWeb. Recompilez le tout et les erreurs dans la JSP ont disparu.
Cette manipulation est pratique dans notre cas mais n'est pas très rigoureuse. En temps normal, il incombe
au développeur des EJB ou au chef de projet de fournir les interfaces métiers sous forme de JAR et de les
distribuer aux développeurs souhaitant implanter des clients.
Afin de tester le client web, il faut déployer les pages sur le serveur. Pour cela :
Copyright © La page de Julien Seinturier
Page 10/11
[INF21] TP4 : JEE 6 - EJB (Enterprise Java Beans)
1.
2.
3.
4.
5.
faites un click droit sur le projet "GettingStartedWeb" ;
dans le menu contextuel, choisissez le sous-menu "Run As..." ;
choisissez l'item "Run on server..." ;
dans le fenêtre qui vient de s'ouvrir, choisissez GlassFish Server Open Source Edition 3 (Java EE 6) ;
Cliquez sur le bouton "Finished".
Par défaut eclipse va déployer tous les modules présents dans le "Project Explorer". Il n'est donc pas nécessaire de
faire cette manipulation sur tous les projets.
Une fois le serveur prêt, accédez au client web en entrant l'adresse :
http://localhost:8080/GettingStartedWeb/converter.jsp
Comme tout à l'heure, vous pouvez essayer de vous connecter aux serveurs d'autres machines pour vérifier leur
fonctionnements.
4. Exemple du Cart
Maintenant que vous êtes capable d'utiliser eclipse pour déployer des applications depuis un serveur JEE, vous
suivrez le tutorial d'Oracle concernant l'exemple sur les session beans (
http://docs.oracle.com/javaee/6/tutorial/doc/javaeetutorial6.pdf), pages 423-429
Copyright © La page de Julien Seinturier
Page 11/11
Téléchargement