02.11.2012 Views

Encadr - MultiMania

Encadr - MultiMania

Encadr - MultiMania

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

UNIVERSITE MOHAMMED PREMIER<br />

ECOLE NATIONALE DES SCIENCES APPLIQUES<br />

OUJDA<br />

Département Génie Informatique<br />

Réalisé par : <strong>Encadr</strong>é par :<br />

YAZIDI ALAOUI Youssef M. BOUCHENTOUF Toumi<br />

EBOURKI Abderrahman<br />

Année universitaire : 2004-2005


Etude de serveur d’application JBoss<br />

Sommaire<br />

1 Introduction :---------------------------------------------------------------------------------------- 3<br />

2 Architecture J2EE : -------------------------------------------------------------------------------- 4<br />

2.1 Introduction :---------------------------------------------------------------------------------- 4<br />

2.2 Définition : ------------------------------------------------------------------------------------ 4<br />

2.2.1 Environnent d’exécution J2EE :------------------------------------------------------ 4<br />

2.2.2 Les API J2EE : ------------------------------------------------------------------------- 4<br />

2.3 Composants J2EE :--------------------------------------------------------------------------- 5<br />

2.3.1 Servlets :--------------------------------------------------------------------------------- 5<br />

2.3.2 Les JSP :--------------------------------------------------------------------------------- 7<br />

2.3.3 Les EJB : -------------------------------------------------------------------------------- 9<br />

3 Les outils de développement : -------------------------------------------------------------------14<br />

3.1 Eclipse :---------------------------------------------------------------------------------------14<br />

3.1.1 L’installation ---------------------------------------------------------------------------15<br />

3.1.2 le Workbench --------------------------------------------------------------------------16<br />

3.1.3 Les fonctions pratiques du Workbench---------------------------------------------16<br />

3.1.4 Le workspace --------------------------------------------------------------------------17<br />

3.1.5 Le Java Development Tooling (JDT)-----------------------------------------------17<br />

3.1.6 Génération de la documentation javadoc-------------------------------------------18<br />

3.1.7 La perspective "debug" ---------------------------------------------------------------19<br />

3.1.8 Le refactoring --------------------------------------------------------------------------19<br />

3.1.9 L'aide dans Eclipse--------------------------------------------------------------------21<br />

3.2 Le serveur d’application JBOSS :---------------------------------------------------------21<br />

3.2.1 Les serveurs d’applications :---------------------------------------------------------21<br />

3.2.2 JBOSS un serveur d’applications compatible J2EE :-----------------------------23<br />

3.2.3 Architecture technique de JBOSS : -------------------------------------------------23<br />

3.2.4 Installation du serveur JBOSS : -----------------------------------------------------25<br />

3.2.5 Quelques caractéristiques de JBOSS :----------------------------------------------26<br />

3.3 L’outil Ant :----------------------------------------------------------------------------------27<br />

3.3.1 Installation de Ant---------------------------------------------------------------------27<br />

3.3.2 Exécution de Ant ----------------------------------------------------------------------28<br />

3.3.3 Le fichier build.xml -------------------------------------------------------------------28<br />

3.4 L’outil XDoclet : ----------------------------------------------------------------------------35<br />

4 Etude de cas réalisé :------------------------------------------------------------------------------36<br />

4.1 Description : ---------------------------------------------------------------------------------36<br />

4.2 Architecture de l’application : -------------------------------------------------------------36<br />

4.3 Préparatifs : JBOSS IDE -------------------------------------------------------------------37<br />

4.4 Création du projet :--------------------------------------------------------------------------41<br />

4.4.1 Création de L’EJB Session : ---------------------------------------------------------42<br />

4.4.2 Création de l’EJB Entity : ------------------------------------------------------------47<br />

4.4.3 Création de la Servlet : ---------------------------------------------------------------52<br />

4.4.4 Création de l’application Web: ------------------------------------------------------57<br />

4.4.5 Déploiement et exécution :-----------------------------------------------------------59<br />

5 Conclusion :----------------------------------------------------------------------------------------62<br />

6 Bibliographie : -------------------------------------------------------------------------------------62<br />

ENSA d’Oujda 2


Etude de serveur d’application JBoss<br />

1 Introduction :<br />

Aujourd’hui, les applications web complexes utilisent les serveurs d’applications J2EE<br />

qui sont une extension des serveurs web grâce aux différents services offerts comme la<br />

gestion de la sécurité, des transactions et leur grande disponibilité. Et face aux différentes<br />

solutions propriétaires du marché, le monde Open Source propose lui aussi des solutions<br />

fiables et stable dont la plus connue est le serveur d’application certifié J2EE Jboss.<br />

C’est dans ce contexte, que se situe notre projet J2EE, d’une durée de 2 mois et sous le<br />

thème : Etude du serveur d’application Jboss, Tomcat et Eclipse. Il s’agit en effet d’un projet<br />

dont l’objectif consiste à installer, manipuler et mettre en œuvre le serveur d’application Jboss<br />

avec le moteur de Servlet intégré Tomcat d’Apache et réaliser une étude de cas détaillé tout<br />

en profitant des possibilités offertes par un environnement de développement intégré comme<br />

Eclipse.<br />

Ce rapport de projet décrit une étude de cas détaillé et qui met en œuvre deux types de<br />

composants EJB : un EJB session et un autre EJB Entity type CMP pour la gestion de la<br />

persistance ainsi qu’une Servlet pour communiquer avec le client en utilisant le serveur<br />

d’application open source Jboss.<br />

La première partie de ce rapport décrit en détail l’architecture J2EE ainsi que les<br />

composants utilisés comme les EJB ou les servlets. La deuxième partie traite les outils de<br />

développement utilisés qui sont le serveur d’application Jboss, l’IDE Eclipse, Ant, Tomcat et<br />

XDoclet. La dernière partie décrit l’étude de cas réalisé qui récapitule l’ensemble des<br />

connaissances acquises à propos des composants J2EE ainsi que le serveur d’application<br />

Jboss.<br />

Ce rapport se termine par une conclusion et éventuellement des perspectives.<br />

ENSA d’Oujda 3


Etude de serveur d’application JBoss<br />

2 Architecture J2EE :<br />

2.1 Introduction :<br />

J2EE signifie Java 2 Entreprise Edition et repose donc sur Java, le fameux langage objet<br />

conçu pour être "portable" ("Write Once, Run Anywhere").<br />

Dès son origine, java a révolutionné plusieurs domaines de l'informatique, que ça soit la<br />

téléphonie, l'Internet ou les applications d'entreprise. Aujourd'hui, SUN a réorganisé son offre<br />

autour de 3 briques :<br />

� Java 2 Standard Edition (J2SE) qui vise les postes clients.<br />

� Java 2 Micro Edition (J2ME) qui cible les terminaux portables.<br />

� Java 2 Entreprise Edition (J2EE) qui définit le cadre d'un serveur d'applications et<br />

d'intégration.<br />

2.2 Définition :<br />

J2EE est une plateforme orientée serveur pour le développement et l’exécution<br />

d’application distribuées. Elle se compose de deux parties :<br />

� Un ensemble de spécifications pour un environnement exécutant les composants Java<br />

qui se nomme serveur d’applications.<br />

� Un ensemble d’API qui peuvent être obtenus et utilisées séparément.<br />

2.2.1 Environnent d’exécution J2EE :<br />

Un des avantages majeurs de J2EE est de faire abstraction de l'infrastructure d'exécution.<br />

En effet, J2EE spécifie les rôles et les interfaces pour les applications, ainsi que<br />

l'environnement d'exécution dans lequel les applications sont déployées. Ceci permet aux<br />

développeurs d'application de ne pas avoir a reprogrammé les services d'infrastructure.<br />

2.2.2 Les API J2EE :<br />

Le serveur J2EE va fournir à votre application un ensemble de services comme les<br />

connexions aux bases de données, la messagerie, les transactions... L'architecture J2EE unifie<br />

l'accès à ces services au sein des API de ses services d'entreprise mais plutôt que d'avoir accès<br />

à ces services au travers d'interfaces propriétaires ou non standard, les applications J2EE<br />

peuvent accéder à ces API via le serveur.<br />

La spécification de la plateforme J2EE prévoit un ensemble d'extensions Java standard<br />

que chaque plate-forme J2EE doit prendre en charge : JNDI, JDBC, SERVLET, JSP, JMS,<br />

JTA, et les EJB.<br />

ENSA d’Oujda 4


Etude de serveur d’application JBoss<br />

2.3 Composants J2EE :<br />

2.3.1 Servlets :<br />

Une servlet est un programme qui s'exécute côté serveur en tant qu'extension du serveur.<br />

Elle reçoit une requête du client, elle effectue des traitements et renvoie le résultat. La liaison<br />

entre la servlet et le client peut être directe ou passer par un intermédiaire comme par exemple<br />

un serveur http.<br />

Même si pour le moment la principale utilisation des servlets est la génération de pages<br />

html dynamiques utilisant le protocole http et donc un serveur web, n'importe quel protocole<br />

reposant sur le principe de requête/réponse peut faire usage d'une servlet.<br />

Ecrite en java, une servlet en retire ses avantages : la portabilité, l'accès à toutes les API<br />

de java dont JDBC pour l'accès aux bases de données, ... Une servlet peut être invoquée<br />

plusieurs fois en même temps pour répondre à plusieurs requêtes simultanées.<br />

La servlet se positionne dans une architecture Client/Serveur trois tiers dans le tiers du<br />

milieu entre le client léger chargé de l'affichage et la source de données.<br />

Fonctionnement :<br />

Un serveur d'application permet de charger et d'exécuter les servlets dans une JVM. C'est<br />

une extension du serveur web. Ce serveur d'application contient entre autre un moteur de<br />

servlets qui se charge de manager les servlets qu'il contient. Pour exécuter une servlet, il suffit<br />

de saisir une URL qui désigne la servlet dans un navigateur.<br />

1. Le serveur reçoit la requête http qui nécessite une servlet de la part du navigateur.<br />

2. Si c'est la première sollicitation de la servlet, le serveur l'instancie. Les servlets sont<br />

stockées (sous forme de fichier .class) dans un répertoire particulier du serveur. Ce<br />

répertoire dépend du serveur d'application utilisé. La servlet reste en mémoire jusqu'à<br />

l'arrêt du serveur. Certains serveurs d'application permettent aussi d'instancier des<br />

servlets dès le lancement du serveur. La servlet en mémoire, peut être appelée par<br />

plusieurs threads lancés par le serveur pour chaque requête. Ce principe de<br />

fonctionnement évite d'instancier un objet de type servlet à chaque requête et permet<br />

de maintenir un ensemble de ressources actives tel qu'une connexion à une base de<br />

données.<br />

3. le serveur créé un objet qui représente la requête http et objet qui contiendra la réponse<br />

et les envoie à la servlet.<br />

4. la servlet créé dynamiquement la réponse sous forme de page html transmise via un<br />

flux dans l'objet contenant la réponse. La création de cette réponse utilise bien sûre la<br />

requête du client mais aussi un ensemble de ressources incluses sur le serveur tels de<br />

que des fichiers ou des bases de données.<br />

5. le serveur récupère l'objet réponse et envoie la page html au client.<br />

ENSA d’Oujda 5


Etude de serveur d’application JBoss<br />

Les servlets http :<br />

L'usage principal des servlets est la création de pages HTML dynamiques. Sun fourni une<br />

classe qui encapsule une servlet utilisant le protocole http. Cette classe est la classe<br />

HttpServlet. Cette classe hérite de GenericServlet, donc elle implémente l'interface Servlet, et<br />

redéfinie toutes les méthodes nécessaires pour fournir un niveau d'abstraction permettant de<br />

développer facilement des servlets avec le protocole http.<br />

Ce type de servlet n'est pas utile que pour générer des pages HTML bien que cela soit son<br />

principal usage, elle peut aussi réaliser un ensemble de traitements tel que mettre à jour une<br />

base de données. En réponse, elle peut générer une page html qui indique le succès ou non de<br />

la mise à jour.<br />

La requête du client est encapsulée dans un objet qui implémente l'interface<br />

HttpServletRequest : cet objet contient les données de la requête et des informations sur le<br />

client. La réponse de la servlet est encapsulée dans un objet qui implémente l'interface<br />

HttpServletResponse.<br />

