Encadr - MultiMania
Encadr - MultiMania
Encadr - MultiMania
Transformez vos PDF en papier électronique et augmentez vos revenus !
Optimisez vos papiers électroniques pour le SEO, utilisez des backlinks puissants et du contenu multimédia pour maximiser votre visibilité et vos ventes.
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