La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

S. BEN YAHIA Faculté des Sciences de Tunis, Tunisie Connexion Web et Bases de Données : Les SERVLETS.

Présentations similaires


Présentation au sujet: "S. BEN YAHIA Faculté des Sciences de Tunis, Tunisie Connexion Web et Bases de Données : Les SERVLETS."— Transcription de la présentation:

1 S. BEN YAHIA Faculté des Sciences de Tunis, Tunisie Connexion Web et Bases de Données : Les SERVLETS

2 S. Ben Yahia Présentation Servlet : Server-side applet Une servlet est un composant qui étend les fonctionnalités d'un serveur web de manière portable et efficace. Un serveur web héberge des classes Java servlets qui sont exécutées à l'intérieur du container web. Le serveur web associe une ou plusieurs URLs à chaque servlet. La servlet est invoquée lorsque des requêtes HTTP utilisateur sont soumises au serveur. Quand la servlet reçoit une requête du client, elle génère une réponse, éventuellement en utilisant la logique métier contenue dans des EJBs ou en interrogeant directement une base de données. Elle retourne alors une réponse HTML ou XML au demandeur.

3 S. Ben Yahia Servlet : Avantages coté serveur Fournissent un moyen d'améliorer les serveurs web sur n'importe quelle plateforme, d'autant plus que les servlets sont indépendantes du serveur web S'exécutent dans un moteur de servlet (ou conteneur de servlet) utilisé pour établir le lien entre la servlet et le serveur web. On ne se soucie pas de détails techniques tels que la connexion au réseau, la mise en forme de la réponse à la norme HTTP,...,

4 S. Ben Yahia Servlet : Avantages coté serveur Beaucoup plus performantes que les scripts, car il s'agit de pseudo-code, chargé automatiquement lors du démarrage du serveur ou bien lors de la connexion du premier client. Elles sont donc actives (résidentes en mémoire) et prêtes à traiter les demandes des clients grâce à des threads, tandis qu'avec les langages de script traditionnels un nouveau processus est créé pour chaque requête HTTP. Une charge moins importante au niveau du processeur du serveur (d'autant plus qu'un système de cache peut permettre de stocker les calculs déjà accomplis), ainsi que de prendre une place moins importante en mémoire.

5 S. Ben Yahia Servlet : Avantages coté serveur La réutilisabilité des servlets : permettre de créer des composants encapsulant des services similaires, afin de pouvoir les réutiliser dans des applications futures. Une servlet, peut utiliser toutes les API Java afin de communiquer avec des applications extérieures, se connecter à des bases de données, accéder aux entrée-sorties (fichiers par exemple),...

6 S. Ben Yahia Présentation Avantage Servlet: –inhérents à Java : JSDK ou JDK1.2 gratuit et portable –par rapport aux Applets : plus facile à développer, meilleures performances, client léger, Inconvénient Servlet : –interface graphique utilisateur limitée à HTML.

7 S. Ben Yahia LAPI Servlet (1/2) Une servlet doit implémenter linterface javax.servlet.Servlet 1.soit directement, 2.soit en dérivant dune classe implémentant cette interface comme : javax.servlet.GenericServlet javax.servlet.http.HttpServlet (particulièrement désignée pour des requêtes et réponses HTTP) cette interface possède les méthodes pour : initialiser la servlet : init() recevoir et répondre aux requêtes des clients : service() détruire la servlet et ses ressources : destroy()

8 S. Ben Yahia LAPI Servlet (2/2) Servlet GenericServlet HttpServlet MapremiereServlet interface classe abstraite classe définie par l utilisateur Spécification Généralisation javax.servlet.Servlet javax.servlet.GenericServlet javax.servlet.HttpServlet

9 S. Ben Yahia Modèle de programmation Les servlets suivent un modèle de programmation requête-service-réponse : –Requête : objet javax.servlet.ServletRequest contient les informations nécessaires pour une communication du client vers le serveur –Service : méthode service() invoquée –Réponse : objet javax.servlet.ServletResponse contient les informations nécessaires pour une communication du serveur vers le client