Typiquement pour définir une servlet, il faut définir une classe qui hérite de la classe<br />

HttpServlet et redéfinir la classe doGet et/ou doPost selon les besoins. La méthode service<br />

héritée de HttpServlet appelle l'une ou l'autre de ces méthodes en fonction du type de la<br />

requête http :<br />

� une requête GET : c'est une requête qui permet au client de demander une ressource.<br />

� une requête POST : c'est une requête qui permet au client d'envoyer des informations<br />

issues par exemple d'un formulaire.<br />

La classe HttpServlet hérite aussi de plusieurs méthodes définies dans l'interface Servlet:<br />

init(), destroy() et getServletInfo().<br />

La méthode init() : Les paramètres d’initialisation de la servlet.<br />

La méthode DoGet() : Le traitement typique de la méthode doGet() est d'analyser les<br />

paramètres de la requête, alimenter les données de l'en-tête de la réponse et d'écrire la<br />

réponse.<br />

La méthode DoPost() : Une requête POST n'est utilisable qu'avec un formulaire<br />

HTML. La méthode doPost() doit généralement recueillir les paramètres pour les traiter et<br />

générer la réponse. Pour obtenir la valeur associée à chaque paramètre il faut utiliser la<br />

méthode getParameter() de l'objet HttpServletRequest. Cette méthode attend en paramètre le<br />

nom du paramètre dont on veut la valeur. Ce paramètre est sensible à la casse.<br />

ENSA d’Oujda 6


Etude de serveur d’application JBoss<br />

2.3.2 Les JSP :<br />

Les JSP permettent d'introduire du code Java dans des tags prédéfinis à l'intérieur d'une<br />

page HTML. La technologie JSP mélange la puissance de Java côté serveur et la facilité de<br />

mise en page d'HTML côté client. En fait dans une servlet, les traitements et la présentation<br />

sont regroupés. L'aspect présentation est dans ce cas pénible à développer et à maintenir à<br />

cause de l'utilisation répétitive de méthodes pour insérer le code HTML dans le flux de sortie.<br />

De plus, une simple petite modification dans le code HTML nécessite la recompilation de<br />

la servlet. Avec un JSP, la séparation des traitements et de la présentation rend ceci très facile<br />

et automatique.<br />

Une JSP est habituellement constituée de données HTML, de tags JSP et de scriplets :<br />

2.3.2.1 Les tags de directives :<br />

Les directives permettent de préciser des informations globales sur la page JSP. Leur<br />

syntaxe est la suivante :<br />

<br />

Les spécifications des JSP définissent trois directives :<br />

page : permet de définir des options de configuration<br />

Exemples :<br />

:défini un import.<br />

: définit le type mime.<br />

include : le fichier inclus peut être un fragment de code JSP, HTML ou Java. Le fichier est<br />

inclus dans la JSP avant que celle ci ne soit interprétée par le moteur de JSP. La syntaxe est la<br />

suivante :<br />

ENSA d’Oujda 7


Etude de serveur d’application JBoss<br />

<br />

taglib : permet de définir des tags personnalisés.<br />

2.3.2.2 Les tags de scripting<br />

Ces tags permettent d'insérer du code Java qui sera inclus dans la servlet générée à partir<br />

de la JSP. Il existe trois tags pour insérer du code Java :<br />

Le tag de déclarations : <br />

Ce tag permet de déclarer des variables ou des méthodes qui pourront être utilisées dans<br />

la JSP. Il ne génère aucun caractère dans le fichier HTML de sortie.<br />

Exemple : <br />

Il est possible de déclarer plusieurs variables dans le même tag en les séparant avec des<br />

caractères ' ;'.<br />

Le tag d'expressions : <br />

Le moteur de JSP remplace ce tag par le résultat de l'évaluation de l'expression présente<br />

dans le tag. Ce résultat est toujours converti en une chaîne.<br />

Exemple :<br />

Date du jour :<br />

<br />

<br />

Le tag des scriplets : <br />

Ce tag contient du code Java nommé un scriptlet. Par défaut, le code inclus dans le tag est<br />

inséré dans la méthode service() de la servlet générée à partir de la JSP.<br />

Exemple :<br />

<br />

<br />

Essai de page JSP<br />

<br />

<br />


Etude de serveur d’application JBoss<br />

2.3.2.3 Les tags de commentaires<br />

Il existe deux types de commentaires avec les JSP :<br />

Les commentaires visibles dans le code HTML : <br />

Ces commentaires sont ceux définis par format HTML. Ils sont intégralement reconduit<br />

dans le fichier HTML généré. Il est possible d'insérer, dans ce tag, un tag JSP de type<br />

expression qui sera exécuté.<br />

Exemple :<br />

Dans la JSP :<br />

−−><br />

Dans la page HTML générée :<br />

<br />

Les commentaires cachés : <br />

Les commentaires cachés sont utilisés pour documenter la page JSP. Leur contenu est<br />

ignoré par le moteur de JSP et ne sont donc pas reconduit dans la page HTML générée.<br />

2.3.2.4 Les tags d'actions<br />

Les tags d'actions permettent de réaliser des traitements couramment utilisés.<br />

2.3.3 Les EJB :<br />

• Le tag : Ce tag permet de localiser une instance ou d'instancier<br />

un bean pour l'utiliser dans la JSP.<br />

• Le tag : Ce tag permet de mettre à jour la valeur d'un ou<br />

plusieurs attributs d'un Bean.<br />

• Le tag : Ce tag permet d'obtenir la valeur d'un attribut d'un<br />

Bean.<br />

• Le tag : Ce tag permet de rediriger la requête vers une autre<br />

URL pointant vers un fichier HTML, JSP ou un servlet.<br />

• Le tag : Ce tag permet d'inclure le contenu généré par une JSP ou<br />

une servlet dynamiquement au moment ou la JSP est exécutée. C'est la<br />

différence avec la directive include avec laquelle le fichier est inséré dans la<br />

JSP avant la génération de la servlet.<br />

Les Entreprise Java Bean ou EJB sont des composants serveurs donc non visuel qui<br />

respectent les spécifications d'un modèle édité par Sun. Ces spécifications définissent une<br />

architecture, un environnement d'exécution et un ensemble d'API.<br />

ENSA d’Oujda 9


Etude de serveur d’application JBoss<br />

Le respect de ces spécifications permet d'utiliser les EJB de façon indépendante du<br />

serveur d'applications J2EE dans lequel ils s'exécutent, du moment ou le code de mise en<br />

oeuvre des EJB n'utilisent pas d'extensions proposées par un serveur d'applications particulier.<br />

En fait Le but des EJB est de faciliter la création d'applications distribuées pour les<br />

entreprises.<br />

Une des principales caractéristiques des EJB est de permettre aux développeurs de se<br />

concentrer sur les traitements orientés métiers car les EJB et l'environnement dans lequel ils<br />

s'exécutent prennent en charge un certain nombre de traitements tel que la gestion des<br />

transactions, la persistance des données, la sécurité, ...<br />

Physiquement, un EJB est un ensemble d'au moins deux interfaces et une classe<br />

regroupée dans un module contenant un descripteur de déploiement particulier.<br />

2.3.3.1 Présentation des EJB<br />

Les EJB sont des composants et en tant que tel, ils possèdent certaines caractéristiques<br />

comme la réutilisabilité, la possibilité de s'assembler pour construire une application, etc. Les<br />

EJB et les beans n'ont en commun que d'être des composants. Les java beans sont des<br />

composants qui peuvent être utilisés dans toutes les circonstances. Les EJB doivent<br />

obligatoirement s'exécuter dans un environnement serveur dédié.<br />

Il sont parfaitement adaptés pour être intégrés dans une architecture trois tiers ou plus. Et<br />

ils s'exécutent dans un environnement particulier : le serveur d'EJB. Celui ci fournit un<br />

ensemble de fonctionnalités utilisées par un ou plusieurs conteneurs d'EJB qui constituent le<br />

serveur d'EJB. En réalité, c'est dans un conteneur que s'exécute un EJB et il lui est impossible<br />

de s'exécuter en dehors.<br />

Le conteneur d'EJB propose un certain nombre de services qui assurent la gestion :<br />

� du cycle de vie du bean<br />

� de l'accès au bean<br />

ENSA d’Oujda 10


Etude de serveur d’application JBoss<br />

� de la sécurité d'accès<br />

� des accès concurrents<br />

� des transactions<br />

Les entités externes au serveur qui appellent un EJB ne communiquent pas directement<br />

avec celui ci. Les accès au EJB par un client se fait obligatoirement via le conteneur.<br />

L'avantage de passer par le conteneur est que celui ci peut utiliser les services qu'il propose et<br />

libérer ainsi le développeur de cette charge de travail. Ceci permet au développeur de se<br />

concentrer sur les traitements métiers proposés par le bean.<br />

Il existe deux types d'EJB : les EJB de session (session beans) et les EJB entité (les entity<br />

beans). Depuis la version 2.0 des EJB, il existe un troisième type d’EJB : les EJB orienté<br />

message (message driven beans).<br />

2.3.3.2 Le développement d'un EJB<br />

Le cycle de développement d'un EJB comprend :<br />

� la création des interfaces et des classes du bean<br />

� le packaging du bean sous forme de fichier archive jar<br />

� le déploiement du bean dans un serveur d'EJB<br />

� le test du bean<br />

La création d'un bean nécessite la création d'au minimum deux interfaces et une classe<br />

pour respecter les spécifications de Sun : la classe du bean, l'interface remote et l'interface<br />

home.<br />

L'interface remote permet de définir l'ensemble des services fournis par le bean. Cette<br />

interface étend l'interface EJBObject. Dans la version 2.0 des EJB, l'API propose une<br />

interface supplémentaire, EJBLocalObject, pour définir les services fournis par le bean qui<br />

peuvent être appelés en local par d'autres beans. Ceci permet d'éviter de mettre en oeuvre<br />

toute une mécanique longue et coûteuses en ressources pour appeler des beans s'exécutant<br />

dans le même conteneur.<br />

L'interface home permet de définir l'ensemble des services qui vont permettre la gestion<br />

du cycle de vie du bean. Cette interface étend l'interface EJBHome.<br />

La classe du bean contient l'implémentation des traitements du bean. Cette classe<br />

implémente les méthodes déclarées dans les interfaces home et remote. Les méthodes<br />

définissant celle de l'interface home sont obligatoirement préfixées par "ejb".<br />

L'accès aux fonctionnalités du bean se fait obligatoirement par les méthodes définies dans<br />

les interfaces home et remote et il existe un certain nombre d'API qu'il n'est pas possible<br />

d'utiliser dans un EJB :<br />

• les threads<br />

• flux pour des entrées/sorties<br />

• du code natif<br />

• AWT et Swing<br />

ENSA d’Oujda 11


Etude de serveur d’application JBoss<br />

L'interface remote<br />

L'interface remote permet de définir les méthodes qui contiendront les traitements<br />

proposés par le bean. Cette interface doit étendre l'interface javax.ejb.EJBObject. Toutes les<br />

méthodes définies dans cette interface doivent obligatoirement respecter les spécifications de<br />

RMI et déclarer qu'elles peuvent lever une exception de type RemoteException. L'interface<br />

javax.ejb.EJBObject définit plusieurs méthodes qui seront donc présentes dans tous les EJB :<br />

L'interface home<br />

• EJBHome getEJBHome() : renvoie une référence sur l'objet Home<br />

• Handle getHandle() : renvoie un objet permettant de sérialiser le bean<br />

• Object getPrimaryKey() : renvoie une référence sur l'objet qui encapsule la clé<br />

primaire d'un bean entité<br />

• booléen isIdentical(EJBObject) : renvoie un booléen qui précise si le bean est<br />

identique à l'instance du bean fourni en paramètre. Pour un bean session sans<br />

état, cette méthode renvoie toujours true. Pour un bean entité, la méthode<br />

renvoie true si la clé primaire des deux beans est identique.<br />

• void remove() : cette méthode demande la destruction du bean. Pour un bean<br />

entité, elle provoque la suppression des données correspondants dans la base de<br />

données.<br />

L'interface home permet de définir des méthodes qui vont gérer le cycle de vie du bean.<br />

Cette interface doit étendre l'interface EJBHome. La création d'une instance d'un bean se fait<br />

grâce à une ou plusieurs surcharges de la méthode create(). Chacune de ces méthodes renvoie<br />

