Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
TP11
Web Services
Objectifs
● Priorité est donnée au projet PAI !
● L'objectif de ce TP est d'apprendre à mettre en place des Web Services (SOAP), de les déployer, et
de les utiliser dans des applications clientes.
● Plus précisément, ce TP consistera, dans le cadre du PAI, en la mise en place d'un Web Service
Serveur (et d'un client de test) permettant de faire le lien entre des données XML et une IHM (le
client). Nous procéderons ainsi en plusieurs étapes. Toute la partie serveur sera réalisée dans un
seul et même projet netbeans, la partie client (test) correspondant à un autre projet. L'une d'elle,
la partie serveur, correspond au projet déjà réalisé lors de la dernière séance et nommé
CabinetInfirmierServer. En ce qui concerne le projet TUX, ceux qui ont choisi de suivre l'option
[WebService] mettront en place un WebService, serveur de mots du dictionnaire, et l'appeleront
dans la partie cliente, le jeu TuxGame, pour obtenir ces mots. Cette partie concernant TUX sera
rapide. Dans les deux cas, projets PAI et TUX, les objectifs sont les suivants :
● (1) Mettre en place un Web Service partie serveur
● (2) Proposer des services avec des traitements sur les données
● (3) Utiliser ce Web Service dans un client de test
● (4) Tester le Web Service du PAI avec l'IHM
● Lors de cette séance, vous terminerez les projets TUX et PAI. Rendu : pour le projet PAI, le rendu
se fera sous la forme d'une présentation de minutes par binome le lundi 04/12 pendant votre projet
réseau. Pour le projet TUX, le rendu se fera la semaine d'après [date à définir, mais probablement
le 11/12], sous la forme d'une archive ZIP de l'ensemble du projet, c'est à dire comprenant les
parties XML, XSD, XSL, Java, Binding et éventuellement Web Service, selon option. Si l'option
[WebService] a été choisie, cette archive contiendra les deux projets netbeans : la partie serveur et
la partie cliente. L'archive devra porter le nom NOM1_NOM2_2017.zip. Elle sera récupérée par
l'enseignant. Aucun délais ne sera accordé.
Mise en place
● Ayez sous les yeux vos cours sur le Data Binding et les Web Services, ainsi que les sites de
référence donnés en bas de ce document.
Description de l'exercice
Cet exercice est le début d'une série d'exercices visant à transformer notre cabinet d'infirmiers en
Web Service. La suite de ce travail sera donc composée de plusieurs parties:
Il est extrêmement important que chaque partie soit parfaitement fontionnelle avant de passer à
l'étape d'après. Vérifiez donc que vous avez respecté chacun des points.
Question 1.1
Créez une nouvelle application Java de type Web Application (File -> NewProject -> JavaWeb
-> Web Application) que vous nommerez CabinetInfirmierServer
Vérifiez bien que le serveur est Glassfish et que JavaEE sont selectionnés ; pas besoin de
sélectionner un Framework.
Le fichier XmlRootBinding.xml ,le fichier de configuration pour le compilateur xjc est fourni. Ce
fichier de configuration est nécessaire lors du binding pour simplifier la manipulation des classes en
Java.
Nous allons le compilateur de schema inclu dans Java, le compilateur xjc, cf le site de JAXB, pour
Java Architecture for XML Binding.
Les étapes suivantes sont valables pour tout Data Binding ultérieur dans les autres exercices.
Vous devriez obtenir une fenêtre similaire à celle présentée ci-dessous que vous paramètrerez de la
même manière.
● Binding Name : nom, c'est à dire identité, du binding JAXB ; ex: CabinetBinding
● Project : nom du projet courant ; ici: TuxGame par exemple, selon comment vous l'avez appelé
● Schema File : nom du fichier utilisé pour la génération de schema. Le wizard JAXB de netbeans
reconnait un certain nombre de formats de schema : XML Schema, Relax NG normal et compact,
XML DTD, et WSDL ; cf cours sur les web services.
Ici, nous voulons faire le binding du Cabinet, donc nous utiliserons cabinet.xsd.
● Package Name : nom du package java utilisé pour la génération des objets ; disons tux.
● Compiler Options : plusieurs options sont possibles : nv, pas de validation stricte ; readOnly,
le code Java généré ne sera pas modifiable ; npa, suppression des annotations de package ;
verbose, la compilation indiquera plus d'informations et affichera les warnings ; quiet, la
compilation se fera "en silence", aucun message ne sera affiché.
● Use Extension : permet d'utiliser les extensions pour la compilation de schema ; les extensions
sont dépendantes du type de compilateur utilisé : xmlbeans, jaxb, ...etc...
Pensez à cocher cette case.
● Use Binding File : permet de définir un fichier de configuration spécifique afin de
"personnaliser" la compilation.
Pensez à ajouter le fichier XmlRootBinding.xml .
● Use Catalog File : permet d'importer et d'éditer des "catalogues" de fichiers, utiles lorsqu'on
utilise des DTD.
Question 1.5
Remplissez les paramètres comme indiqué sur l'image ci-dessus :
Lorsque vous cliquez sur Finish, JAXB compile le schema et génère les classes correspondantes.
Ouvrez l'onglet Files, pour une vision classique des fichiers de votre projet Netbeans, et explorez
la branche build > generated-sources > jaxb. Examinez et ouvrez les fichiers Java générés ;
passez outre d'éventuelles alertes à l'ouverture.
Servez vous pour la suite des méthodes proposées dans la classe XMLUtils déjà utilisée. Les
fichiers nécessaires sont fournis : XMLUtil.java et URLUtil.java
Question 1.9
Ajoutez une méthode getNomCabinet():String qui renvoie le nom du cabinet.
Question 1.10
[Optionnel selon le temps] Ajoutez une méthode getListePatientsStr(id:int):String qui
renvoie la liste des noms et prénoms des patients du cabinet de l'infirmiere d'identifiant
infirmierId sous la forme d'une chaine de caractères comme suit : "Patients de
l'infimiere [id] : [nom, prénom] [nom, prénom] .... Vous pouvez soit passer par les
classes Java (facile) soit utiliser sur le document DOM les méthodes permettant de manipuler des
expressions XPATH dans la classe XMLUtil
Question 1.11
Ajoutez une méthode assez semblable, getListePatients(id:int):List<Patient> qui renvoie
la liste des patients, de type Patient de l'infirmiere d'identifiant infirmierId sous la forme d'une
List<Patient>.
Question 1.12
Ajoutez la méthode getHTML():String ci-dessous qui utilise une feuille de transformation XSLT et
renvoie sous la forme d'un String une page HTML affichant le nom du cabinet et le nombre de
patients de l'infirmiere d'identifiant infirmierId.
Pour cela, vous pouvez utiliser pour commencer la feuille de transformation XSLT de test test.xsl et
utiliser le code suivant pour la méthode getHTML.
Question 1.13
[Optionel mais pouvant être intéressant] Ajoutez une méthode getCoutPatient(id:int):double
qui calcule le cout total des visites d'un patient.
Pour cela, vous allez devoir utiliser le parsing DOM du fichier actes.xml
Il est recommandé pour cela d'utiliser une Map<key:String, value:Double>, instanciée sous la
2. PAI : Mise en place d'un Web Service pour gérer le cabinet d'infirmiers
2. PAI : Mise en place d'un Web Service pour gérer le cabinet d'infirmiers
Description de l'exercice
Pour rappel, cet exercice est composé de plusieurs parties visant à transformer notre cabinet
d'infirmiers en Web Service. Les parties A et B ont été réalisée lors de la séance précédente. La suite
de ce travail sera donc composée des parties C à E :
Il est extrêmement important que chaque partie soit parfaitement fontionnelle avant de passer à
l'étape d'après. Vérifiez donc que vous avez respecté chacun des points (questions).
Question 2.1
Dans l'onglet Projects, sélectionnez votre projet et, dans le menu contextuel, sélectionnez New ->
Web Services -> Web Service.
Question 2.2
Appelez votre service CabinetInfirmier, et entrez
fr.univ-grenoble-alpes.miage.cabinetinfirmier comme nom de package.
Le web service ici créé correspond au type SOAP, pour Service Oriented Architecture Protocol et
utilise le framework JAX-WS.
Question 2.3
Les Web Services
Vous aurez constaté que, pour l'instant, notre Web Service ne dispose que d'une seule opération
générée par défaut (hello). Evidemment nous allons, plus tard, rajouter des opérations plus
complexes. Mais dans un premier temps, nous allons voir comment créer une opération élémentaire.
Question 2.4
Dans le Design de CabinetInfirmier.java, en utilisant Add Operation, ajoutez une opération
simple que vous nommerez getStrLength renvoyant un type int et prenant comme paramètre un
String. Cette fonction de test devra renvoyer longueur de la chaine de charactères passée en
paramètre.
Question 2.5
Il faut maintenant déployer le Web Service. Pour cela, dans l'onglet Projects, choisissez Deploy
depuis le menu contextuel [clic droit].
Votre Web Service est maintenant déployé sur le serveur GlassFish. Il est prêt à être utilisé par un
client.
Par la suite, lorsque vous ferez une modification dans le code source de CabinetInfirmier.java,
ou de toute autre classe appelée par cette dernière, vous ne devrez pas utiliser la compilation (build)
pour prendre en compte vos changements, comme cela est le cas lorsqu'on fait de la programmation
Java classique dans NetBeans, mais cette fonctionnalité Deploy". A noter que toute modification du
code du service, alors que le service est encore déployé est prise en compte ; il suffit juste alors de
recharger la page web avec la touche F5 si travaillez avec la plupart des navigateurs.
Question 2.6
Pour tester ce Web Service, dans l'onglet Projects, sélectionnez Web Services ->
CabinetInfirmier et dans le menu contextuel [clic_droit], choisissez Test Web Service. Une
page html s'ouvre dans un navigateur, depuis laquelle nous voyons apparaire nos opérations. Testez
les deux opérations disponibles en leur donnant un paramètre.
Désormais, vous devrez idéalement répéter cette opération de déploiement + test pour tester les
nouvelles fonctionnalités de votre WS. A noter qu'en pratique, toute modification du code du service,
En haut de la page de test, vous voyez apparaitre un lien vers le fichier WSDL. Etudiez ce fichier et
notez son URL.
Question 2.7
A quoi sert le WSDL ?
Question 2.8
Le WSDL
Question 2.9
L'URL du WSDL est
❍ http://cabinetinfirmier.miage.ujfGrenoble.fr/
❍ http://localhost:8080/CabinetInfirmierServer/CabinetInfirmier?WSDL
❍ http://localhost:8080/CabinetInfirmierServer/CabinetInfirmier?xsd=1
❍ http://localhost:8080/CabinetInfirmierServer/CabinetInfirmier
Question 2.10
Nous devons aussi indiquer au Web Service comment utiliser le Binding de Cabinet pour les tests.
Par un clic bouton droit sur le projet, dans l'onglet Projects, selectionnez Properties, le dernier item
du menu contextuel, selectionnez ensuite "Libraries" dans la partie gauche, puis l'onglet "Compile
Tests", puis "Add Jar/Folder" et selectionnez le répertoire
build/generated/jaxbCache/Cabinet de votre projet. Ceci est illustré dans la figure ci-dessous.
Notez que ces opérations seront très semblables à celles que vous avez écrites pour tester votre
Data Binding de Cabinet. Elles ne nécessiteront que très peu d'adaptations.
Question 2.11
A partir de l'onglet Design, ajoutez une opération getNomCabinet():String. Editez ensuite le
code de cette opération de façon à ce qu'elle déclare un Cabinet et en récupère une instance à
l'aide de la méthode fromResource. Il exploite ensuite les méthodes de la classe de Cabinet liée
(Binding) pour renvoyer le nom du cabinet.
Question 2.12
Comme précédemment, déployez le service s'il ne l'est pas déjà et testez cette nouvelle opération.
Si le service est déjà déployé et que votre page HTML de test est encore ouverte, il vous suffit de la
rafraîchir (F5).
Assurez vous que votre opération de test fonctionne. Si c'est le cas, vous pouvez passer à la suite.
Question 2.13
Créez un nouveau projet de type Web Application, appelez le CabinetInfirmierClient et
munissez le d'un Web Service Client ayant pour URL celle du WSDL de votre WebService
CabinetInfirmier hébergé par l'application CabinetInfirmierServer.
Rmq : il n'est pas nécessaire de définir de proxy car vous allez travailler en local, sur votre propre
machine.
Question 2.14
Créez une nouvelle Java Main class nommée TestCabinetInfirmier.java, positionnez vous
Observez qu'elle appelle une classe CabinetInfirmier_Service. Cette classe a été générée dans
le package fr.ujfgrenoble.miage.cabinetinfirmier que vous trouverez dans l'onglet
Generated Sources. Cette classe assure l'interface de votre client avec le WebService. Elle
permet notamment d'assurer la connexion à l'URL du WebService.
Prenez le temps de regarder comment cela fonctionne en regard de vos connaissances sur les
WebServices.
Question 2.15
Dans la méthode main, ajoutez une ligne permettant d'afficher la chaine de caractère renvoyée par
la méthode getNomCabinet():String que vous venez de générer dans votre client.
Question 2.16
Compilez et lancez ce programme. Le nom de votre cabinet devrait s'afficher dans la console.
Assurez vous d'avoir déployé votre WebService récemment. Notez que le WebService a un time out
par défaut de 30 minutes, au delà desquelles il faut le re-déployer.
Ce client peut être utilisé pour toute autre opération que vous rajouteriez à votre WebService. Il
suffit pour cela de rajouterau client le code nécessaire pour exploiter ces opérations : insertion de
code et appel des opérations du Web Service.
G. Page de l'infirmière
Nous allons maintenant rajouter l'opération principale de notre cabinet d'infirmier, à savoir la page
de l'infirmière. Nous allons nous focaliser sur cette opération qui est appelée par l'application cliente
que vous avez programmée dans le module IHM. Notez que vous pourriez, si vous le souhaitiez,
complexifier votre service et votre IHM pour proposer/utiliser d'autres opérations ; le principe serait
le même.
L'opération en question prendra comme paramètre un identifiant d'infirmier, sous la forme d'un
String, et renverra une page HTML entièrement contenue dans une chaine de caractères (String
). Cette page sera obtenue suite à des traitements éventuels faits à partir de l'instance Java de
Cabinet et d'une transformation XSLT permettant de tranformer un document DOM, généré à
partir de l'instance de Cabinet, en page HTML.
Question 2.17
Dans l'onglet Design, ajoutez une opération que vous nommerez getHTML, qui prend un String en
paramètre et qui renvoie un String.
Question 2.18
Copiez et collez ce code de l'opération getHTML pour remplacer le code qui a été généré.
Question 2.19
Lisez attentivement le code de cette opération et ses commentaires pour en comprendre le
Maintenant, vous pouvez écrire une page de l'infirmière digne de ce nom. Le soin apporté à cette
partie du travail sera autant de bonus pris en compte dans la notation. Par défaut, la page
devra afficher les renseignements sur l'infirmière, et la liste de ses patients.
Voici des suggestions pour l'améliorer :
Plus compliqué [mais pas demandé cette année] : en rajoutant à votre WebService la possibilité
d'envoyer des requêtes Google (ou OpenStreetMap) et en utilisant votre algorithme de RO, vous
pourriez afficher :
Question 2.23
Améliorez la page de l'infirmière !
[Fermer]
3. TUX [à utiliser en remplacement éventuel du Binding de Profile] : Gestion du profil et des parties
(version DOM)
3. TUX [à utiliser en remplacement éventuel du Binding de Profile] : Gestion du profil et des parties
(version DOM)
Dans cet exercice, nous allons créer une classe Profil pour gérer notre profil, c'est à dire pour
modifier et sauvegarder un profil, et de gérer une liste de parties individuelles, de type Partie. Vu
qu'un Profil stocke le résultat de plusieurs parties, nous avons aussi besoin de créer une classe
Partie pour gérer les parties individuelles.
Nous n'aurons pas le temps de tout faire pendant les TPs ! Mais imaginez tout ce que l'on pourrait
faire avec les notions vues en cours. On pourrait ainsi, créer plusieurs profils, stockés sous forme de
Commençons par coder la classe Partie. Cette classe sert à manipuler des parties individuelles.
Ci-dessous, vous trouverez l'UML de cette classe.
Voici quelques explications sur la composition et le but de chaque méthode de la classe Partie:
● La classe possède 4 attributs : un mot et une date, de type String, et 3 attributs de type int, le
niveau, trouve le nombre de lettres trouvées et le temps en secondes.
● Il y a 2 constructeurs. Celui à trois paramètres permet de construire une nouvelle partie et
initialise donc tous ses attributs comme il se doit. L'autre constructeur, lui, est utilisé pour
permettre la construction et la réinitialisation d'une Partie déjà faite et issue du XML. Ce
constructeur prend comme paramètre un élément DOM correspondant à une partie ; cet élément
est obtenu par parsing du document DOM ; le constucteur utilisera cet élément pour récupérer les
bonnes valeurs et initialiser la partie.
● Les méthodes setTemps(temps:int):void, getNiveau():int et toString():String
permettent la gestion des parties.
● La méthode setTrouve(nbrLettreRestantes):int qui permet de renvoyer un pourcentage en
fonction du nombre de lettres trouvées.
● La méthode getPartie(doc:Document):Element Cette méthode crée le bloc XML représentant
une partie à partir du paramètre doc(pour créer les éléments du XML) et renvoie ce bloc en tant
que Element.
Question 3.1
Implémentez cette classe.
Maintenant, vous allez créer la classe Profil en suivant le diagramme UML donné ci-après et les
indications suivantes.
● La classe comporte 4 attributs : Les 3 attributs nom, dateNaissance et avatar sont de type
String ; l'attribut parties stocke chaque Partie individuelle dans une ArrayList<Partie>
● Elle comporte deux constructeurs : le premier initialisant un profil à partir du nom et de la date de
naissance du joueur passés en paramètres ; le second lit un fichier XML, parse le document et
utilise le document DOM pour extraire les données nécessaires à la récupération des valeurs du
profil et des parties existantes.
● La méthode ajoutePartie(p : Partie):void permet de rajouter à la liste des parties une
Partie instanciée.
● La méthode sauvegarder(filename:String):void permet de sauvegarder le document DOM
dans un fichier XML.
● La classe comporte en outre 4 autres méthodes utilitaires : fromXML(filename:String)
:Document fromXML(filename:String):void, xmlDateToProfileDate(String xmlDate)
:String et profileDateToXMLDate(String xmlDate):String.
une date est de la forme dd/mm/aaaa en String pour notre projet ! C'est le cas de la date de profil et
de la date de partie.
Question 3.2
Programmez cette classe.
Pensez à utiliser les fonctions utilitaires.
Question 3.3
Créer un attribut profil de type Profil dans la classe Jeu.
Question 3.4
Créer un nouveau constructeur dans Jeu qui a pour paramètre le chemin d'un profil XML. Ce
constructeur intialise le dictionnaire avec les méthodes développées lors de la dernière séance,
initialise l'attribut profile à l'aide du chemin vers le XML et initialise niveau au dernier niveau fait
dans le profil.
Question 3.5
Modifier le code de votre projet de manière à ce que ce constructeur soit dorénavant appelé. Par
défaut, utiliser un exemple d'instance de profil, profile.xml, contenant des parties déjà jouées.
Maintenant que nous avons un objet de type Profil dans la classe Jeu, nous allons pour récupérer
les données pour chaque partie réalisée et stockée chacune d'entre elles.
Question 3.6
Dans la boucle while, créer une nouvelle Partie pour chaque nouvelle partie jouée et l'ajouter à la
fin de la partie au Profil.
Question 3.7
A la fin du jeu, veillez à imprimer à la fois dans la console Netbeans et dans un fichier XML les
parties réalisées si l'utilisateur le désire. Idéalement, vous pouvez aussi faire une sortie HTML
directement ; les transformations XSLT sont facilitées avec la classe XMLUtil.
Si l'utilisateur le désire signifie faire une lecture clavier pour demander à l'utilisateur s'il veut sauver
ses parties et dans quel fichier.
[Fermer]
Description de l'exercice
Dans cet exercice, nous souhaitons faire en sorte que le dictionnaire soit vu comme un WebService
(SOAP) muni d'opérations pour récupérer les mots d'un niveau donné. Nour allons seulement munir
notre application d'un WebService et ajouter les opérations nécessaires. La fois précédente, vous
avez réalisé une application nommée TuxDicoServer de type Web Application.
Question 4.1
Dans l'onglet Projects, sélectionnez votre projet et, dans le menu contextuel, sélectionnez New ->
Web Services -> Web Service.
Question 4.2
Appelez votre service TuxDico, et entrez fr.miage.tux comme nom de package.
Le web service ici créé correspond au type SOAP, pour Service Oriented Architecture Protocol, et
utilise le framework JAX-WS.
Maintenant vous pouvez voir qu'un package s'est créé et contient une classe, c'est à dire un fichier
java, du nom de votre web service. Vous devriez voir également un nouvel onglet Web Services.
Cet onglet contient votre webService.
Question 4.3
Nous devons aussi indiquer au Web Service comment utiliser le Binding de Dictionnaire pour les
tests. Par un clic bouton droit sur le projet, dans l'onglet Projects, selectionnez Properties, le dernier
item du menu contextuel, selectionnez ensuite "Libraries" dans la partie gauche, puis l'onglet
"Compile Tests", puis "Add Jar/Folder" et selectionnez le répertoire
build/generated/jaxbCache/Dictionnaire de votre projet.
Notez que ces opérations seront très semblables à celles que vous avez écrites pour tester votre
Data Binding de Dictionnaire. Elles ne nécessiteront que très peu d'adaptations.
Question 4.4
A partir de l'onglet Design, ajoutez une opération getMot(level:int):String. Editez ensuite le
code de cette opération de façon à ce qu'elle déclare un Dictionnaire et en récupère une instance
à l'aide de la méthode fromResource. Cette opération doit permettre la sélection d'un mot de
niveau level au hasard dans la liste de mots. Attention à ce que le niveau soit valide.
Question 4.5
A partir de l'onglet Design, ajoutez une opération getMot(level:int, id:int):String . Editez
ensuite le code de cette opération de façon à ce qu'elle déclare un Dictionnaire et en récupère
une instance à l'aide de la méthode fromResource. Cette opération doit permettre la sélection la
sélection du idieme mot de niveau level dans la liste de mots. Attention à ce que le niveau et le
numéro du mot soient valides.
Question 4.6
Dans l'onglet Projects, choisissez Deploy depuis le menu contextuel [clic droit].
Votre Web Service est maintenant déployé sur le serveur GlassFish. Il est prêt à être utilisé par un
client.
Question 4.7
Pour tester ce Web Service, dans l'onglet Projects, sélectionnez Web Services -> TuxDico et
dans le menu contextuel [clic droit], choisissez Test Web Service. Une page html s'ouvre dans un
navigateur, depuis laquelle nous voyons apparaire nos opérations. Testez les deux opérations
disponibles en leur donnant des paramètres, bons et mauvais.
Désormais, vous devrez idéalement répéter cette opération de déploiement + test pour tester les
nouvelles fonctionnalités de votre WS. A noter qu'en pratique, toute modification du code du service,
alors que le service est encore déployé est prise en compte par Netbeans qui gère à la fois le Web
Service et le serveur glassfish ; il suffit juste alors de recharger la page web de test.
En haut de la page de test, vous voyez apparaitre un lien vers le fichier WSDL. Etudiez ce fichier et
notez son URL.
Rmq : il n'est pas nécessaire de définir de proxy car vous allez travailler en local, sur votre propre
machine.
Question 4.9
Dans le corps de la classe Dico que vous avez déjà développé, depuis le menu contextuel,
sélectionnez Insert Code > Call Web Service Operation. Déployez l'arborescence proposée
et sélectionnez l'opération getMot que vous avez programmée préalablement dans votre
WebService, puis cliquez sur Ok.
Observez qu'elle appelle une classe TuxDico_Service. Cette classe a été générée dans le package
fr.miage.tux que vous trouverez dans l'onglet Generated Sources. Cette classe assure
l'interface de votre client avec le WebService. Elle permet notamment d'assurer la connexion à l'URL
du WebService.
Prenez le temps de regarder comment cela fonctionne en regard de vos connaissances sur les
WebServices.
Question 4.10
Adaptez votre classe Dico pour qu'elle utilise maintenant ces opérations distantes fournies par le
WebService.
[Fermer]
Description de l'exercice
Dans cet exercice, on montre comment déployer manuellement un WebService sur un serveur
GlassFish.
Question 5.1
La première étape consister à créer un package java de notre application. Comme il s'agit d'un
WebService, le package se présentera sous la forme d'un fichier à l'extension .war ; c'est
l'équivalent des .jar pour les applications java classiques. Pour le générer, il suffit de compiler le
projet, donc de faire un Clean + Build de votre projet. Le fichier .war est généré dans le
répertoire dist du projet Netbeans.
Question 5.2
Nous avons besoin d'un serveur GlassFish actif. Vous devez disposer d'un serveur GlassFish installé
sur votre machine. Il est présent sous la forme de services dans netbeans. Vous pouvez aussi décider
d'en installer un en dur sur votre machine en suivant les instructions suivantes :
* sous Linux
* sous windows
Plus simplement, pour démarrer le serveur depuis Netbeans (voir), le plus simple pour nous est de
se servir de l'interface de Netbeans. Dans le menu contextuel de Services > Servers >