10 S. Ben Yahia Lorsqu'une servlet est appelée par un client, la méthode service() est exécutée. Celle- ci est le principal point d'entrée de toute servlet et accepte deux objets en paramètres: Servlet : Mise en oeuvre l'objet ServletRequest encapsulant la requête du client, (contient l'ensemble des paramètres passés à la servlet (informations sur l'environnement du client, cookies du client, URL demandée,...) l'objet ServletResponse permettant de renvoyer une réponse au client (envoyer des informations au navigateur). Il est ainsi possible de créer des en-têtes HTTP (headers), d'envoyer des cookies au navigateur du client,... void service ( ServletRequest req, ServletResponse res );

11 S. Ben Yahia Afin de développer un servlet fonctionnant avec le protocole HTTP, il suffit de créer une classe étendant HttpServlet (qui implémente elle-même l'interface Servlet). La classe HttpServlet (dérivant de GenericServlet) permet de fournir une implémentation de l'interface Servlet spécifique à HTTP. La classe HttpServlet surcharge la méthode service en lisant la méthode HTTP utilisée par le client, puis en redirigeant la requête vers une méthode appropriée. Si la méthode utilisée est GET, il suffit de redéfinir la méthode public void doGet( HttpServletRequest req, HttpServletResponse res); Si la méthode utilisée est POST, il suffit de redéfinir la méthode public void doPost ( HttpServletRequest req, HttpServletResponse res); Servlet : Développement

12 S. Ben Yahia Servlet : exemple import javax.servlet.*; import javax.servlet.http.*; public class ServletDeBase extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException { // lecture de la requête // traitements // envoi de la réponse }

13 S. Ben Yahia Servlet : Lobjet HttpServletRequest : la méthode DoXXX MéthodeDescription String getMethod() Récupère la méthode HTTP utilisée par le client String getHeader(String Key) Récupère la valeur de l'attribut Key de l'en-tête String getRemoteHost() Récupère le nom de domaine du client String getRemoteAddr() Récupère ladresse IP du client String getParameter(Strin g Key) Récupère la valeur du paramètre Key (clé) d'un formulaire. Lorsque plusieurs valeurs sont présentes, la première est retournée String getParameterValue s(String Key) Récupère les valeurs correspondant au paramètre Key (clé) d'un formulaire, c'est-à-dire dans le cas d'une sélection multiple (cases à cocher, listes à choix multiples) les valeurs de toutes les entités sélectionnées Enumeration getParameterName s() Retourne un objet Enumeration contenant la liste des noms des paramètres passés à la requête String getServerName() Récupère le nom du serveur String getServerPort() Récupère le numéro de port du serveur

14 S. Ben Yahia la réponse à fournir à l'utilisateur est représentée sous forme d'objet HttpServletResponse. Servlet : Lobjet HttpServletResponse MéthodeDescription String setStatus (int StatusCode) Définit le code de retour de la réponse void setHeader (String Nom, String Valeur) Définit une paire clé/valeur dans les entêtes void setContentType (String type) Définit le type MIME de la réponse HTTP, c'est-à-dire le type de données envoyées au navigateur void setContentLength (int len) Définit la taille de la réponse PrintWriter getWriter() Retourne un objet PrintWriter permettant d'envoyer du texte au navigateur client. Il se charge de convertir au format approprié les caractères Unicode utilisés par Java ServletOutputStream getOutputStream() Définit un flot de données à envoyer au client, par l'intermédiaire d'un objet ServletOutputStream, dérivé de la classe java.io.OutpuStream void sendredirect (String location) Permet de rediriger le client vers l'URL location

15 S. Ben Yahia Exemple de servlet Linterface dun objet ASP import javax. servlet.*; import javax. servlet. http.*; import java. io.*; public class HelloServlet extends HttpServlet { public void service( ServletRequest request, ServletResponse response ) throws ServletException, IOException { response. setContentType( "text/ html" ); PrintWriter out = response. getWriter(); imposé imposé par l'API servlet ce qui suit est en HTML récupère un flux pour générer le résultat génération du code HTML out. println( " " ); out. println( " Hello depuis une servlet " ); out. println( " " ); } Compilation : HelloServlet. class installé dans l'arborescence de Tomcat Chargement via une URL de type servlet/ HelloServlet

16 S. Ben Yahia Exemple de servlet (code complet) Linterface dun objet ASP import javax.servlet.*; import javax.servlet.http.*; import java.io.* public class PremiereServlet extends HttpServlet { public void init() { } public void doGet (HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException {res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println(" "); out.println(" Titre ");out.println(" "); out.println("Ma première servlet"); out.println(" "); out.close(); } }

17 S. Ben Yahia Exemple de servlet (code complet): Explication du code Linterface dun objet ASP La classe HttpServlet a été étendue : public class PremiereServlet extends HttpServlet {} Lorsque la servlet est instanciée, il peut être intéressant d'effectuer des opérations qui seront utiles tout au long du cycle de vie de la servlet (se connecter à une base de données, ouvrir un fichier,...). Pour ce faire, il s'agit de surcharger la méthode init() de la servlet. public void init() {}

18 S. Ben Yahia Exemple de servlet (code complet): Explication du code Linterface dun objet ASP A chaque requête, la méthode service() est invoquée. Celle-ci détermine le type de requête dont il s'agit, puis transmet la requête et la réponse à la méthode adéquate (doGet() ou doPost()), on ne s'intéresse qu'à la méthode GET la méthode doGet() a été surchargée : public void doGet(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException {}

19 S. Ben Yahia Exemple de servlet (code complet): Explication du code Linterface dun objet ASP Par contre l'objet HttpServletResponse permet de renvoyer une page à l'utilisateur: 1-définir le type de données qui vont être envoyées au client : la méthode setContentType() de l'objet HttpServletResponse 2- créer un objet PrintWriter grâce à la méthode getWriter() : envoyer du texte formatté au navigateur PrintWriter out = res.getWriter(); 3- utiliser la méthode println() de l'objet PrintWriter afin d'envoyer les données textuelles au navigateur, 4- fermer l'objet PrintWriter lorsqu'il n'est plus utile avec sa méthode close()

20 Déploiement de servlets

21 S. Ben Yahia …….. …….. ……. …..….. Web.xml Déclaration dune Servlet au sein dune application Web (1/5) La déclaration dune Servlet dans une application Web se fait dans le descripteur de déploiement «web.xml».

22 S. Ben Yahia n ……. : –encapsule lensemble des éléments servant à la configuration de lapplication Web. n ……… : –encapsule lensemble des éléments servant à la configuration de chaque Servlet. n ………… : –contient une chaîne de caractère identifiant la Servlet au sein de lapplication web. Déclaration dune Servlet au sein dune application Web (2/5)

23 S. Ben Yahia n ………… : –contient le nom complet de la classe de Servlet (package compris). n …. : –Encapsule les paramètres dinitialisation de la Servlet. –Chaque élément ….. correspond à un paramètre représenté par une paire nom/valeur avec les éléments : ….., …... Déclaration dune Servlet au sein dune application Web (3/5)

24 S. Ben Yahia n ………… : –contient des informations permettant de définir la relation entre les URL et les servlets. n ……. –définit comment une Servlet est invoquée. Déclaration dune Servlet au sein dune application Web (4/5)

25 S. Ben Yahia Hello Hello /servlet/Hello web.xml Déclaration dune Servlet au sein dune application Web (5/5) Déclaration de la Servlet « Hello » dans le descripteur de déploiement «web.xml»

26 S. Ben Yahia n Invoquer une Servlet cest utiliser tout dabord un conteneur Web (e.g., : Apache TOMCAT 5.0) pour sa mise en œuvre. n Déployer la Servlet au sein dune application Web. –Crée un nouveau dossier nommée MaWebApp dans le dossier webapps de TOMCAT. –Le dossier MaWebApp doit contenir un sous dossier nommé Web-INF, qui lui-même contient le descripteur de déploiement web.xml un sous-dossier nommé classes, qui contient le fichier compilé Hello.class de la Servlet. n Deux possibilités dinvocation dune Servlet : –invocation de la méthode doGet(…), –invocation de la méthode doPost(..). Invocation dune Servlet à partir dun navigateur Web (1/7)

27 S. Ben Yahia n 1ère Invocation de la méthode doGet(…) : –Saisie de lURL de la Servlet dans la barre dadresse du navigateur. –http:// : / /servlet/ –http://localhost:8080/MaWebApp/servlet/Hello Invocation dune Servlet à partir dun navigateur Web (2/7) Hello Hello

28 S. Ben Yahia n 2ième Invocation de la méthode doGet(…): –Clique sur un lien hypertexte qui pointe sur lURL de la Servlet. Invocation dune Servlet à partir dun navigateur Web (3/7) Cliquer pour tester la Servlet Hello Hello Test de la servlet Heloo par clic sur lien Cliquer pour tester la Servlet Hello Index.html

29 S. Ben Yahia n Invocation de la méthode doPost(…) : –La méthode doPost() dune Servlet est invoquée principalement lors de lenvoi des données saisies dans un formulaire HTML (par un clic sur un bouton de type submit). –Exemple de méthode doPost() qui retourne une chaîne de caractères concaténée avec les valeurs des paramètres transmis par le client. Invocation dune Servlet à partir dun navigateur Web (4/7)

30 S. Ben Yahia n Invocation de la méthode doPost(…) : Invocation dune Servlet à partir dun navigateur Web (5/7) Test de la servlet Hello Prenom : Nom : Index.html

31 S. Ben Yahia n Invocation de la méthode doPost(…) : Invocation dune Servlet à partir dun navigateur Web (6/7) import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Hello extends HttpServlet{ public void doPost (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String prenom = req.getParameter ("prenom"); String nom = req.getParameter("nom"); res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println(" "); out.println(" Bonjour" +prenom+" "+ nom+"."+ " " ); out.println(" "); } Hello.java

32 Cycle de vie dune servlet

33 S. Ben Yahia Structure de base dune servlet import javax.servlet.*; public class first implements Servlet { public void init(ServletConf config) throws ServletException {…} public void service(ServletRequest req, ServletResponse rep) throws ServletException, IOException {…} public void destroy() {…} }

34 S. Ben Yahia Le cycle de vie dune servlet

35 S. Ben Yahia Le cycle de vie dune servlet Une servlet a le cycle de vie suivant : 1. la servlet est créée puis initialisée ( init () ) cette méthode nest appelée par le serveur quune seule fois lors du chargement 2. traitements des requêtes ( service () ) cette méthode est appelée automatiquement par le serveur à chaque requête du client 3. la servlet est détruite ( destroy () ) cette méthode nest appelée par le serveur quune seule fois à la fin, elle permet de libérer des ressources

36 S. Ben Yahia Les servlets de type : HttpServlet Pour faciliter le traitement particulier des serveurs Web, la classe Servlet est affinée en javax.servlet.http.HttpServlet –2 méthodes remplacent avantageusement la méthode service() de la classe mère : doGet() : pour traiter des requêtes Http de type GET doPost() : pour traiter des requêtes Http de type POST –la servlet doit obligatoirement contenir lune ou lautre de ces 2 méthodes –service() de HttpServlet appelle automatiquement la bonne méthode en fonction du type de la requête

37 S. Ben Yahia Cycle de vie dune Servlet HTTP Classe de Servlet Initialisation invocation de la méthode init() En service invocation de la méthode service() Requêtes clients Arrêt du serveur Destruction invocation de la méthode destory() puis finalize() Classe de Servlet Initialisation invocation de la méthode init() En service invocation de la méthode service() Destruction invocation de la méthode destory() puis finalize() Destruction invocation de la méthode destory() puis finalize() La classe Java de la Servlet est déployée au sein de conteneur Web Le conteneur Web crée une instance de la classe de Servlet et la charge en mémoire. Instanciation et chargement Le conteneur Web initialise la Servlet en utilisant éventuellement le fichier web.xml. Linitialisation se fait une seul fois. Le conteneur Web exécute linstance de la Servlet dans un contexte multitâche. Chaque thread invoque la méthode service() qui soccupe dexécuter la méthode doGet() ou doPost(). Linstance de la Servlet reste en mémoire jusquà larrêt du serveur. La méthode destory() est ainsi invoquée indiquant que la Servlet nest plus en service et linstance de la Servlet est supprimée par le garbage collector.

38 S. Ben Yahia Ecrire une servlet Http (1) La servlet doit dériver de la classe javax.servlet.http.HttpServlet Il faut redéfinir les méthodes : –init(), destroy() et getServletInfo() –doPost() ou doGet() ( ou doPut() ou doDelete() doHead() ou doOptions() ou doTrace() ) suivant le type de requêtes Http du client que la servlet doit traiter : POST, GET, PUT ou DELETE

39 S. Ben Yahia Ecrire une servlet Http (2) Utiliser les objets HttpServletRequest et HttpServletResponse passés en paramètres des méthodes doGet() ou doPost() pour implémenter le service –HttpServletRequest contient les renseignements sur le formulaire HTML initial (utile pour doPost() ) –HttpServletResponse contient le flux de sortie pour la génération de la page HTML résultat ce flux de sortie est obtenu par les méthodes : –getWriter() : recommandé pour retourner du texte –getOutputStream() : recommandé pour des données binaires

40 S. Ben Yahia Squelette dune servlet Http (GET) import javax.servlet.*; import javax.servlet.http.*; public class SimpleServlet extends HttpServlet { public void init (HttpServletConfig c) throws ServletException {…} public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {…} public void destroy() {…} public String getServletInfo() {…} }

41 S. Ben Yahia Exemple simple (GET) public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { // 1. spécifier le contenu de la réponse res.setContentType("text/html"); // 2. récupérer le conteneur de la réponse PrintWriter out = res.getWriter(); // 3. remplir le conteneur par la réponse out.println(" SimpleServlet"); out.println(" "); out.println(" Une servlet simple "); out.println(" Cest la sortie de la servlet "); out.println(" "); // finalement, envoyer le contenu au client out.close();

42 S. Ben Yahia Quelques trucs: mettre les servlets en paquet Pour éviter les conflits de noms placer les fichiers.class dans un répertoire (exemple MesServlets) qui a le même nom que celui du package. Insérer linstruction dappartenance au paquet au début du fichier.java de la servlet –package MesServlets ; Inclure le nom du paquet dans l URL –http://localhost/servlet/MesServlets.HelloWWW2

43 S. Ben Yahia Quelques trucs Néanmoins : et toujours pareils Faire une classe utilitaire ! public class ServletUtilities { public static final String DOCTYPE = ""; public static String headWithTitle(String title) { return(DOCTYPE + "\n" + " \n" + " " + title + " \n"); }... }

44 S. Ben Yahia HelloWWW avec ServletUtilities import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWWW3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(ServletUtilities.headWithTitle("Hello") + " \n" + " Hello WWW \n" + " "); }

45 S. Ben Yahia Les données des formulaires Récupérées par la méthode getParameter() de la classe HttpServletRequest Le nom du paramètre est passé comme argument Les données envoyées pas la méthode GET sont traitées de la même manière que celles envoyées par POST La valeur retournée est de type String, il correspond à la première occurrence du paramètre (un paramètre peut avoir plusieurs valeurs) Si le paramètre n a pas une valeur la chaîne vide est retournée Si le champ ne fait pas partie du formulaire, alors null est retourné par cette méthode.

46 S. Ben Yahia Les données des formulaires Si le paramètre a plusieurs valeurs il faut utiliser la méthode getParameterValues() au lieu de getParameter () Cette méthode retourne un tableau de type String

47 S. Ben Yahia Pour la vérification du code, il est utile de récupérer la liste des noms des paramètres avec la méthode getParameterNames() qui retourne une valeur de type Enumeration Chaque nom peut être transformé en String et utilisé par la suite dans getParameter(). Les données des formulaires

48 S. Ben Yahia Récupération des données d'un formulaire (Recap…) public String getParameter(String Key) : permet de retourner le valeur d'un champ dont on a passé le nom (sensibles à la casse) en argument ( Si le champ n'existe pas, la valeur null est retournée). public String[] getParameterValues(String Key) : à utiliser Lorsqu'un champ d'un formulaire peut avoir plusieurs valeurs (liste à choix multiples, cases à cocher,.. Retourne un tableau contenant l'ensemble des valeurs affectées à la clé spécifiée en paramètre. Enumeration getParameterNames() :Pour connaître l'ensemble des noms des champs du formulaire passé à la servlet. Retourne un objet Enumeration, contenant la liste des champs du formulaire. Il est possible de transformer chaque entrée en chaîne, puis de la traiter avec la méthode getParameter() afin de récupérer sa valeur.

49 S. Ben Yahia Récupération des données d'un formulaire : Exemple Linterface dun objet ASP Nom : Prénom : Age : Le Formulaire

50 S. Ben Yahia Récupération des données d'un formulaire : Exemple Linterface dun objet ASP La Servelet de Traitement import java.io.*;import javax.servlet.*;import javax.servlet.http.*; public class UserInfo extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(" \n \n" + " Recapitulatif des informations \n" + " \n" + " Nom: " + request.getParameter("Nom") + "\n" + " Prenom: " + request.getParameter("Prenom") + "\n" + " Age: " + request.getParameter("Age") + "\n" + " \n" + " "); }}

51 S. Ben Yahia Lister l'ensemble des paramètres d'un formulaire (1/2) Linterface dun objet ASP import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Parametres extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(" \n" + " Tableau des paramètres \n" + " \n" + " Nom Valeur(s) "); Enumeration NomsParam = request.getParameterNames(); while(NomsParam.hasMoreElements()) { String NomParam = (String)NomsParam.nextElement(); out.println(" " + NomParam + " \n");

52 S. Ben Yahia Lister l'ensemble des paramètres d'un formulaire (2/2) Linterface dun objet ASP String[] ValeursParam = request.getParameterValues(NomParam); if (paramValues.length == 1) { String ValeurParam = ValeursParam[0]; if (ValeurParam.length() == 0) out.println(" Aucune valeur "); else out.println(ValeurParam); } else { out.println(" "); for(int i=0; i < ValeursParam.length; i++) {out.println(" " + ValeursParam[i] + " ");} out.println(" "); } } out.println(" \n "); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}

53 S. Ben Yahia Traitement des entêtes de requêtes Exemple dune requête HTTP 1.1 GET /search?keywords=servlets+jsp HTTP/1.1 Accept: image/gif, image/jpg, */* Accept-Encoding: gzip Connection: Keep-Alive Cookie: userID=id Host: Referer: User-Agent: Mozilla/4.7 [en] (Win98; U)

54 S. Ben Yahia Lecture des entêtes de requêtes Général –getHeader() (getHeaders() (version 2.2)) –getHeader("Accept-Encoding" ) getHeader("Referer" ) –getHeaderNames() Spécialisé –getCookies() –getRemoteAddr() et getRemoteHost() –getContentLength() –getContentType() information liée –getMethod(), getRequestURI(), getProtocol()

55 S. Ben Yahia Afficher toutes les entêtes out.println(" \n" + " " + title + " \n" + " Request Method: " + request.getMethod() + " \n" + " Request URI: " + request.getRequestURI() + " \n" + " Request Protocol: " + request.getProtocol() + " \n" + " Adresse IP Client: " + request.getRemoteAddr() + " \n" + " Nom Client: " + request.getRemoteHost() + " \n" +

56 S. Ben Yahia Afficher toutes les entêtes (suite) " \n" + " Header Name Header Value"); Enumeration headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()) { String headerName = (String)headerNames.nextElement(); out.println(" " + headerName); out.println(" " + request.getHeader(headerName)); } out.println(" \n "); }

57 S. Ben Yahia Résultat affiche par Internet Explorer

58 Suivi de Sessions

59 S. Ben Yahia Problématique Protocole HTTP = protocole déconnecté –Différent de Telnet et ftp –Traite les requêtes et les réponses comme transactions simples isolées Certaines applications WEB (E- Commerce) ont besoin de maintenir une mémoire entre deux requêtes: –Exemple : le chariot (panier) de supermarché mis en place pour effectuer des achats sur le WEB –Pour ce faire : concept de « suivi de sessions »

60 S. Ben Yahia Servlet Session? Très simple avec lAPI des servlets : Objet HttpSession Principe : –Un objet session peut être associé à chaque requête –Il sert comme « conteneur » pour des informations persistantes –Durée de vie limitée = celle de la session

61 S. Ben Yahia Traitement des objets HttpSession Tout dabord il faut tester sil ya un objet session dans la requête: –Si la méthode getSession () retourne null, alors il ny a pas de session et il faut créer une nouvelle. Avec linstruction suivante on retourne la session courante sil y en a une, sinon on crée une nouvelle HttpSession session = request.getSession(true); On peut toujours tester par la méthode isNew () si une session est nouvelle

62 S. Ben Yahia Linformation contenue dans un objet HttpSession est de la forme (attribut : String, valeur : Object)(attribut,valeur)(attribut, valeur)… La méthode getAttribute(String) –permet dextraire la valeur correspondante à un attribut donné dans lobjet session. –Elle retourne un Objet de type Object il est nécessaire de faire le casting pour manipuler la valeur retournée. Exemple : Panier p=(Panier)session.getAttribute("Schopping"); Cette méthode retourne null si lattribut nexiste pas. Traitement des objets HttpSession

63 S. Ben Yahia La méthode setAttribute(String,Object) –Permet dinsérer une paire (attribut, valeur) dans un objet de type HttpSession –Si lattribut existe déjà dans lobjet session sa valeur sera mise à jour. –Exemple : Panier p = new Panier(); session.settAttribute("Schopping", p); Traitement des objets HttpSession

64 S. Ben Yahia La méthode removeAttribute(String) –Permet de supprimer un pair (attribut, valeur) dans un objet de type HttpSession –Exemple : session.removeValue("Schopping"); Traitement des objets HttpSession

65 S. Ben Yahia Les méthodes : String[] getValueNames() Enumeration getAttributeNames() permettent de retourner les noms de tous les attributs dans un objet session. La méthode : String getId() retourne lidentificateur unique généré pour chaque session La méthode : void invalidate() permet dannuler une session et détacher tous les objets associés Traitement des objets HttpSession

66 Configuration des servlets

67 S. Ben Yahia n Les informations de configuration dune Servlet au sein dune application Web (nom de la Servlet, les paramètres sous formes de nom/valeur) sont représentées par un objet de type javax.servlet.ServletConfig. n Lobjet javax.servlet.ServletConfig est crée par le conteneur web pour chaque élément déclaré dans le descripteur de déploiement web.xml de lapplication web. n Les informations de configurations représentées par lobjet javax.servlet.ServletConfig peuvent ensuite être récupérées par la Servlet de préférence lors de sa phase dinitialisation au sein de la redéfinition de la méthode init(…). Configuration de Servlet : Interface ServletConfig

68 S. Ben Yahia n Méthodes de linterface javax.servlet.ServletConfig dédiées à la récupération des paramètres dune Servlet: –public String getServletName() : Récupérer le nom de la Servlet déclaré au sein du descripteur de déploiement ou le nom de la classe de la Servlet. –public String getInitParameter(String nom) : Récupérer une chaîne de caractères contenant la valeur dun paramètre nommé nom ou la valeur null si le paramètre nexiste pas. Méthodes de linterface ServletConfig (1/2)

69 S. Ben Yahia Méthodes de linterface ServletConfig (2/2) –public java.util.Enumeration getInitParameterNames(): Récupérer sous la forme dun objet de type java.util.Enumeration lensemble des noms des paramètres déclarés pour la Servlet. –public ServletContext getServletContext(): Récupérer une référence sur le contexte dexécution de la Servlet qui permet dinteragir avec le conteneur web de lapplication Web.

70 S. Ben Yahia n Syntaxe de la méthode init() : –public void init(ServletConfig config ) throws ServletExeption; –public void init() throws ServletExeption; Initialisation dune Servlet : redéfinition de la méthode init() (1/3) InitServlet param1 value1 param2 value2 InitServlet /servlet/InitServlet web.xml

71 S. Ben Yahia 71 n Exemple de manipulation : Initialisation dune Servlet : redéfinition de la méthode init() (2/3) import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; public class InitServlet extends HttpServlet{ Vector vector=new Vector(); public void init(ServletConfig config) throws ServletException{ super.init(config); Enumeration lstParams = config.getInitParameterNames( ); vector.add(" Nom de la Servlet : " + config.getServletName()); while (lstParams.hasMoreElements() ) { String nomParam = (String) lstParams.nextElement(); vector.add("{nom" + nomParam+ ", valeur=" +config.getInitParameter(nomParam)+ "} "); } public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { PrintWriter out = res.getWriter(); out.write(vector.toString()); } InitServlet.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; public class InitServlet extends HttpServlet{ Vector vector=new Vector(); public void init() throws ServletException{ ServletConfig config =getServletConfig(); Enumeration lstParams = config.getInitParameterNames( ); vector.add(" Nom de la Servlet : " + config.getServletName()); while (lstParams.hasMoreElements() ) { String nomParam = (String) lstParams.nextElement(); vector.add("{nom=" + nomParam+ ", valeur=" +config.getInitParameter(nomParam)+ "} "); } public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { PrintWriter out = res.getWriter(); out.write(vector.toString()); } InitServlet.java

72 S. Ben Yahia [Nom de la Servlet :InitServlet, {nom=param2, valeur=value2}, {nom=param1, valeur=value1} ] InitServlet n Exemple de manipulation (suite): Initialisation dune Servlet : redéfinition de la méthode init() (3/3)

73 S. Ben Yahia n De la même manière que pour chaque Servlet dune application Web, il est possible de déclarer des paramètres globaux (informations de configuration) pour toute lapplication Web. n Ces paramètres peuvent être utiles pour déclarer des informations susceptibles dêtre utilisées par plusieurs Servlets de lapplication Web: –Nom et de ladministrateur, qui peuvent être utilisés pour générer une page derreur à un client. –Nom dhôte ou adresse IP de machines distantes, qui peuvent être utiles pour laccès à des ressources distantes –Nom de la base de données, nom du pilote JDBC à utiliser, nom dutilisateur et mot de passe pour établir la connexion, –Etc, Paramètres de lapplication Web (1/9)

74 S. Ben Yahia n Les informations de configuration dune application Web sont représentées par un objet de type javax.servlet.ServletContext. –Chaque Servlet dune même application Web a donc accès à ces informations. n Lobjet javax.servlet.ServletContext propose des méthodes permettant de travailler principalement avec deux catégories de données : –Accéder à des paramètres globaux de lapplication Web déclarés dans son descripteur de déploiement web.xml. –Créer, lire et supprimer des attributs de façon logicielle, permettant le partage de ressources entre les Servlets dune même application Web. Paramètres de lapplication Web (2/9)

75 S. Ben Yahia n Configuration des paramètres globaux dans le descripteur de déploiement : web.xml 2. Servlets Java Paramètres de lapplication Web (3/9) …… …….. InitServlet …………… InitServlet /servlet/InitServlet web.xml

76 S. Ben Yahia n Méthodes de linterface javax.servlet.ServletContext dédiées à la récupération des paramètres globaux dinitialisation: –public String getInitParameter(String nom) : Récupérer une chaîne de caractères contenant la valeur dun paramètre nommé nom ou la valeur null si le paramètre nexiste pas. –public java.util.Enumeration getInitParameterNames(): Récupérer sous la forme dun objet de type java.util.Enumeration lensemble des noms des paramètres déclarés pour la Servlet. Paramètres de lapplication Web (4/9)

77 S. Ben Yahia n Exemple de manipulation : Paramètres de lapplication Web (5/9) nomAdmin Administrateur Admin ………………… ErreurServlet ErreurServlet /servlet/ErreurServlet web.xml

78 S. Ben Yahia n Exemple de manipulation : Paramètres de lapplication Web (6/9) import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ErreurServlet extends HttpServlet{ public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { ServletContext application=getServletContext(); String nom= application.getInitParameter ("nomAdmin"); String = application.getInitParameter (" Admin"); res.setContentType(" text/html"); PrintWriter out = res.getWriter(); out.println(" "); out.println(" Erreur de lapplication " ); out.println(" Veuillez contacter " + nom + " " ); out.println(" "+ +" " ); out.println(" "); } ErreurServlet.java

79 S. Ben Yahia n Méthodes de linterface javax.servlet.ServletContext dédiées à la gestion logicielle des attributs du contexte dapplication: –public String setAttribute(String nom, Object objet) : Créer un attribut dans le contexte de lapplication Web. Si le nom de lattribut existe déjà, la valeur existante est remplacée par la nouvelle. –public Object getAttribute(String nom) : Récupérer la valeur dun attribut dont le nom est passé en paramètre, ou la valeur null si lattribut nexiste pas. –public java.util.Enumeration getAttributeNames(): Récupérer sous la forme dun objet de type java.util.Enumeration le nom de tous les attributs stockées dans lapplication Web. –public void removeAttribute(String nom): Supprimer un attribut du contexte de lapplication Web, dont le nom est passé en paramètre. Paramètres de lapplication Web (8/9)

80 S. Ben Yahia n Exemple de manipulation : Paramètres de lapplication Web (9/9) …….. Employé emp1 = new Employé (" Walid ", "MAHDI "); Employé emp2 = new Employé ("toto ", "titi "); Employé emp3 = new Employé (" tata ", "tatou "); ……… javax.servlet.ServletContext contextApp = getServletContext(); contextApp.setAttribute(" Employé1 ", emp1); contextApp.setAttribute(" Employé2 ", emp2); contextApp.setAttribute(" Employé3 ", emp3); …… … javax.servlet.ServletContext contextApp = getServletContext(); Java.util.Enumeration nomAttributs = contextApp.getAttributeNames( ); while ( nomAttributs.hasMoreElements() ) { String nom = (String) nomAttributs.nextElement(); Employé e = (Employé) contextApp.getAttribute(nom); ………. contextApp.removeAttribute(nom); ……

81 S. Ben Yahia n Méthodes de Récupération dinformations sur lURL de la requête –public String getScheme( ) : Retourne le nom du protocole utilisé par le client pour émettre sa requête. Par exemple : http, ftp, etc. –public String getContextPath( ) : Retourne sous la forme dune chaîne de caractères commençant par un /, la portion de lURL de la requête correspondant au nom du contexte de lapplication Web. Par exemple : /MaWebApp. –public String getMethod(): Retourne le nom de la méthode HTTP(GET, POST, etc) utilisée par le client pour émettre sa requête. Interfaces ServletRequest et HttpServletRequest (1/7)

82 S. Ben Yahia n Méthodes de récupération dinformations sur lURL de la requête (suite) –public String getRequestURL( ) : Retourne lURL que le client a utilisée pour émettre sa requête. LURL retournée contient le nom du protocole, le nom du serveur, le numéro de port et le chemin dinvocation de la ressource web, mais pas les paramètres de la chaîne de requête. Par exemple : –public String getServletPath( ) : Retourne la partie de lURL qui invoque la Servlet/JSP, composée du chemin et du nom ou de lalias de la Servlet/JSP. Par exemple : /servlet/Hello. Interfaces ServletRequest et HttpServletRequest (2/7)

83 S. Ben Yahia n Méthodes de récupération dinformations sur le client –public String getRemoteAddr( ) : Retourne ladresse IP du client qui a émis la requête. Par exemple : –public String getRemoteHost( ) : Retourne le nom complet du client qui a émis la requête. Par exemple : –public String getRemoteUser( ) : Retourne le nom de lutilisateur qui a envoyé la requête si celui sest authentifié au préalable, sinon retourne la valeur null. 2. Servlets Java Interfaces ServletRequest et HttpServletRequest (3/7)

84 S. Ben Yahia n Méthodes de récupération dinformations sur le serveur –public String getServerName( ) : Retourne le nom dhôte du serveur qui a reçu la requête. Par exemple : loclahost –public String getServerPort( ) : Retourne le numéro de port découte du serveur qui a reçu la requête. Par exemple : 8080 Interfaces ServletRequest et HttpServletRequest (4/7)

85 S. Ben Yahia n Méthodes de récupération dinformations dans len-tête HTTP –public String getHeader(String nom ) : Retourne la valeur de lentête nommé, passé en paramètre ou la valeur null si lentête nexiste pas. Le nom de lentête est sensible à la casse. Par exemple : getHeader("Accept-Language") retourne fr. –public java.util.Enumeration getHeaders(String nom ) : Retourne sous la forme dun objet de type java.util.Enumeration lensemble des valeurs de len-tête de la requête spécifié en paramètre. –public java.util.Enumeration getHeaderNames() : Retourne sous la forme dun objet de type java.util.Enumeration lensemble des noms des en-têtes contenus dans la requête. Interfaces ServletRequest et HttpServletRequest (5/7)

86 S. Ben Yahia import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; public class AfficheHeaders extends HttpServlet{ public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { PrintWriter out = res.getWriter(); res.setContentType("Text/plain"); Enumeration enum = req.getHeaderNames( ); while (enum.hasMoreElements() ) { String headerNom = (String) enum.nextElement(); out.println(headerNom+" = "+ req.getHeader(headerNom)); } } AfficheHeaders.java Interfaces ServletRequest et HttpServletRequest (6/7) n Exemple de manipulation :

87 S. Ben Yahia 87 accept = image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shoc accept-language = fr accept-encoding = gzip, deflate user-agent = Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; ESB{27A4ABBB-B657 host = localhost:8080 connection = Keep-Alive AfficheHeaders n Exemple de manipulation (suite): Interfaces ServletRequest et HttpServletRequest (7/7)

88 S. Ben Yahia n Méthodes de déclaration du type du contenu et de la taille de la réponse –public void setContentType(String type ) : Spécifier le type MIMIE de contenu du corps de la réponse HTTP. Par exemple text/html pour du HTML, text/plain pour du texte brut, application/pdf pour un document Adobe pdf … –public void setContentLength(int taille) : Spécifier la taille du contenu de la réponse HTTP. Autrement dit définir len-tête HTTP Content-Length. Interfaces ServletResponse et HttpServletResponse (1/7)

89 S. Ben Yahia n Méthodes de renseignement des informations dans len-tête HTTP –public void setHeader(String nom, String Valeur) : Initialiser un en-tête dans la réponse HTTP, avec le nom et la valeur spécifiés en paramètres. Si len-tête existe déjà, la nouvelle valeur remplace lancienne –public void addHeader(String nom, String Valeur) : Ajouter un en-tête dans la réponse HTTP, avec le nom et la valeur spécifiés en paramètres. Cette méthode permet à un en-tête davoir plusieurs valeurs. – public boolean containsHeader(String nom) : Retourne un booléen indiquant si un entête existe ou non. Interfaces ServletResponse et HttpServletResponse (2/7)

90 S. Ben Yahia n Méthodes denvoi derreurs et détats HTTP –public void sendError(int sc) throws java.io.IOException –public void sendError(int sc,String message) throws java.io.IOException Envoyer un code derreur HTTP au client. Par exemple SC-NOT-FOUND(404) ou SC_BAD_REQUEST (400) ou SC-SERVICE-UNAVAILABLE(503).SC_BAD_REQUEST –public void sendStatus(int sc) : Appliquer un code détat à la réponse HTTP quand il ny a pas derreur, comme par exemple SC-OK(200) ou SC-CONTINUE(100). Interfaces ServletResponse et HttpServletResponse (3/7)

91 S. Ben Yahia n Méthodes de redirection dURL –public void sendRedirect(String url) throws java.io.IOException Envoyer au navigateur du client un ordre de redirection sur une autre ressources Web, qui peut être de la même application Web ou nom. LURL de la ressources Web passée en paramètre peut être relative ou absolue. Exemple dURL relative : –res.sendRedirect("/MaWebApp/indentification.html" ) Exemple dURL absolue : –res.sendRedirect("http://www.tunisie.com" ); Interfaces ServletResponse et HttpServletResponse (4/7)

92 S. Ben Yahia n Méthodes pull client –Le pull client est similaire à la redirection, avec une différence principale : le navigateur affiche le contenu de la première page et attend un certain temps avant de retrouver et afficher le contenu de la page suivante. –Utilités : Le contenu de la première page peut expliquer au client que la page demandée a été déplacée avant que la page suivante ne soit automatiquement chargée. Les pages peuvent être retrouvées en séquence, rendant ainsi possible une animation de mouvements. Interfaces ServletResponse et HttpServletResponse (5/7)

93 S. Ben Yahia n Méthodes pull client (suite) –Linformation de pull client est envoyée au client via len- tête HTTP Refresh. –La valeur de cet en-tête indique le nombre de secondes pendant lesquelles la page doit être affichée avant daller chercher la prochaine et elle peut aussi inclure lURL indiquant où aller la chercher. –res.SetHeader("Refresh", "3" ); Indique au client de recharger la même Servlet après avoir affiché son contenu courant pendant trois secondes –res.SetHeader ("Refresh", "3;URL=http://www.tunsie.com "); Indique au client dafficher la page daccueil Tunisie après trois secondes. Interfaces ServletResponse et HttpServletResponse (6/7)

94 S. Ben Yahia n Exemple de manipulation : Mise à jour de lheure courante Interfaces ServletResponse et HttpServletResponse (7/7) import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; public class ClientPull extends HttpServlet{ public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("Text/plain"); PrintWriter out = res.getWriter(); res.setHeader ("Refresh", "60"); out.println(new Date().toString()); } ClientPull.java

95 S. Ben Yahia n Par défaut une Servlet fonctionne dans un environnement multitâche. –Cest-à-dire quà chaque requête reçue pour une Servlet, le conteneur Web crée un thread qui va exécuter la méthode de service dune instance de la Servlet. –Si la méthode de service travaille avec des variables dinstance de la Servlet; chaque thread peut modifier la valeur de ces variables indépendamment de la logique de traitement des autres threads. n Obligation de garantir dans un certain cas un fonctionnement isolé de chaque thread. Synchronisation des traitements : LInterface SingleThreadModel (1/6)

96 S. Ben Yahia n Exemple dapplication posant un problème : –Deux client désirent senregistrer sur votre site par lintermédiaire dun formulaire HTML. Ils envoient leurs données en même temps à destination dune Servlet dont le rôle est de créer un enregistrement dans la tables clients dune base de données. –La Servlet doit donc procéder en deux étapes : Récupérer la plus grande valeur de clé primaire actuellement présente dans la Table. Créer un nouvel enregistrement dans la table avec les données du client, en donnant à la clé primaire la valeur maximale récupérée précédemment, plus un. Synchronisation des traitements : LInterface SingleThreadModel (2/6)

97 S. Ben Yahia Synchronisation des traitements : L Interface SingleThreadModel (3/6) –Que se passe-t-il si deux instances de la Servlet effectuent la première étape du traitement en même temps ? Une seule des deux instances pourra exécuter la deuxième étape. Lautre instance obtient une erreur de la base de données, car elle tente de créer un doublon de clé primaire. Un seul des deux clients est donc enregistré sur votre site.

98 S. Ben Yahia n Solution du problème : –Avec limplémentation de linterface javax.servlet.SingleThreadModel, un conteneur Web prend en charge le fait quune instance de Servlet ne peut être exécutée par un seul thread à la fois. –Lutilisation de linterface javax.servlet.SingleThreadModel implique que le conteneur Web invoque la méthode de service dans un bloc synchronisé. –Bien souvent, seules quelques instructions sont réellement critiques. Au lieu de synchroniser toute la méthode service, il est possible daméliorer les performances en synchronisant uniquement les quelques instructions sensibles en utilisant tout simplement un ou plusieurs blocs synchronisés. Synchronisation des traitements : LInterface SingleThreadModel (4/6) import javax.servlet.*; ……………. public class MaServlet extends HttpServlet implements SingleThreadModel {…………}

99 S. Ben Yahia n Exemple de syntaxe dun bloc synchronisé dans une Servlet ……… Object obj = new Object(); public void doXXXX(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { ……… Synchronized(obj) { …………. } } Synchronisation des traitements : LInterface SingleThreadModel (6/6)

100 S. Ben Yahia n Agrégation de résultats fournis par des Servlets : –meilleure modularité, –meilleure réutilisation. 2. Servlets Java Collaboration entre Servlets : LInterface RequestDispatcher (1/2) Servlet servlet1 servlet2 servlet3 servlet5 servlet4

101 S. Ben Yahia n Obtention dun RequestDispatcher : –dans la méthode de traitement de requête de Servlet –Redirection dune requête dans méthode de traitement de requête, demande à une autre Servlet de répondre au client Collaboration entre Servlets : LInterface RequestDispatcher (2/2) …………….. RequestDispatcher rd; rd = getServeletContext().getRequestDispatcher("/servlet/MaServlet"); if(rd==null) res.sendError(404); …………. rd.forward(req, res);

102 Un petit atelier

103 S. Ben Yahia Réaliser la servelet qui interagit avec un flux dobjets pour inscrire ou désinscrire une liste démails

104 S. Ben Yahia import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ListManagerServlet extends HttpServlet { private Vector addresses; private String filename; public void init(ServletConfig config) throws ServletException { super.init(config); filename = config.getInitParameter("addressfile"); if(filename == null) throw new UnavailableException(this, "la propriété \"addressfile\" "+ doit etre égale a un nom de fichier");

105 S. Ben Yahia try { ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename)); addresses = (Vector)in.readObject(); in.close(); } catch(FileNotFoundException e) { addresses = new Vector(); } catch(Exception e) { throw new UnavailableException(this, "Erreur de lecture fichier daddresses : "+e); }

106 S. Ben Yahia protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.print(" List Manager "); out.print(" Membres: "); for(int i=0; i

107 S. Ben Yahia protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String = req.getParameter(" "); String msg; if( == null) { res.sendError(res.SC_BAD_REQUEST, « aucune addresse specifiée."); return; } if(req.getParameter("action").equals("subscribe")) { if(subscribe( )) msg = "Addresse " + + inscrite."; else { res.sendError(res.SC_BAD_REQUEST, "Addresse " + + " déja inscrite."); return; } }

108 S. Ben Yahia else { if(unsubscribe( )) msg = "Addresse " + + " supprimée."; else { res.sendError(res.SC_BAD_REQUEST, "Addresse " + + " non inscrite."); return; }

109 S. Ben Yahia res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.print(" List Manager "); out.print(msg); out.print(" Afficher la liste "); out.close(); }

110 S. Ben Yahia private synchronized boolean subscribe(String ) throws IOException { if(addresses.contains( )) return false; addresses.addElement( ); save(); return true; } private synchronized boolean unsubscribe(String ) throws IOException { if(!addresses.removeElement( )) return false; save(); return true; }

111 S. Ben Yahia private void save() throws IOException { ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename)); out.writeObject(addresses); out.close(); }

112 S. Ben Yahia Merci


Télécharger ppt "S. BEN YAHIA Faculté des Sciences de Tunis, Tunisie Connexion Web et Bases de Données : Les SERVLETS."

Présentations similaires


Annonces Google