une instance d'un objet type de l'interface remote L'interface javax.ejb.EJBHome définit<br />

plusieurs méthodes :<br />

• EJBMetaData getEJBMetaData() throws java.rmi.RemoteException<br />

• HomeHandle getHomeHandle() throws java.rmi.RemoteException : renvoie<br />

un objet qui permet de sérialiser l'objet implémentant l'interface EJBHome<br />

• void remove(Handle) throws java.rmi.RemoteException,<br />

javax.ejb.RemoveException : supprime le bean<br />

• void remove(Object) throws java.rmi.RemoteException,<br />

javax.ejb.RemoveException : supprime le bean entité dont l'objet encapsulant la<br />

clé primaire est fourni en paramètre<br />

La ou les méthodes à définir dans l'interface home dépendent du type d'EJB:<br />

ENSA d’Oujda 12


Etude de serveur d’application JBoss<br />

2.3.3.3 Les EJB session<br />

Un EJB session est un EJB de service dont la durée de vie correspond à un échange avec<br />

un client. Ils contiennent les règles métiers de l'application. Il existe deux types d'EJB session<br />

: sans état (stateless) et avec état (statefull).<br />

Les EJB session statefull sont capables de conserver l'état du bean dans des variables<br />

d'instance durant toute la conversation avec un client. Mais ces données ne sont pas<br />

persistantes : à la fin de l'échange avec le client, l'instance de l'EJB est détruite et les données<br />

sont perdues. Par contre les stateless ne peuvent pas conserver de telles données entre chaque<br />

appel du client.<br />

Il ne faut pas faire appel directement aux méthodes create() et remove() de l'EJB. C'est le<br />

conteneur d'EJB qui se charge de la gestion du cycle de vie de l'EJB et qui appelle ces<br />

méthodes. Le client décide simplement du moment de la création et de la suppression du bean<br />

en passant par le conteneur.<br />

Une classe qui encapsule un EJB session doit implémenter l'interface<br />

javax.ejb.SessionBean. Elle ne doit pas implémenter les interfaces home et remote mais elle<br />

doit définir les méthodes déclarées dans ces deux interfaces.<br />

2.3.3.4 Les EJB entité<br />

Ces EJB permettent de représenter et de gérer des données enregistrées dans une base de<br />

données. Ils implémentent l'interface EntityBean.<br />

L'avantage d'utiliser un tel type d'EJB plutôt que d'utiliser JDBC ou de développer sa<br />

propre solution pour mapper les données est que certains services sont pris en charge par le<br />

conteneur.<br />

Les beans entité assurent la persistance des données en représentant tout au partie d'une<br />

table ou d'une vue. Il existe deux types de bean entité :<br />

• persistance gérée par le conteneur (CMP : Container Managed Persistence)<br />

• persistance gérée par le bean (BMP : Bean Managed Persistence).<br />

Avec un bean entité CMP, c'est le conteneur d'EJB qui assure la persistance des données<br />

grâce aux paramètres fournis dans le descripteur de déploiement du bean. Il se charge de toute<br />

la logique des traitements de synchronisation entre les données du bean et les données dans la<br />

base de données. Tandis qu’un bean entité BMP, assure lui même la persistance des données<br />

grâce à du code inclus dans les méthodes du bean.<br />

2.3.3.5 Le déploiement des EJB<br />

Pour permettre le déploiement d'un EJB, il faut définir un fichier DD (deployement<br />

descriptor) qui contient des informations sur le bean. Ce fichier au format XML permet de<br />

donner au conteneur d'EJB des caractéristiques du bean.<br />

ENSA d’Oujda 13


Etude de serveur d’application JBoss<br />

Un EJB doit être déployé sous forme d'une archive jar qui doit contenir un fichier qui est<br />

le descripteur de déploiement et toutes les classes qui composent chaque EJB (interfaces<br />

home et remote, les classes qui implémentent ces interfaces et toutes les autres classes<br />

nécessaires aux EJB).<br />

Une archive ne doit contenir qu'un seul descripteur de déploiement pour tous les EJB de<br />

l'archive. Ce fichier au format XML doit obligatoirement être nommé ejb−jar.xml. et met dans<br />

un répertoire META−INF qui contiendra lui même le descripteur de déploiement. Le reste de<br />

l'archive doit contenir les fichiers .class avec toute l'arborescence des répertoires des<br />

packages.<br />

L'appel d'un EJB par un client<br />

Un client peut être une entité de toute forme : application avec ou sans interface<br />

graphique, un bean, une servlet ou une JSP ou un autre EJB.<br />

Le mode d'appel d'un EJB suit toujours la même logique :<br />

• obtenir une référence qui implémente l'interface home de l'EJB grâce à JNDI<br />

• créer une instance qui implémente l'interface remote en utilisant la référence<br />

précédemment acquise<br />

• appelle de la ou des méthodes de l'EJB<br />

2.3.3.6 Les EJB orientés messages<br />

Ces EJB sont différents des deux types d'EJB car ils répondent à des invocations de façon<br />

asynchrone. Ils permettent de réagir à l'arrivée de messages fournis par un M.O.M.<br />

(middleware oriented messages).<br />

3 Les outils de développement :<br />

3.1 Eclipse :<br />

Eclipse est un environnement de développement intégré (Integrated Development<br />

Environment) développé en Java dont le but est de fournir une plate−forme modulaire pour<br />

permettre de réaliser des développements informatiques.<br />

I.B.M. est à l'origine du développement d'Eclipse qui est d'ailleurs toujours le cœur de<br />

son outil Websphere Studio Workbench (WSW). Tout le code d'Eclipse a été donné à la<br />

communauté par I.B.M afin de poursuivre son développement.<br />

Les principaux modules fournis en standard avec Eclipse concernent le développement<br />

avec Java mais d’autres modules peuvent être ajoutés pour d'autres langages notamment C++,<br />

Cobol, et d'autres aspects de développement (base de données, conception avec UML, … ).<br />

Les performances à l'exécution d'Eclipse sont très bonnes car il n'utilise pas Swing pour<br />

l'interface homme−machine mais un toolkit particulier nommé SWT associé à la bibliothèque<br />

ENSA d’Oujda 14


Etude de serveur d’application JBoss<br />

JFace. SWT (Standard Widget Toolkit) est développé en Java par IBM en utilisant au<br />

maximum les composants natifs fournis par le système d'exploitation sous jacent.<br />

Eclipse est formé d’un noyau (le Runtime) qui est le cœur de la plate-forme et d’un<br />

ensemble de modules nommés plug-ins, cela permet l’extension de la plate-forme et ainsi<br />

fournir la possibilité à des tiers de développer des fonctionnalités qui ne sont pas fournies en<br />

standard par Eclipse.<br />

3.1.1 L’installation<br />

Avant de commencer l’installation, il faut obligatoirement qu'un JDK 1.3 minimum y soit<br />

installé. La version 1.4 est fortement recommandée pour améliorer les performances et<br />

pouvoir utiliser le remplacement de code lors du débogage (technologie JPDA).<br />

les plate−formes supportant Eclipse sont Windows ( 98ME et SE / NT / 2000 / XP),<br />

Linux , Solaris 8, QNX, AIX 5.1, HP−UX 11, MAC OS X.<br />

� Sous Windows<br />

Sur le site http://www.eclipse.org/downloads/index.php télécharger le fichier<br />

eclipse−SDK−3.0.1−win32.zip. Ensuite, extraire l'archive dans un répertoire et exécuter le<br />

programme eclipse.exe. le programme termine automatiquement l’installation puis s’exécute.<br />

� Sous Linux<br />

Il faut ajouter le répertoire bin du JDK à la variable système PATH pour permettre au<br />

système de trouver les exécutables nécessaires.<br />

PATH=$PATH: /opt/IBMJava2−13/bin<br />

Pour exécuter Eclipse, il suffit de le lancer dans un shell.<br />

$ eclipse −data workspace<br />

� Lancer Eclipse<br />

Eclipse accepte plusieurs paramètres sur la ligne de commande qui lance l'application.<br />

Les plus importants sont :<br />

–vm : préciser la machine virtuelle qui va exécuter Eclipse.<br />

–data : préciser l'emplacement du workspace.<br />

–ws : préciser sous les environnements de type Unix la bibliothèque graphique utilisée,<br />

"motif" ou "gtk".<br />

Exemple : Eclipse.exe −vm C:\java\jre1.4.2\bin\javaw.exe<br />

ENSA d’Oujda 15


Etude de serveur d’application JBoss<br />

3.1.2 le Workbench<br />

Au lancement d’Eclipse, une seul fenêtre s’ouvre contenant le Workbench. Il est composé<br />

de huit perspectives. Chaque perspective est adaptée a un usage particulier :<br />

Une perspective contient des sous fenêtres qui peuvent contenir des vues et des éditeurs.<br />

Les vues sont pour sélectionner des éléments et les éditeurs pour visualiser et modifier leur<br />

contenu.<br />

3.1.3 Les fonctions pratiques du Workbench<br />

� La fonction de recherche :<br />

Cette fonction de recherche permet d'obtenir une liste d'éléments qui contiennent une<br />

chaîne désignée par un motif. Elle peut se faire dans tous les fichiers, dans les fichiers source<br />

Java ou dans l'aide en ligne.<br />

Exemple : recherche des chaines qui se termine par « Bean » dans les fichier java<br />

Pour la chaîne : *Bean<br />

Pour les fichiers :*.java<br />

� La liste des tâches :<br />

La vue "Tâches" affiche et permet de gérer une liste de tâches à faire. Ces tâches peuvent<br />

être de plusieurs types :<br />

• des actions à réaliser �<br />

• des erreurs de compilation �<br />

• des points d'arrêt pour le debugage �<br />

� La liste des signets<br />

ENSA d’Oujda 16


Etude de serveur d’application JBoss<br />

Les signets permettent de maintenir une liste d'éléments particuliers dans le but d'y<br />

accéder rapidement.<br />

� La comparaison d'éléments<br />

Le workbench dispose d'un outil pratique pour comparer le contenu de deux éléments.<br />

Pour réaliser cette comparaison, il faut sélectionner ces deux éléments en maintenant la<br />

touche Ctrl enfoncée dans la vue "Navigateur" et sélectionner l'option "Comparer /<br />

Réciproquement" du menu contextuel.<br />

La vue de comparaison de fichier contient une barre d'outils qui permet de naviguer dans<br />

les différences et de les reporter pour effectuer une synchronisation sélective.<br />

3.1.4 Le workspace<br />

Le workspace est l'entité qui permet de conserver les projets et leur contenu.<br />

Physiquement c'est un répertoire du système d'exploitation qui contient une hiérarchie de<br />

fichiers et de répertoires. Il y a d'ailleurs un répertoire pour chaque projet à la racine du<br />

workspace. Le workspace contient tous les éléments développés pour le projet. Les opérations<br />

de gestion permises sont tous réalisées dans la vue Navigateur :<br />

� La création de nouvelles entités : un projet, un répertoire, un fichier,…<br />

� La duplication d'un élément<br />

� Le déplacement d'un élément<br />

� Renommer un élément<br />

� Importation<br />

� Exportation<br />

3.1.5 Le Java Development Tooling (JDT)<br />

Le JDT est inclus dans Eclipse pour fournir des outils de développement en Java. Dans le<br />

workspace, il définit un projet de type particulier pour les projets Java. L'arborescence de ces<br />

projets contient un fichier particulier nommé .classpath qui contient la localisation des<br />

bibliothèques utiles à la compilation et à l'exécution du code. Pour pouvoir développer des<br />

entités en Java, il faut les regrouper dans un projet de type Java.<br />

� Création d'un nouveau projet Java<br />

L’assistant de création demande le type de projet à créer, puis le nom de projet. Et on<br />

peut modifier certains paramètres concernant le chemin de la compilation :<br />

ENSA d’Oujda 17


Etude de serveur d’application JBoss<br />

� La création d'entité<br />

Dans un projet Java, il est possible de créer différentes entités qui entrent dans sa<br />

composition<br />

� les packages<br />

� les classes<br />

� les interfaces<br />

� et Autres<br />

� L'éditeur de code<br />

Le JDT propose un éditeur dédié au fichier contenant du code java. Il propose des<br />

fonctionnalités particulièrement pratiques pour le développement de code Java notamment :<br />

� la coloration syntaxique �<br />

� la complétion de code �<br />

� le formatage du code source<br />

� l'importation et l'exportation de code via un assistant<br />

� Affichage des paramètres sous la forme d'une bulle d'aide<br />

� Utilisation des modèles<br />

� La gestion des importations<br />

� La génération de getter et setter<br />

� Formater le code<br />

� Mise en commentaire d'une portion de code<br />

� Protéger une portion de code avec un bloc try/catch<br />

� Signalisation des erreurs grâce a des indicateurs<br />

� une forte synergie avec le débogueur<br />

3.1.6 Génération de la documentation javadoc<br />

Pour demander la génération de la documentation javadoc, il faut utiliser le menu<br />

"Projet/Générer/Le javadoc" après avoir renseigner les préférences.<br />

� Définition du JRE à utiliser<br />

Eclipse est capable de travailler avec plusieurs JRE. Dans l'arborescence " Java/JRE<br />

installé " des préférences, il est possible de définir plusieurs JRE installés sur la machine.<br />

ENSA d’Oujda 18


Etude de serveur d’application JBoss<br />

� Utilisation du scrapbook<br />

Le scrapbook, traduit par " page de testeur de code ", est une fonctionnalité qui permet de<br />

tester des morceaux de code dans une machine virtuelle.<br />

3.1.7 La perspective "debug"<br />

Pour déboguer du code Java, Eclipse propose une perspective dédiée : la perspective<br />

"débogage". Celle ci est automatiquement affichée lorsqu'une application est lancée sous le<br />

contrôle du débogueur en utilisant le bouton de la barre d'outils. Par défaut, la perspective<br />

débogage affiche quelques vues aussi présentes dans la perspective Java (les vues "Structure"<br />

et "Console") ainsi que l'éditeur de code Java. Et elle affiche aussi plusieurs vues<br />

particulièrement dédiées au débogage. Les vues spécifiques au débogage sont :<br />

� la vue "Débogage" : affiche sous la forme d'une arborescence, les différents processus<br />

en cours d'exécution ou terminés.<br />

� la vue "Variables" : affiche les variables utilisées dans les traitements en cours de<br />

débogage.<br />

� la vue "Points d'arrêts" : affiche la liste des points d'arrêts définis dans l'espace de<br />

travail.<br />

� la vue "Expressions" : permet d'inspecter une expression en fonction du contexte des<br />

données en cours d'exécution.<br />

� la vue "Affichage" : permet d'afficher le résultat de l'évaluation d'une expression.<br />

� Mise en oeuvre du débogueur<br />

La mise en oeuvre du débogueur reste comparable à celle proposé par d'autres IDE : mise<br />

en place d'un point arrêts, exécution plus ou moins rapide dans le débogueur pour arriver à<br />

cibler le problème.<br />

� Mettre en place un point d'arrêt<br />

Pour placer un point d'arrêt, il suffit dans l'éditeur de double cliquer dans la barre de<br />

gauche pour faire apparaître une icône ronde bleue.<br />

� Exécution dans le débogueur<br />

Le plus simple pour lancer le débogage d'une application est de sélectionner l'option<br />

«Déboguer en tant que /Application Java ». L'option "Déboguer ... " permet de fournir des<br />

paramètres précis en vue de l'exécution d'une application sous le débogueur. Un assistant<br />

permet de sélectionner la classe et de préciser les paramètres. Il ne reste plus qu'à mettre en<br />

oeuvre les différentes fonctionnalités proposées par les vues de la perpective pour déboguer le<br />

code.<br />

3.1.8 Le refactoring<br />

ENSA d’Oujda 19


Etude de serveur d’application JBoss<br />

Eclipse intègre de puissantes fonctionnalités pour faciliter le refactoring. Le refactoring<br />

consiste à modifier la structure d'un fichier source et si nécessaire à propager ces<br />

modifications dans les autres fichiers sources pour maintenir autant que possible l'intégrité du<br />

code.<br />

Un menu nommé « Propager les modifications » permet d'utiliser certaines de ces<br />

fonctionnalités : il est présent dans le menu principal et dans de nombreux menus contextuels.<br />

Chacune de ces fonctionnalités est applicable sur un ou plusieurs types d'entité selon le cas :<br />

projets, classes et membres d'une classe. Certaines de ces fonctionnalités possède un raccourci<br />

clavier.<br />

ENSA d’Oujda 20


Etude de serveur d’application JBoss<br />

3.1.9 L'aide dans Eclipse<br />

� L’aide en ligne<br />

L'aide en ligne est disponible dans toute l'interface de l'IDE au moyen de la touche F1.<br />

Cette aide est contextuelle en fonction de l'élément sélectionné dans l'interface au moment de<br />

l'appui sur la touche. Le choix des sujets se rapportant à l'élément courant est affiché dans une<br />

info bulle. Il suffit de cliquer sur l'élément sélectionné pour que l'aide en ligne correspondante<br />

s'affiche.<br />

� L'aide Javadoc<br />

Si la configuration de l'IDE est correcte, il est possible d'accéder directement à la page<br />

javadoc d'un élément java en plaçant le curseur sur cet élément et en appuyant sur F2. Si<br />

l'accès à la documentation javadoc pour l'élément n'est pas configuré un message d'erreur<br />

s'affiche.<br />

� Le plug in Java docs de Crionics<br />

La société Crionics propose un plug in qui s'intègre dans l'aide en ligne de Eclipse et qui<br />

contient la documentation du JDK 1.3 et de quelques API open source. Ce plug in créée une<br />

entrée nommée "Essentials Java Docs" dans la table des matière de l'aide en ligne. Cette<br />

documentation regroupe les API essentielles.<br />

3.2 Le serveur d’application JBOSS :<br />

3.2.1 Les serveurs d’applications :<br />

Le serveur d'application est l'environnement d'exécution des applications côté serveur. Il<br />

prend en charge l'ensemble des fonctionnalités qui permettent à N clients d'utiliser une même<br />

application :<br />

� Le support des plateformes : le serveur d'applications doit implémenter un ensemble<br />

d'API propre à chacun des nombreux systèmes d'exploitation pour d’avantage de<br />

liberté et productivité. A titre d'exemple, lorsqu'une application fait appel à des<br />

fonctions dites système telles que l'ouverture, l'écriture, la lecture ou la suppression de<br />

fichiers, le serveur d'applications doit être en mesure de les exécuter indépendamment<br />

de la plate-forme utilisée.<br />

� Répartition de charges : Un des devoirs du serveur d'applications est d'assurer la<br />

fiabilité et les performances de l'application. Dans ce contexte, la fonctionnalité de<br />

répartition de charges joue un rôle essentiel. D'un point de vue technique, cette<br />

approche se traduit généralement par l'exécution de plusieurs instances qu'il est<br />

possible de répartir sur différentes machines serveur. Cette architecture permet<br />

ENSA d’Oujda 21


Etude de serveur d’application JBoss<br />

également de scinder l'application en modules différents, sans avoir l'obligation de<br />

reproduire sur chacun des serveurs la totalité d'une application. Ainsi, un module<br />

fréquemment sollicité peut être isolé sur un seul serveur afin d'absorber plus<br />

facilement la charge.<br />

� La disponibilité : Dans une configuration où l'application est répliquée sur plusieurs<br />

serveurs physiques, il est plus facile de mettre en place la fonctionnalité de reprise sur<br />

incident. En cas de " plantage " au niveau applicatif ou serveur, la requête utilisateur<br />

est redirigée vers un serveur disponible de manière transparente. La tolérance aux<br />

pannes à ce niveau permet d'offrir la disponibilité au niveau application puisqu'il<br />

existe toujours un module actif pouvant être invoqué par les utilisateurs.<br />

Toutefois, le serveur d'applications doit être également capable de maintenir<br />

l'ensemble des opérations effectuées par l'utilisateur. Pour éviter des désagréments<br />

néfastes, il doit donc prévoir la sauvegarde du contexte utilisateur. Cela implique la<br />

réplication des sessions utilisateur sur une autre machine. A ce niveau, cette<br />

réplication se fait soit en base de données, soit sur disque, soit en mémoire. Les<br />

serveurs d'applications les plus avancés automatisent la gestion de reprise sur incident<br />

au niveau session.<br />

� Le pooling de connexions : En architecture web, l'ensemble des utilisateurs accède à<br />

la base de données depuis le serveur d'applications. Cette connexion peut être<br />

ponctuelle, mais les temps de réponse deviennent alors catastrophiques. La solution la<br />

plus couramment retenue consiste à passer par un pool de connexions. Ceci consiste à<br />

démarrer un nombre prédéfini de connexions vers un SGBDR. Le serveur<br />

d'applications dirige ensuite les demandes utilisateur en répartissant les différentes<br />

requêtes sur les connexions disponibles. Ceci permet d'avoir la maîtrise du nombre de<br />

connexions maximales ouvertes et d'éviter le goulet d'étranglement à ce niveau.<br />

� L’ouverture vers l’existant, le respect des standards : un serveur d’application doit<br />

reconnaître les serveurs http ainsi que la plupart des bases de données relationnelles du<br />

marché. Aussi le serveur d’applications doit respecter les standards tels que Java,<br />

XML et permettre d’intégrer les nouvelles technologies.<br />

� La gestion de contexte : Le principe de gestion de contexte consiste à conserver le<br />

temps d'une session les données propres à l'utilisateur contrairement aux variables<br />

d'application qui ne sont rien d'autre que des variables globales. Toutefois, les<br />

variables de session spécifiques à un utilisateur ne sont envisageables que si<br />

l'utilisateur peut être identifié. Une des fonctionnalités de base du serveur<br />

d'applications est de gérer automatiquement cette identification, suivant une des trois<br />

méthodes : le cookie, l'URL long et la variable cachée. Ceci permet au serveur<br />

d'applications de créer un espace mémoire dédié à chaque utilisateur. C'est à ce<br />

niveau, généralement dans un objet session, que vont être stockées les informations<br />

spécifiques à chacun des utilisateurs. Aussi le serveur doit permettre plus de fonctions<br />

comme le time-out, lancement d’un événement en fin de session, etc.<br />

� La sécurité : un serveur d’application doit permettre de déployer une application<br />

utilisant des services sécurisés avec des ports différents.<br />

ENSA d’Oujda 22


Etude de serveur d’application JBoss<br />

� L’administration : un serveur d’application doit être livré avec un outil<br />

d’administration qui se présente sous la forme d’une interface web ou console. Il doit<br />

favoriser le réglage du serveur d’applications.<br />

3.2.2 JBOSS un serveur d’applications compatible J2EE :<br />

JBOSS est un serveur d'application compatible J2EE. Il a été créé par un ancien ingénieur<br />

français de chez Sun, Marc Fleury. Il est distribué sous licence GPL et s'est spécialisé dans les<br />

technologies EJB (Enterprise Java Beans), une des évolutions de la technologie Java<br />

favorisant la réutilisation des composants.<br />

� JBOSS fournit un certains nombres de modules :<br />

� JBossServer qui comporte une infrastructure constituée des conteneurs EJB, ainsi que<br />

du Java Management Extension (JMX).<br />

� JBossMQ pour la gestion des messages JMS (Java Messaging service)<br />

� JBossTX pour la gestion des transactions avec les API JTA (Java Transaction API ) et<br />

JTS (Java Transaction Service).<br />

� JBossCMP pour la persistance CMP.<br />

� JBossSX pour la sécurité basée sur JAAS (Java Authentication and Authorization<br />

Service).<br />

� JBossCX pour la gestion des connecteurs avec JCA (J2EE Connector Architecture).<br />

Tomcat ou Jetty pour le support des servlets et des pages JSP.<br />

JBOSS permet grâce au JMX de chargé les différents modules, conteneurs ou plugin en<br />

fonction des besoins. Bien entendu, JBOSS permet d'implémenter ses propres services.<br />

3.2.3 Architecture technique de JBOSS :<br />

Cette partie décrit de manière plus détaillée l'architecture du serveur d'application Jboss.<br />

La figure ci-dessous est une vue d'ensemble de l'architecture. Le JMX Implementation, EJB<br />

Container et Remote Management correspondent au composant JbossServer, le JMS au<br />

composant JbossMQ. Le JTS/JTA correspond à JbossTX et les Databases représentent le<br />

stockage des objects avec le composant JbossCMP. La security correspond à la gestion de la<br />

sécurité par JbossSX, les Data sources représentent le composant JbossCX réalisant la gestion<br />

des connecteurs, et enfin les Java Server Pages correspond aux serveurs Tomcat ou Jetty.<br />

ENSA d’Oujda 23


Etude de serveur d’application JBoss<br />

� Le composant JbossServer : Ce composant constitue le coeur du serveur<br />

d'application Jboss. Son rôle est de gérer le noyau grâce au JMX, mais également de<br />

fournir les conteneurs EJB.<br />

Contrairement à la plupart des serveurs d'applications J2EE, JbossServer permet de<br />

déployer et redéployer automatiquement les nouvelles applications sans avoir à<br />

stopper ou arrêter le serveur. Comme vous pourez le voir dans l'installation du serveur<br />

Jboss, un répertoire nommé deploy permet de déployer les nouvelles applications de<br />

manière automatique.<br />

� Le composant JbossMQ : Ce composant est apparu en avril 2000. Il implémente<br />

l'API Java Messaging Service (JMS). Le JMS permet un échange entre des<br />

applications ou des composants via des brokers de messages ou MOM (Middleware<br />

Oriented Messages). Ces échanges peuvent se faire dans un contexte interne (pour<br />

l'EAI) ou un contexte externe (pour le B2B). Le module JBOssMQ supporte plusieurs<br />

sortes de message : RMI (Remote Méthode Invocation)<br />

OIL (Optimized Invocation Layer)<br />

UIL pour les applications clientes qui n'acceptent pas les connexions venant du<br />

Serveur.<br />

� Le composant JbossTX : Ce composant permet le support des moniteurs de<br />

transaction avec les API JTA/JTS. Le JTS définit l'implémentation du manager de<br />

transaction qui supporte l'API de transaction JTA. Malgré que Jboss implémente la<br />

manager de transaction JTS, vous ne pouvez pas accéder directement aux méthodes.<br />

Vous devez utiliser l'API JTA pour invoquer les routines de bas niveau du JTS.<br />

Les services offerts par JbossTX sont:<br />

Fournir aux applications la capacité de contrôler le périmètre et la durée d'une<br />

Transaction, supporter les transactions synchronisées, etc...<br />

� Le composant JBossCMP : Ce module permet de gérer les connexions aux bases de<br />

données grâce au connecteur JDBC. La version actuelle de JBOssCMP permet de se<br />

connecter à 17 bases de données (Oracle, SQLServer, DB2, Sybase, PointBase,<br />

Cloupscape, HypersonicsSQL, PostgreSQL, mySQL, etc ...)<br />

ENSA d’Oujda 24


Etude de serveur d’application JBoss<br />

� Le composant JbossSX : Ce composant a pour rôle de gérer la sécurité grâce à l'API<br />

JAAS. JbossSX fournit une implémentation de la sécurité standard à J2EE. Il permet<br />

notamment l'authentification des utilisateurs grâce au module JAAS Login.<br />

� Le composant JbossCX : JbossCX permet de gérer les connecteurs aux systèmes<br />

d'informations de l'entreprise comme CICS, TUXEDO, SAP, Siebel, etc...<br />

� Le composant Web Servers : Le serveur web est géré à l'aide de deux produits<br />

existants Tomcat et Jetty.<br />

3.2.4 Installation du serveur JBOSS :<br />

Pour installer JBOSS, il faut d’abord télécharger JBOSS depuis le site officiel<br />

www.jboss.org . Comme il existe deux versions du serveur, une avec le serveur web Jetty et<br />

l’autre avec Tomcat, on a choisit d’utiliser la dernière.<br />

Pour installer JBOSS, il suffit de décompresser le fichier zippé à l’endroit voulu. Une fois<br />

décompressé, on a l’arborescence suivante :<br />

La structure des répertoires :<br />

ENSA d’Oujda 25


Etude de serveur d’application JBoss<br />

Répertoire Description<br />

Bin Comporte tous les scripts permettant le démarrage, l'arrêt de Jboss,<br />

notamment le script run.bat pour Windows et run.sh pour linux<br />

Client Comporte tous les fichiers JAR pour le client.<br />

Lib Ce répertoire contient toutes les librairies utilisées pour le<br />

fonctionnement du serveur JBOSS.<br />

Server Ce répertoire comporte tous les fichiers de configuration de Jboss.<br />

Les sous répertoire default, all, minimal représentent les différents<br />

types de configuration.<br />

Server/default/deploy Ce répertoire comporte tous les jars devant être déployé. Si vous<br />

ajoutez un jar dans ce répertoire, celui-ci sera automatiquement<br />

chargé par Jboss.<br />

3.2.5 Quelques caractéristiques de JBOSS :<br />

� Permet le déploiement et le redéploiement des applications sans redémarrer le serveur.<br />

� Intègre une base de données par défaut Hypersonic pour gérer la persistance niveau<br />

conteneur.<br />

� Spécialisé sur la technologies des EJB, mais il implémente les autres fonctions J2EE<br />

comme les servlets ou les JSP via le moteurs de servlets libre Tomcat d’Apache ou<br />

Jetty.<br />

� Gratuit et sous licence GPL.<br />

� Son développement est très actif. Il est soutenu par une communauté de 500<br />

développeurs dans le monde, dont un noyau dur de 50 personnes et il est financé par la<br />

vente de documentations et de services autour de ce produit.<br />

� Offre des caractéristiques avancées telles que l’administration via une console JMX.<br />

� Environnement d’exécution complet et 3 configurations de serveurs prédéfinies.<br />

� JBOSS AS 4.0 est la première application Open Source à obtenir la certification J2EE<br />

de Sun microsystems (23000 tests).<br />

� JBOSS AS 4.0 permet l’approche de l’AOP ou programmation Java orientée aspect.<br />

Cette approche de la programmation associe la complexité de J2EE à la simplicité du<br />

langage Java en apportant des éléments contraints J2EE, mais standardisés.<br />

� JBOSS AS 4.0 implémente les EJB 3.0.<br />

� Une excellente diffusion : c’est le quatrième projet le plus actif sur Sourceforge sur<br />

plus de 70000. Il a déjà été téléchargé plus de 3.500.000 de fois depuis début 2002,<br />

dont 1.500.000 les 6 derniers mois.<br />

� Accès à un très nombre de sources de données (Oracle, SQL Server, MySQL,…).<br />

ENSA d’Oujda 26


Etude de serveur d’application JBoss<br />

3.3 L’outil Ant :<br />

Ant est un projet du groupe Apache−Jakarta. Son but est de fournir un outil écrit en Java<br />

pour permettre la construction d'applications (compilation, exécution de tâches post et pré<br />

compilation ...). Ces processus de construction d'applications sont très importants car ils<br />

permettent d'automatiser des opérations répétitives tout au long du cycle de développement de<br />

l’application (développement, tests, recettes, mises en production ... ). Le site officiel de l'outil<br />

est http://jakarta.apache.org/ant/index.html.<br />

Ant repose sur un fichier de configuration XML qui décrit les différentes tâches qui<br />

devront être exécutées par l'outil. Il fournit un certains nombre de tâches courantes qui sont<br />

codées sous forme d'objets développés en Java. Ces tâches sont donc indépendantes du<br />

système sur lequel elles seront exécutées. De plus, il est possible d'ajouter ces propres tâches<br />

en écrivant de nouveaux objets Java respectant certaines spécifications.<br />

Le fichier de configuration contient un ensemble de cibles (Target). Chaque cible<br />

contient une ou plusieurs tâches et peut avoir une dépendance envers une ou plusieurs autres<br />

cibles pour pouvoir être exécutée.<br />

Ant possède donc plusieurs atouts : multi plate−forme, configurable grâce à un fichier<br />

XML, open source et extensible. Ainsi des plug−ins ont été développés pour la majorité des<br />

IDE (JBuilder, Forte, Visual Age ...) pour leur permettre d'utiliser Ant, devenu un standard de<br />

fait.<br />

3.3.1 Installation de Ant<br />

Avant de commencer l’installation, un jdk1.1 ou supérieur est requis. Ensuite, il faut<br />

suivre les étapes suivantes :<br />

ENSA d’Oujda 27


Etude de serveur d’application JBoss<br />

� dézipper le fichier.<br />

� ajouter le chemin complet au répertoire bin de Ant à la variable système PATH<br />

� s'assurer que la variable JAVA_HOME pointe sur le répertoire contenant le<br />

JDK.<br />

� créer une variable d’environnement ANT_HOME qui pointe sur le répertoire<br />

crée lors de la décompression.<br />

� Il peut être nécessaire d’ajouter les fichiers .jar contenu dans le répertoire lib<br />

de Ant a la variable d’environnement CLASSPATH.<br />

3.3.2 Exécution de Ant<br />

Ant s'utilise en ligne de commande avec la syntaxe suivante : ant [options] [cible], par<br />

défaut, Ant recherche un fichier nommé build.xml dans le répertoire courant. Ant va alors<br />

exécuter la cible par défaut définie dans le projet de ce fichier build.xml.<br />

Pour exécuter un autre fichier de configuration, il faut spécifier le nom dans la commande<br />

après l’option –buildfile :<br />

ant –buildfile file.xml<br />

Et pour exécuter une cible particulière, il suffit de spécifier le nom. Par exemple pour<br />

exécuter la cible clean : ant clean<br />

3.3.3 Le fichier build.xml<br />

Le fichier build est un fichier XML qui contient la description du processus de<br />

construction de l'application.<br />

L'élément principal de l'arborescence du document est le projet représenté par le tag<br />

qui est donc le tag racine du document.<br />

� Le projet<br />

A l’intérieur du tag sont définis les autres éléments du fichier, à savoir les<br />

cibles, les propriétés et les tâches. Il possède les attributs :<br />

� name : cet attribut précise le nom du projet<br />

� default : cet attribut précise la cible par défaut à exécuter si aucune cible n'est précisée<br />

lors de l'exécution<br />

� basedir : cet attribut précise le répertoire qui servira de référence pour la localisation<br />

relative des autres répertoires.<br />

� Les propriétés :<br />

Le tag permet de définir une propriété qui pourra être utilisée dans le projet :<br />

c'est souvent la définition d'un répertoire ou d'une variable qui sera utilisée par certaines<br />

tâches. Leur définition en tant que propriété permet de facilement changer leur valeur une<br />

seule fois même si la valeur de la propriété est utilisée plusieurs fois dans le projet.<br />

<br />

ENSA d’Oujda 28


Etude de serveur d’application JBoss<br />

Les propriétés peuvent être définies sur la ligne de commande avec l’option –D suivie du<br />

nom de la propriété, suivi du =, suivi de sa valeur.<br />

Le tag possède plusieurs attributs :<br />

� name : cet attribut défini le nom de la propriété.<br />

� value : cet attribut défini la valeur de la propriété.<br />

� location : cet attribut permet de définir un fichier avec son chemin absolu. Il<br />

peut être utilisé à la place de l'attribut value.<br />

� file : cet attribut permet de préciser le nom d'un fichier qui contient la définition<br />

d'un ensemble de propriétés. Ce fichier sera lu et les propriétés qu'il contient<br />

seront définies.<br />

L'ordre de définition d'une propriété est très important : Ant gère une priorité sur l'ordre<br />

de définition d'une propriété. La règle est la suivante : la première définition d'une propriété<br />

est prise en compte, les suivantes sont ignorées.<br />

Pour utiliser une propriété définie dans le fichier, il faut utiliser la syntaxe suivante :<br />

${nom_propriete}<br />

� les ensembles de fichiers :<br />

Le tag permet de définir un ensemble de fichiers. Cet ensemble de fichier sera<br />

utilisé dans une autre tâche. La définition d'un tel ensemble est réalisé grâce à des attributs du<br />

tag :<br />

L'expression **/ permet de désigner tous les sous répertoires du répertoire défini dans<br />

l'attribut dir.<br />

Exemple :<br />

<br />

On peut utilisé le tag pour définir un ensemble de motifs pour sélectionner<br />

des fichiers. L’ensemble est identifié par un attribut id, les fichiers a inclure sont définies dans<br />

, et ceux a exclure dans . Le refid peut être utilisé pour référencer un<br />

ensemble déjà défini.<br />

Exemple :<br />

<br />

<br />

<br />

ENSA d’Oujda 29


Etude de serveur d’application JBoss<br />

<br />

Pour définir un ensemble de fichier fini, on utilise le tag . Les attributs sont<br />

l’identifiant id, le dir pour indiquer le répertoire de départ, le files pour indiquer les fichiers<br />

séparés par un virgule, et éventuellement le refid pour référencer un ensemble déjà défini.<br />

Exemple :<br />

<br />

� Les éléments de chemins :<br />

Le tag permet de définir un élément qui sera ajouter à la variable<br />

classpath. La définition d'un tel élément est réaliser grâce à des attributs du tag <br />

: location et path.<br />

Exemple :<br />

<br />

<br />

<br />

<br />

� Les cibles :<br />

Le tag définit une cible. Une cible est un ensemble de tâches à réaliser dans un<br />

ordre précis. Cet ordre correspond à celui des tâches décrites dans la cible.<br />

Les attributs :<br />

name contient le nom de la cible. Cet attribut est obligatoire<br />

description<br />

if<br />

unless<br />

depends<br />

contient une brève description de la cible<br />

permet de conditionner l'exécution par l'existence d'une propriété<br />

permet de conditionner l'exécution par l'inexistence de la définition d'une propriété<br />

permet de définir la liste des cibles dont dépend la cible<br />

L’attribut depends défini un ensemble de cible a exécuté avant l’exécution de la cible<br />

courante.<br />

� Les tâches :<br />

Une tâche est une unité de traitements contenue dans une classe Java qui implémente<br />

l'interface org.apache.ant.Task. Dans le fichier de configuration, une tâche est un tag qui peut<br />

avoir des paramètres pour configurer le traitement à réaliser. Une tâche est obligatoirement<br />

incluse dans une cible.<br />

ENSA d’Oujda 30


Etude de serveur d’application JBoss<br />

Ant fournit en standard un certain nombre de tâches pour des traitements courants lors du<br />

développement en Java dont les plus importantes sont :<br />

� Echo :<br />

La tâche permet d'écrire dans un fichier ou d'afficher un message ou des<br />

informations durant l'exécution des traitements.<br />

Les données à utiliser peuvent être fournies dans un attribut dédié ou dans le corps du tag<br />

.<br />

Exemple :<br />

<br />

<br />

<br />

Fin des traitements du projet ${ant.project.name}<br />

<br />

<br />

<br />

Fin des traitements<br />

<br />

<br />

<br />

� Mkdir :<br />

La tâche permet de créer un répertoire avec éventuellement ces répertoires pères<br />

ci ceux ci n'existent pas. Elle possède un seul attribut dir pour donner le chemin et le nom du<br />

répertoire.<br />

Exemple :<br />

<br />

<br />

<br />

� Delete :<br />

La tâche permet de supprimer des fichiers ou des répertoires. Il a pour attributs :<br />

ENSA d’Oujda 31


Etude de serveur d’application JBoss<br />

� Copy<br />

La tâche permet de copier un ou plusieurs fichiers dans le cas ou ils n'existent pas<br />

dans la cible ou si ils sont plus récents dans la cible. Ses attributs sont :<br />

� Tstamp :<br />

La tâche n’a pas d’attribut et permet de définir trois propriétés :<br />

Exemple :<br />

DSTAMP : cette propriété est initialisée avec la date du jour au format AAAMMJJ<br />

TSTAMP : cette propriété est initialisée avec l'heure actuelle sous la forme HHMM<br />

TODAY : cette propriété est initialisée avec la date du jour au format long<br />

<br />

<br />

<br />

<br />

<br />

<br />

� Java :<br />

La tâche permet de lancer une machine virtuelle pour exécuter une application<br />

compilée.<br />

ENSA d’Oujda 32


Etude de serveur d’application JBoss<br />

Le tag fils permet de fournir des paramètres à l'exécution. Et permet<br />

de définir le classpath à utiliser lors de l'exécution.<br />

Exemple :<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

� Javac :<br />

La tâche permet la compilation de fichiers source contenus dans une<br />

arborescence de répertoires.<br />

ENSA d’Oujda 33


Etude de serveur d’application JBoss<br />

� Javadoc :<br />

La tâche permet de demander la génération de la documentation au format<br />

javadoc des classes incluses dans une arborescence de répertoires.<br />

Cette tâche possède plusieurs attributs dont les principaux sont :<br />

Exemple :<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

ENSA d’Oujda 34


Etude de serveur d’application JBoss<br />

� Jar :<br />

La tâche permet la création d'une archive de type jar.<br />

Exemple :<br />

<br />

<br />

<br />

� Autres :<br />

Ant utilises d’autres tâches pour divers traitements : exécution d’une requête sql, envois<br />

d’un courrier électronique, zipper ou de zipper un fichier, etc. un guide complet du différentes<br />

tâches est fourni dans la documentation de Ant.<br />

3.4 L’outil XDoclet :<br />

XDoclet est un moteur de génération de code. C'est un projet open-source hébergé sur le<br />

site sourceforge.net, sous licence BSD.<br />

Le but de ce projet est d’améliorer la productivité des développeurs en leur évitant de<br />

taper du code redondant et d’avoir à s’occuper des mises à jour des documents liés à un<br />

projet. Ainsi, tout le travail fastidieux de création de fichiers xml de déploiement ou de<br />

paramétrage et la génération de code source commun (interfaces pour les EJB par exemple…)<br />

est supprimé.<br />

Les développeurs n'auront alors plus qu'à se concentrer sur l'édition d'un seul fichier<br />

source Java par composant. Cela s’appelle l’intégration continue. XDoclet permet de générer<br />

du texte (et donc du code) en ajoutant aux fichiers sources codés des balises de type Javadoc<br />

spécifiques. Les principaux bénéfices de l'intégration continue :<br />

� Mise à jour automatique des fichiers de déploiement (meta-data) à chaque fois que le<br />

code est modifié. Le déploiement de ces meta-data est continuellement intégré.<br />

� Travailler avec un seul fichier par composant permet d'avoir une vue plus globale de<br />

l’application en cours de développement. Si le composant est constitué de plusieurs<br />

fichiers, comme les Entreprise Java Bean (EJB), il est facile de s'y perdre. En effet, un<br />

ENSA d’Oujda 35


Etude de serveur d’application JBoss<br />

seul EJB est traditionnellement constitué de 7 fichiers voire plus. Avec XDoclet, il<br />

suffit de maintenir un seul d'entre-eux et le reste sera généré.<br />

� Réduction du temps de développement, et le développeur pourra ainsi se concentrer<br />

sur d'autres aspects puisque XDoclet va générer 85% du code.<br />

Une balise spécifique XDoclet se présente sous la forme :<br />

/**<br />

* @namespace:tag_name name="value" name2="value2" ...<br />

**/<br />

Chaque balise XDoclet est identifiée par un nom (tag_name) qui appartient à un espace de<br />

noms (namespace). Les propriétés sont passées par le format name="value". Il est possible<br />

d'associer plusieurs propriétés à un élément en cumulant les couples name="value".<br />

4 Etude de cas réalisé :<br />

4.1 Description :<br />

L’étude de cas réalisé récapitule l’ensemble des connaissances acquises sur les EJB et les<br />

Servlets. Ainsi, l’application doit permettre de calculer la moyenne de 3 notes d’un étudiant et<br />

de les enregistrer dans la base de données. La saisie du code, nom et les 3 notes de l’étudiant<br />

se fait via un formulaire Html qui va rediriger la requête vers une servlet. Celle-ci va traiter la<br />

requête Post et récupérer les valeurs du formulaire. Il va faire appel à un bean Session qui va<br />

calculer la moyenne des 3 notes et créer un bean Entity CMP qui se chargera d’enregistrer le<br />

code, le nom et la moyenne dans la base de données Hypersonic disponible par défaut avec le<br />

serveur d’application Jboss.<br />

4.2 Architecture de l’application :<br />

Notre application suit cette architecture car elle se compose d’une servlet, deux EJB<br />

(Session et Entity).<br />

ENSA d’Oujda 36


Etude de serveur d’application JBoss<br />

4.3 Préparatifs : JBOSS IDE<br />

Jboss IDE est un plug-in pour Eclipse qui permet de contrôler Jboss directement depuis<br />

Eclipse : démarrage, arrêt et fenêtre console de Jboss intégré à l'éditeur. Il permet également,<br />

à l’aide d’assistant, de créer des composants EJB, Servlets et des pages JSP ainsi que des<br />

projets J2EE de façon automatisé, ceci afin d’éviter au programmeur d’écrire le squelette de<br />

ces composants. La dernière version (1.3.3) est disponible sur le site de SourceForge.<br />

Pour l’installer, il faut fermer tout d’abord Eclipse si celui-ci est ouvert, ensuite<br />

décompresser le contenu de l’archive téléchargée dans le répertoire de l’installation d’Eclipse.<br />

Une fois ceci effectué il faut relancer Eclipse et aller vous dans le menu Help > Software<br />

Update > Manage Configuration. Cliquer ensuite sur le bouton « Show disabled features ».<br />

Il faut ensuite faire un clic droit sur JBoss-IDE 1.3.30 et choisir Enable dans le menu.<br />

Confirmer le redémarrage d’Eclipse pour que le changement soit pris en compte. Une fois le<br />

plug-in installé il faut maintenant afficher les nouvelles fonctionnalités offertes par celui-ci.<br />

Pour cela, il faut aller dans le menu Windows > Custom perspective, la fenêtre suivante<br />

s’affiche :<br />

ENSA d’Oujda 37


Etude de serveur d’application JBoss<br />

Dans le menu déroulant il faut choisir New et cocher ensuite la case JBoss-IDE. Cela a<br />

pour effet d’afficher les nouveaux assistants quand vous utiliserez le menu File > New.<br />

Toujours dans le même menu déroulant choisir maintenant Show View et cocher encore<br />

JBoss-IDE. Cela a pour effet d’afficher les deux nouvelles vues disponibles dans le menu<br />

Window > Show View. La nouvelle vue Server Navigator est particulièrement utile pour<br />

démarrer ou arrêter le serveur JBoss à partir d’Eclipse.<br />

ENSA d’Oujda 38


Etude de serveur d’application JBoss<br />

Avant de pouvoir rajouter le serveur JBoss à la vue Server Navigator il faut effectuer une<br />

modification dans le menu Window > Preferences:<br />

ENSA d’Oujda 39


Etude de serveur d’application JBoss<br />

Le serveur JBoss a besoin d'utiliser la machine virtuelle incluse avec le JDK. Pour cela<br />

allez dans le menu Java puis Installed JREs, cliquez sur Add. Dans la fenêtre suivante,<br />

cliquer sur Browse pour le champ JRE home directory puis indiquer le répertoire<br />

d’installation de JDK. Pour rajouter le serveur JBoss ouvrer la vue Server Navigator (Window<br />

> Show Wiew) et Choisir la version du serveur JBoss dans la liste (4.0 ici) et cliquer sur New<br />

pour créer une nouvelle configuration de lancement. Renseignez ensuite le chemin d’accès au<br />

répertoire Jboss, valider la nouvelle configuration en cliquant sur Apply et fermer la fenêtre.<br />

Pour démarrer ou arrêter le serveur JBoss un simple clic droit sur la nouvelle<br />

configuration donne accès au menu permettant ces actions.<br />

ENSA d’Oujda 40


Etude de serveur d’application JBoss<br />

4.4 Création du projet :<br />

Après avoir lancé Eclipse, on crée un nouveau projet par « File/New/Project... ». On<br />

choisit »JBoss-IDE/J2EE1.4 Project », puis on clique sur « Next ». Appelons donc le projet «<br />

Projet», puis cliquons sur « Next ».<br />

Dans la fenêtre suivante, il faut définir les répertoires des fichiers sources et binaires,<br />

ainsi que les fichiers jar nécessaires à l'application j2ee.<br />

Nous commençons par créer un répertoire source, que nous appellerons « src », en<br />

cliquant sur « Add folder... », et en saisissant « src ».Il faut définir ensuite le répertoire des<br />

binaires en saisissant « Tutorial/bin » dans « Default output folder ».<br />

Ensuite, nous allons dans l'onglet « Libraries ». Plusieurs bibliothèques ont déjà été<br />

importées automatiquement. Nous allons rajouter les jars spécifiques à Jboss. Pour ce faire,<br />

nous cliquons sur « Add external jars », et nous ajoutons « javax.servlet.jar » (dans<br />

jboss4.0.0/server/default/lib) et « jboss-j2ee.jar » (dans jboss4.0.0/client).<br />

ENSA d’Oujda 41


Etude de serveur d’application JBoss<br />

Nous pouvons maintenant cliquer sur « Finish ». Le projet est créé.<br />

4.4.1 Création de L’EJB Session :<br />

Nous allons tout d'abord créer notre EJB Session stateless, CalculBean, dont la méthode<br />

Moyenne calcule la moyenne des 3 notes.<br />

Création de l’EJB Session :<br />

On clique sur « File/New/Other », puis on choisit « JBoss-IDE/EJB Components/Session<br />

Bean », et on clique sur « Next ». On peut ensuite renseigner notre EJB : on indique le<br />

package : « projet/ejb » ; puis on indique que l'EJB est « stateless », avec interfaces « remote<br />

», et que l'on ajoute la méthode «ejbCreate », puis on clique sur « Finish ».<br />

Il ne reste plus qu'à coder la méthode « Moyenne ». Afin de générer automatiquement les<br />

tags Xdoclet, on passe par les menus : Dans la fenêtre « Outline », on fait un clic droit sur «<br />

CalculBean », et dans « J2EE », on choisit « Add Business Method », que l'on complète<br />

après.<br />

ENSA d’Oujda 42


Etude de serveur d’application JBoss<br />

ENSA d’Oujda 43


Etude de serveur d’application JBoss<br />

On code ensuite notre méthode Moyenne et on rajoute les commentaires Xdoclet. Au<br />

final notre EJB a l’allure suivante :<br />

/*<br />

* Created on 15 janv. 2005<br />

*<br />

* TODO To change the template for this generated file go to<br />

* Window - Preferences - Java - Code Style - Code Templates<br />

*/<br />

package projet.ejb;<br />

import java.rmi.RemoteException;<br />

import javax.ejb.EJBException;<br />

import javax.ejb.SessionBean;<br />

import javax.ejb.SessionContext;<br />

import javax.ejb.CreateException;<br />

//import javax.naming.Context;<br />

import javax.naming.InitialContext;<br />

import javax.naming.NamingException;<br />

//import javax.rmi.PortableRemoteObject;<br />

import projet.interfaces.EtudiantLocal;<br />

import projet.interfaces.EtudiantLocalHome;<br />

/**<br />

ENSA d’Oujda 44


Etude de serveur d’application JBoss<br />

* @ejb.bean name="Calcul"<br />

* display-name="Name for Calcul"<br />

* description="Description for Calcul"<br />

* jndi-name="ejb/Calcul"<br />

* type="Stateless"<br />

* view-type="remote"<br />

* @ejb.ejb-local-ref name="Save"<br />

* type="Entity"<br />

* local-home="projet.interfaces.EtudiantLocalHome"<br />

* local="projet.interfaces.EtudiantLocal"<br />

* @jboss.ejb-local-ref ref-name = "Save"<br />

* jndi-name = "EtudiantLocalH"<br />

*/<br />

public class CalculBean implements SessionBean {<br />

/**<br />

*<br />

*/<br />

public CalculBean() {<br />

super();<br />

// TODO Auto-generated constructor stub<br />

}<br />

/* (non-Javadoc)<br />

* @see javax.ejb.SessionBean#setSessionContext(javax.ejb.SessionContext)<br />

*/<br />

public void setSessionContext(SessionContext ctx)<br />

throws EJBException,<br />

RemoteException {<br />

// TODO Auto-generated method stub<br />

}<br />

/* (non-Javadoc)<br />

* @see javax.ejb.SessionBean#ejbRemove()<br />

*/<br />

public void ejbRemove() throws EJBException, RemoteException {<br />

// TODO Auto-generated method stub<br />

}<br />

/* (non-Javadoc)<br />

* @see javax.ejb.SessionBean#ejbActivate()<br />

*/<br />

public void ejbActivate() throws EJBException, RemoteException {<br />

// TODO Auto-generated method stub<br />

}<br />

/* (non-Javadoc)<br />

* @see javax.ejb.SessionBean#ejbPassivate()<br />

*/<br />

public void ejbPassivate() throws EJBException, RemoteException {<br />

// TODO Auto-generated method stub<br />

}<br />

/**<br />

* Default create method<br />

ENSA d’Oujda 45


Etude de serveur d’application JBoss<br />

*<br />

* @throws CreateException<br />

* @ejb.create-method<br />

*/<br />

public void ejbCreate() throws CreateException {<br />

// TODO Auto-generated method stub<br />

}<br />

/**<br />

* Business method<br />

* @ejb.interface-method view-type = "remote"<br />

*/<br />

public double Moyenne(double note1, double note2, double note3) {<br />

// TODO Auto-generated method stub<br />

return (note1 + note2 + note3) / 3;<br />

}<br />

public void enregistrer(String code, String nom, double moyen) {<br />

try {<br />

javax.naming.Context jndiContext = new InitialContext();<br />

EtudiantLocalHome home = (EtudiantLocalHome) jndiContext<br />

.lookup("java:comp/env/EtudiantLocalH");<br />

EtudiantLocal instance = home.create(code);<br />

instance.setName(nom);<br />

instance.setMoyenne(moyen);<br />

} catch (NamingException ne) {<br />

// throw new EJBException(ne);<br />

} catch (CreateException ne) {<br />

}<br />

}<br />

}<br />

Génération de fichiers complémentaires pour l’EJB ( Home et l’interface Remote) :<br />

Pour générer ces fichiers complémentaires (les interfaces de l’EJB ainsi que les<br />

descripteurs de déploiement), il faut configurer XDoclet.<br />

Pour cela, il faut ouvrir la configuration en faisant un clic droit sur le projet « Projet », et<br />

en choisissant « Properties ». Ensuite, on se rend dans la rubrique « Xdoclets Configurations<br />

». On fait un clic droit dans la fenêtre en haut à droite, on choisit « Add Standard », et on<br />

choisit « Standard EJB ».<br />

Cela met à jour la plupart des champs nécessaires. On peut cliquer sur le « Standard EJB<br />

» créé, et se promener dans les fenêtres du bas pour s'en rendre compte. La seule modification<br />

consiste à se rendre dans « fileset » et à modifier « includes » (remplacer « **/*.java » par<br />

« **/*Bean.java »).<br />

ENSA d’Oujda 46


Etude de serveur d’application JBoss<br />

On clique ensuite sur « OK ». On peut ensuite lancé la construction de l'EJB en faisant un<br />

clic droit sur le projet Projet, et en cliquant sur « Run Xdoclet ». Après le refresh, Le fichier «<br />

xdoclet-build.xml » est généré. Cette action génère aussi les méta-informations de l'EJB, ainsi<br />

que les classes d'interface (home/remote).<br />

4.4.2 Création de l’EJB Entity :<br />

Enfin, il faut implémenter le dernier élément composant ce projet : l’EJB Entity. Le rôle<br />

de ce dernier est la gestion de la persistance des données. Il existe deux types, mais ici le<br />

CMP qui sera utilisé. L’avantage de ce composant est qu’il permet de gérer rapidement<br />

l’accès à une base de données sans avoir à écrire la moindre ligne de code utilisant JDBC.<br />

Cet exemple s’appuie sur la base de données par défaut fournis avec JBOSS qui est<br />

Hypersonic.<br />

Pour créer cet EJB sous Eclipse, il faut utiliser l’assistant, on clique sur « File/New/Other<br />

», puis on choisi « JBoss-IDE/EJB Components/Entity Bean », et on clique sur « Next ».<br />

On peut ensuite renseigner notre EJB : on indique le package : « projet/ejb » ; puis on<br />

indique Un nom : EtudiantBean, puis on clique sur « Finish ».<br />

ENSA d’Oujda 47


Etude de serveur d’application JBoss<br />

Le bean crée sera donc à la norme CMP 2.x et accessible uniquement en local ce qui<br />

suffit amplement puisque celui-ci sera utilisé par le bean Session.<br />

Il faut ensuite spécifier la méthode ejbCreate.<br />

ENSA d’Oujda 48


Etude de serveur d’application JBoss<br />

Ajout de tags spécifiques à la classe :<br />

Nous devons maintenant rajouter un certain nombre de tags XDoclet qui vont permettre<br />

de définir la base de données et la table sur laquelle le bean devra opérer. Cela évite donc<br />

d’avoir à ajouter manuellement ces informations aux descripteurs de déploiement. Voici la<br />

liste de tous les tags rajoutés avant la déclaration de la classe accompagnés d’une description :<br />

* primkey-field = "Id"<br />

* @ejb.persistence<br />

* table-name = "etudiant"<br />

Son rôle est de définir le nom de la table sur laquelle le bean devra effectuer les<br />

différentes opérations d’ajout, modifications, etc. … ainsi que la clé primaire utilisée.<br />

ENSA d’Oujda 49


Etude de serveur d’application JBoss<br />

Ajout des tags spécifiques aux méthodes :<br />

Maintenant que nous avons rajouté les différents tags au niveau de la classe, nous<br />

pouvons rajouter les différentes variables et méthodes nécessaires au fonctionnement de notre<br />

bean entité.<br />

Le bean entité représentant un enregistrement d’une table de notre base de données, il<br />

doit donc contenir autant de champ que la table en question. Elle se compose des champs<br />

suivants :<br />

� Id : type varchar, clé primaire<br />

� Nom : type varchar,<br />

� Moyenne : type float<br />

Pour chacun des champs, il faut créer deux méthodes : une pour faire le get et l’autre pour<br />

faire le set et de spécifier le nom de la colonne et son type grâce aux tags XDoclet.<br />

/**<br />

If faut rajouter quelques éléments accompagnés de quelques tags.<br />

* Getter for CMP Field Id<br />

*<br />

* @ejb.pk-field<br />

* @ejb.persistent-field<br />

* @ejb.interface-method view-type="local"<br />

* @ejb.persistence column-name = "Id"<br />

* sql-type = "VARCHAR"<br />

*/<br />

public abstract String getId();<br />

/**<br />

* Setter for CMP Field Id<br />

*<br />

* @ejb.interface-method view-type="local"<br />

*/<br />

public abstract void setId(String value);<br />

ENSA d’Oujda 50


Etude de serveur d’application JBoss<br />

/**<br />

* Getter for CMP Field Name<br />

*<br />

*<br />

* @ejb.persistent-field<br />

* @ejb.interface-method view-type="local"<br />

* @ejb.persistence column-name = "Nom"<br />

* sql-type = "VARCHAR"<br />

*/<br />

public abstract String getName();<br />

/**<br />

* Setter for CMP Field Name<br />

*<br />

* @ejb.interface-method view-type="local"<br />

*/<br />

public abstract void setName(String value);<br />

/**<br />

* Getter for CMP Field Moyenne<br />

*<br />

*<br />

* @ejb.persistent-field<br />

* @ejb.interface-method view-type="local"<br />

* @ejb.persistence column-name = "Moyenne"<br />

* sql-type = "FLOAT"<br />

*/<br />

public abstract double getMoyenne();<br />

/**<br />

* Setter for CMP Field Moyenne<br />

ENSA d’Oujda 51


Etude de serveur d’application JBoss<br />

*<br />

* @ejb.interface-method view-type="local"<br />

*/<br />

public abstract void setMoyenne(double value);<br />

Implémentation :<br />

Enfin de pouvoir créer et utiliser ce bean nous devons implémenter une méthode<br />

ejbCreate, elle doit comporter en argument le champ correspondant à la clé primaire de la<br />

table. Pour notre cas elle doit donc avoir une chaîne de caractère.<br />

/**<br />

* Create method<br />

* @ejb.create-method view-type = "local"<br />

*/<br />

public String ejbCreate(String code) throws javax.ejb.CreateException {<br />

}<br />

// TODO Auto-generated method stub<br />

return null;<br />

this.setId(code);<br />

4.4.3 Création de la Servlet :<br />

Pour la création du Servlet, il faut commencer par cliquer sur « File/New/Others », puis<br />

choisir « Web Components/HTTP Servlet ». Dans la fenêtre de dialogue, placer la servlet<br />

dans le package « projet.web », on appelle le servlet « CalculServlet », et on implémente les<br />

méthodes init(), doGet() et doPost().<br />

Nous allons ensuite coder deux méthodes : la méthode init, dans laquelle nous allons lier<br />

le servlet à l'EJB, par le biais du contexte, et la méthode reponse, méthode privée qui crée la<br />

page de réponse et appelée par doPost et doGet. On n'oubliera pas de créer les entrées<br />

Xdoclets pour les références au titre de la page et à l'EJB ainsi que le mapping jboss de l'EJB<br />

(on enlèvera également le paramétrage de l'init).<br />

ENSA d’Oujda 52


Etude de serveur d’application JBoss<br />

Le code de la Servlet est le suivant :<br />

/*<br />

* Created on 15 janv. 2005<br />

*<br />

* TODO To change the template for this generated file go to<br />

* Window - Preferences - Java - Code Style - Code Templates<br />

*/<br />

package projet.web;<br />

import javax.naming.Context;<br />

import javax.naming.InitialContext;<br />

import javax.rmi.PortableRemoteObject;<br />

import javax.servlet.http.HttpServlet;<br />

ENSA d’Oujda 53


Etude de serveur d’application JBoss<br />

import javax.servlet.ServletException;<br />

import javax.servlet.ServletConfig;<br />

import java.io.IOException;<br />

import java.io.PrintWriter;<br />

import javax.servlet.http.HttpServletRequest;<br />

import javax.servlet.http.HttpServletResponse;<br />

import projet.interfaces.Calcul;<br />

import projet.interfaces.CalculHome;<br />

/**<br />

* Servlet Class<br />

*<br />

* @web.servlet name="Calcul"<br />

* display-name="Name for Calcul"<br />

* description="Description for Calcul"<br />

* @web.servlet-mapping url-pattern="/Calcul"<br />

* @web.servlet-init-param name="A parameter"<br />

* value="A value"<br />

* @web.ejb-ref name = "Calcul"<br />

* type = "Session"<br />

* home = "projet.interfaces.CalculHome"<br />

* remote = "projet.interfaces.Calcul"<br />

* description = "ref de calcul"<br />

* @jboss.ejb-ref-jndi ref-name = "Calcul"<br />

* jndi-name = "ejb/Calcul"<br />

*<br />

*/<br />

public class CalculServlet extends HttpServlet {<br />

private CalculHome home;<br />

/**<br />

*<br />

*/<br />

public CalculServlet() {<br />

super();<br />

// TODO Auto-generated constructor stub<br />

}<br />

public void init(ServletConfig config) throws ServletException {<br />

//super.init(config);<br />

// TODO Auto-generated method stub<br />

try {<br />

Context ctx=new InitialContext();<br />

Object ref=ctx.lookup("ejb/Calcul");<br />

home=(CalculHome)PortableRemoteObject.narrow(ref,CalculHome.class);<br />

}catch(Exception e) {<br />

throw new ServletException("lookup of java:/comp/env/Calcul failed");<br />

}<br />

}<br />

protected void doGet(HttpServletRequest req, HttpServletResponse resp)<br />

throws ServletException,<br />

IOException {<br />

// TODO Auto-generated method stub<br />

super.doGet(req, resp);<br />

}<br />

ENSA d’Oujda 54


Etude de serveur d’application JBoss<br />

protected void doPost(<br />

HttpServletRequest request,<br />

HttpServletResponse response) throws ServletException, IOException {<br />

// TODO Auto-generated method stub<br />

reponse(request,response);<br />

}<br />

private void reponse(HttpServletRequest req, HttpServletResponse resp)throws ServletException,<br />

IOException{<br />

resp.setContentType("text/html");<br />

PrintWriter out=resp.getWriter();<br />

out.println("");<br />

out.println("la moyenne");<br />

out.println("");<br />

out.println("");<br />

try{<br />

Calcul bean=home.create();<br />

double limit1=0;<br />

double limit2=0;<br />

double limit3=0;<br />

String code=req.getParameter("code");<br />

String nom=req.getParameter("name");<br />

String note1=req.getParameter("note1");<br />

String note2=req.getParameter("note2");<br />

String note3=req.getParameter("note3");<br />

try{<br />

limit1=Double.parseDouble(note1);<br />

limit2=Double.parseDouble(note2);<br />

limit3=Double.parseDouble(note3);<br />

}catch (Exception e) {<br />

}<br />

double result=bean.Moyenne(limit1,limit2,limit3);<br />

bean.enregistrer(code,nom,result);<br />

out.println("enregistrement");<br />

// bean.remove();<br />

out.println("");<br />

out.println("l'etudiant "+nom+" est enregistré ");<br />

out.println("La moyenne des notes est :");<br />

out.println("" +result);<br />

out.println("");<br />

}catch(Exception e){<br />

e.printStackTrace(out);<br />

}finally{<br />

out.println("");<br />

out.println("");<br />

}<br />

}}<br />

Il nous reste à générer les fichiers relatifs au servlet. On commence par rouvrir les<br />

propriétés du projet, et on retourne dans la configuration de Xdoclet. On ajoute un « Standard<br />

Web », et on modifie :<br />

« webdoclet/destDir » (remplacer « src » par « src/WEB-INF »).<br />

« fileset/includes » (remplacer « **/*.java » par « **/*Servlet.java »).<br />

« jbosswebxml/Version » (4.0)<br />

ENSA d’Oujda 55


Etude de serveur d’application JBoss<br />

On ferme ensuite en cliquant sur « ok », et on relance le « Run XDoclet » dans le menu<br />

contextuel du projet (puis on fait un refresh quand le run est terminé).<br />

On crée ensuite un répertoire pour mettre la page html qui invoque le servlet. On crée<br />

donc un répertoire « docroot » dans le projet (clic droit+ »New/Folder »). On crée à<br />

L’intérieur un fichier « index.html » (par «New/Other » + « Web Components/HTML Page»).<br />

Ce fichier ressemble au contenu suivant :<br />

<br />

<br />

<br />

calcul<br />

<br />

<br />

Formulaire etudiant<br />

<br />

<br />

<br />

code:<br />

name :<br />

note1:<br />

note2:<br />

ENSA d’Oujda 56


Etude de serveur d’application JBoss<br />

note3:<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

4.4.4 Création de l’application Web:<br />

Nous allons assembler tous nos éléments dans une application j2ee. Pour ce faire nous<br />

allons créer un fichier « application.xml » dans « src/META-INF » (à partir de « New/File »).<br />

Ce fichier liste les modules (ejb et web) qui composent l'application, et indique le point<br />

d'accès au module web.<br />

<br />

<br />

<br />

Sum Application<br />

<br />

CalculEJB.jar<br />

<br />

<br />

<br />

CalculWeb.war<br />

/calcul<br />

<br />

<br />

<br />

On indique ensuite les paramètres de paquetage de l'application et de ses modules. Pour<br />

se faire on ouvre la fenêtre des propriétés du projet, et on va dans « Packaging configurations<br />

». On doit créer quatre rubriques : une pour l'application, une pour le module ejb , une pour le<br />

module web, plus une pour les clients de l'ejb (en l'occurence, le servlet).<br />

Pour l'ejb, on fait un clic droit dans la fenêtre en haut à droite, et on sélectionne « Add<br />

Archive ». On appelle cette archive « CalculEJB.jar », et on clique sur OK. On ajoute ensuite<br />

les rubriques suivantes:<br />

ENSA d’Oujda 57


Etude de serveur d’application JBoss<br />

� Liste des ejb : on précise que l'on utilise les classes des packages ejb et interfaces.<br />

Pour ce faire, clic droit sur « CalculEJB.jar », « Add Folder ». On indique comme<br />

folder « /Projet/bin », puis on indique dans « Includes » : «<br />

projet/ejb/*.class,projet/interfaces/*.class ».<br />

� Fichiers de configuration: Clic droit sur « CalculEJB.jar », « Add File ». On ajoute<br />

deux rubriques, une pour « /Projet/src/META-INF/ejb-jar.xml », une pour «<br />

/Projet/src/METAINF/jboss.xml », en précisant dans les deux cas le préfixe « META-<br />

INF » (c à d qu'ils seront placés dans ce sous répertoire dans le .jar généré).<br />

On crée ensuite l'entrée pour les clients : Clic droit dans la fenêtre + « Add Archive » : on<br />

l'appelle calcul-client.jar. Il suffit de placer à l'intérieur les interfaces de l'EJB : Clic droit+ «<br />

AddFolder ». On indique comme folder « /Projet/bin », puis on indique dans « Includes » : «<br />

projet/interfaces/*.class ».<br />

On crée le module web : Clic droit dans la fenêtre + « Add Archive » (on l'appelle<br />

CalculWeb.war).<br />

� On y place le servlet : clic droit + « Add Folder » + Folder = «Projet/bin » et Includes<br />

=« projet/web/*.class ».<br />

� On ajoute les fichiers de configuration (Projet/src/WEB-INF/jboss-web.xml et<br />

Projet/src/WEB-INF/web.xml) avec « Add File ». Sans oublier de préciser le prefix :<br />

ENSA d’Oujda 58


Etude de serveur d’application JBoss<br />

« WEBINF».<br />

On ajoute enfin le module client, afin que le servlet le voie. On fait donc clic droit+ «<br />

Add File » et on choisit le fichier « Projet/calcul-client.jar » (qui n'existe pas encore car c'est<br />

l’exécution du paquetage qui le créera...). Comme il n'existe pas, on clique sur « Project File »<br />

et on saisit à la main le nom du fichier... Le préfix doit être « WEB-INF/lib »<br />

� Pour avoir accès à index.html on ajoute le répertoire « docroot ».<br />

Reste à créer la configuration de l'application. Dans la fenêtre, on fait un clic droit+ «<br />

Add Archive ». On l'appelle « CalculApp.ear ». On y ajoute le fichier « /Projet/src/META-<br />

INF/application.xml », avec le prefix « META-INF ». On ajoute ensuite les fichiers «<br />

/Projet/CalculEJB.jar » et « /Projet/CalculWeb.war ». Comme ils n'existent pas encore, on<br />

procède comme précédemment.<br />

On peut ensuite cliquer sur ok, puis dans le menu contextuel du projet, lancer « Run<br />

Packaging ». On fait un « refresh » pour voir tous les fichiers générés.<br />

Ainsi l’architecture finale de l’application est la suivante :<br />

4.4.5 Déploiement et exécution :<br />

ENSA d’Oujda 59


Etude de serveur d’application JBoss<br />

Pour tester l'application, on lance JBOSS, puis on déploie l'application en faisant un clic<br />

droit sur « CalculApp.ear » + « Deployment/Deploy to », et choisir « default ».<br />

Pour tester l'application, on lance un navigateur et on va à l'URL : «<br />

http://localhost:8080/calcul »...<br />

ENSA d’Oujda 60


Etude de serveur d’application JBoss<br />

Les données comme l’id, le nom et la moyenne de l’étudiant sont bien enregistré dans la<br />

table etudiant de la base de données.<br />

ENSA d’Oujda 61


Etude de serveur d’application JBoss<br />

5 Conclusion :<br />

L’utilisation d’un serveur d’application open source comme Jboss permet d’avoir plus de<br />

contrôle sur l’environnement utilisé car l’un des avantages majeurs des outils open source est<br />

de pouvoir modifier le code source et l’adapter à des besoins spécifiques de l’entreprise. En<br />

plus, et pour la plupart des outils open source dont Jboss, la correction des bogues est assurée<br />

par une large communauté, ce qui permet d’accélérer le processus de mise à jour des outils<br />

open source.<br />

Ce projet nous a permet sur le plan formation, d’aborder un sujet de grande envergeure<br />

qui est celui des serveurs d’applications et d’étudier la technologie J2EE. Ainsi, on a utilisé<br />

les composants côte serveur, qui sont les EJB ainsi que les servlets et les JSP pour le<br />

développement web. En parallèle, on a eu l’occasion de découvrir des outils Open Source<br />

comme Ant et XDoclet permettant de simplifier la tâche des développeurs tout en profitant<br />

des possibilités offertes par un environnement de développent intégré qui est Eclipse.<br />

6 Bibliographie :<br />

Le site officiel de Jboss : www.jboss.org<br />

Le site officiel d’Eclipse : www.eclipse.org<br />

Livre : Entreprise JavaBeans édition O’Reilly de Richard Monson-Haefel<br />

ENSA d’Oujda 62

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!