{"version":"1.1","schema_version":"1.1.0","plugin_version":"1.1.2","url":"https://tutos-gameserver.fr/2019/05/03/developper-en-java-pages-de-serveur-java-jsp-bien-choisir-son-serveur-d-impression/","llm_html_url":"https://tutos-gameserver.fr/2019/05/03/developper-en-java-pages-de-serveur-java-jsp-bien-choisir-son-serveur-d-impression/llm","llm_json_url":"https://tutos-gameserver.fr/2019/05/03/developper-en-java-pages-de-serveur-java-jsp-bien-choisir-son-serveur-d-impression/llm.json","manifest_url":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","language":"fr-FR","locale":"fr_FR","title":"Développer en Java &#8211; Pages de serveur Java (JSP)\n\n &#8211; Bien choisir son serveur d impression","site":{"name":"Tutos GameServer","url":"https://tutos-gameserver.fr/"},"author":{"id":1,"name":"Titanfall","url":"https://tutos-gameserver.fr/author/titanfall/"},"published_at":"2019-05-03T05:49:21+00:00","modified_at":"2019-05-03T05:49:21+00:00","word_count":9428,"reading_time_seconds":2829,"summary":"Niveau: Supérieur Les pages de serveur Java (JSP) sont une technologie Java permettant de générer des pages Web dynamiques. La technologie JSP est utilisée pour séparer la présentation en code HTML et les processus écrits en Java en tant que JavaBeans ou servlets. Cela est d&#39;autant plus facile que les JSP définissent une syntaxe particulière [&hellip;]","summary_points":["Niveau:\n  Supérieur \n\n\n\n\nLes pages de serveur Java (JSP) sont une technologie Java permettant de générer des pages Web dynamiques.","La technologie JSP est utilisée pour séparer la présentation en code HTML et les processus écrits en Java en tant que JavaBeans ou servlets.","Cela est d&#39;autant plus facile que les JSP définissent une syntaxe particulière pour l&#39;appel d&#39;un bean et l&#39;insertion dynamique du résultat de son traitement dans la page HTML.","Les informations de ce chapitre concernent les spécifications JSP 1.0 et ultérieures."],"topics":["Serveur d'impression"],"entities":[],"entities_metadata":[{"id":10,"name":"Serveur d'impression","slug":"serveur-dimpression","taxonomy":"category","count":3907,"url":"https://tutos-gameserver.fr/category/serveur-dimpression/"}],"tags":["Serveur d'impression"],"content_hash":"d12c170b5e267afd9b2bff62e20a59a1","plain_text":"Niveau:\n  Supérieur \n\n\n\n\nLes pages de serveur Java (JSP) sont une technologie Java permettant de générer des pages Web dynamiques.\nLa technologie JSP est utilisée pour séparer la présentation en code HTML et les processus écrits en Java en tant que JavaBeans ou servlets. Cela est d&#39;autant plus facile que les JSP définissent une syntaxe particulière pour l&#39;appel d&#39;un bean et l&#39;insertion dynamique du résultat de son traitement dans la page HTML.\nLes informations de ce chapitre concernent les spécifications JSP 1.0 et ultérieures.\nCe chapitre contient plusieurs sections:\n  \n  \nLes JSP vous permettent d&#39;introduire du code Java dans des balises prédéfinies d&#39;une page HTML. La technologie JSP allie la puissance Java côté serveur à la facilité de disposition HTML du côté client.\nLa page officielle de cette technologie est à l&#39;adresse suivante: http://www.oracle.com/technetwork/java/javaee/jsp/index.html.\nUn JSP est généralement composé de:\n\nbalises de données et HTML\nBalises JSP\nscriptlets (code Java intégré dans le JSP)\n\nLes fichiers JSP ont l&#39;extension .jsp par convention.\nConcrètement, les JSP sont basés sur des servlets. Lors du premier appel de la page JSP, le moteur JSP génère et compile automatiquement le servlet qui permet la génération de la page Web. Le code HTML est entièrement inclus dans le servlet. Le code Java est inséré dans le servlet.\nLe servlet généré est compilé, enregistré et exécuté. Les appels suivants depuis le JSP sont beaucoup plus rapides car la servlet, conservée par le serveur, est exécutée directement.\nIl existe plusieurs façons de combiner les technologies JSP, les EJB et les servlets pour développer des applications Web.\nÉtant donné que le code de servlet est généré de manière dynamique, les JSP sont relativement difficiles à déboguer.\nCette approche présente toutefois plusieurs avantages:\n\nl&#39;utilisation de Java par le JSP permet l&#39;indépendance de la plate-forme\nexécution mais aussi le serveur Web utilisé.\nséparation des traitements et présentation: la page Web peut être\nécrit par un concepteur et les balises Java peuvent être ajoutés plus tard par le\ndéveloppeur. Les traitements peuvent être faits avec des composants réutilisables\n(Haricots Java).\nLes JSP sont basés sur des servlets: tout ce qui est fait par un servlet\npour la génération de pages dynamiques peut être fait avec un JSP.\n\nIl existe plusieurs versions des spécifications JSP:\n\n\nVersion\n \n\n\n0,91\nPremière sortie\n\n\n1,0\n\nJuin 1999: première version finale\n    lié à l&#39;API servlet 2.1\n\n\n\n1.1\nDécembre 1999lié à l&#39;API servlet 2.2\n\n\n1.2\nOctobre 2000, JSR 053lié à l&#39;API servlet 2.3\n\n\n2.0\nNovembre 2003, JSR 152lié à l&#39;API servlet 2.4\n\n\n2.1\nMai 2006, JSR 245lié à l&#39;API servlet 2.5\n\n\n2.2\nDécembre 2009, version de maintenance de la JSR 245lié à l&#39;API servlet 3.0\n\n\n2.3\nJuin 2013, version de maintenance de la JSR 245lié à l&#39;API servlet 3.1\n\n\n73.1.1. Le choix entre JSP et Servlets\nLes servlets et les JSP ont beaucoup de choses en commun puisqu&#39;un JSP est finalement converti en un servlet. Le choix d&#39;utiliser l&#39;une ou l&#39;autre de ces technologies ou les deux doit être fait pour tirer le meilleur parti de leurs avantages.\nDans une servlet, les traitements et la présentation sont regroupés. L’aspect présentation est dans ce cas difficile à développer et à maintenir en raison de l’utilisation répétée de méthodes pour insérer le code HTML dans le flux de sortie. De plus, une simple modification du code HTML nécessite la recompilation du servlet. Avec un JSP, la séparation des traitements et de la présentation rend cela très simple et automatique.\nIl est préférable d’utiliser les JSP pour générer des pages Web dynamiques.\nL&#39;utilisation des servlets est obligatoire si elles doivent communiquer directement avec une applet ou une application et non plus avec un serveur Web.\n\n73.1.2. JSP et technologies concurrentes\nIl existe plusieurs technologies dont le but est similaire aux JSP, notamment ASP, PHP et ASP.Net. Chacune de ces technologies présente des avantages et des inconvénients, dont voici une liste non exhaustive.\n\n\n \n\nJSP\n\n\nPHP\n\n\nASPIC\n\n\nASP.Net\n\n\n\nla langue\n\nJava\n\n\nPHP\n\n\nVBScript ou JScript \n\n\nToutes les langues supportées par .Net (C #, VB.Net, Delphi, &#8230;) \n\n\n\nmode d&#39;exécution\n\nCompilé en pseudo-code (bytecode) \n\n\nInterprète\n\n\nInterprète\n\n\nCompilé en pseudo-code (MSIL)\n\n\n\nPrincipaux avantages\nReposez-vous sur la plate-forme Java dont il hérite des avantages\nOpen source \n      Nombreuses bibliothèques et sources d&#39;applications gratuites disponibles\n      Facile à mettre en œuvre\nFacile à mettre en œuvre\nReposez-vous sur la plate-forme .Net dont il hérite des avantages \n      Wysiwyg et les événements\n      Code derrière pour la séparation affichage / traitement\n\n\nprincipaux inconvénients\nDébogage plutôt fastidieux\n      Beaucoup de code à écrire\nDébogage plutôt fastidieux\n      Beaucoup de code à écrire \n      support partiel de la programmation orientée objet en attente de la version 5\nDébogage plutôt fastidieux\n      Beaucoup de code à écrire \n      Fonctionne principalement sur les plateformes Windows\n      Pas de POO, objets métier encapsulés dans des objets COM lourds à implémenter\nFonctionne principalement sur les plates-formes Windows. (Voir le projet Mono pour le support d&#39;autres plateformes)\n\n\nDans un premier temps, Sun a fourni un kit de développement pour les JSP: le kit de développement Web du serveur Java (JSWDK). Ensuite, Sun a confié au projet Apache le développement de l’implémentation de référence du moteur JSP: le projet Tomcat. Depuis la version 2.2, l&#39;implémentation de référence est le projet Glassfish.\nSelon la version de l&#39;API utilisée, vous devez choisir un produit différent. Le tableau ci-dessous récapitule les implémentations de référence basées sur la version de l&#39;API implémentée.\n\n\nProduit\n\nVersion\n\n\nVersion de l&#39;API Servlet implémentée\n\n\nVersion de l&#39;API JSP implémentée\n\n\n\nJSWDK\n\n1.0.1\n\n\n2.1\n\n\n1,0\n\n\n\nMatou\n\n3.2\n\n\n2.2\n\n\n1.1\n\n\n\nMatou\n\n4.0\n\n\n2.3\n\n\n1.2\n\n\n\nMatou\n\n5.0\n\n\n2.4\n\n\n2.0\n\n\n\nMatou\n\n6.0\n\n\n2,5\n\n\n2.1\n\n\n\nGlassfish\n\n3.0\n\n\n3.0\n\n\n2.2\n\n\n\nGlassfish\n\n4.0\n\n\n3.1\n\n\n2.3\n\n\n\nIl est également possible d&#39;utiliser tout conteneur Web compatible avec les spécifications de la plate-forme J2EE / Java EE. Une liste non exhaustive est fournie dans le chapitre &quot;Outils gratuits et commerciaux&quot;.\n\n73.2.1. Le kit de développement Web JavaServer (JSWDK) sous Windows\nLe fichier JSWDK est proposé sous forme de fichier zip nommé jswdk_1_0_1-win.zip.\nPour l&#39;installer, décompressez simplement l&#39;archive dans un répertoire du système. Le serveur commence à exécuter le fichier startserver.bat.\n\n\nPour lancer le serveur: \n\n\n\nC:  jswdk-1.0.1&gt; startserver.bat\r\n\r\nUtiliser classpath :.  Des classes;.  Webserver.jar ;.  Lib  jakarta.jar ;.  Lib  servlet.jar;.\r\n Lib  jsp.jar ;.  Lib  jspengine.jar ;.  Exemples  WEB-INF  jsp  beans ;.  Pages Web  WEB-INF\r\n Servlets ;.  Webpages  WEB-INF  jsp  beans ;.  Lib  xml.jar ;.  Lib  moo.jar  lib  tools.ja\r\nDr. C:  jdk1.3  lib  tools.jar;\r\nC:  jswdk-1.0.1&gt;\n\n\n\nLe serveur s&#39;exécute dans une console en arrière-plan. Cette console permet de voir les messages envoyés par le serveur.\n\n\nExemple: au démarrage\n\n\n\nJSWDK WebServer Version 1.0.1\r\nConfiguration chargée à partir de: fichier: C:  jswdk-1.0.1  webserver.xml\r\nnoeud final créé: localhost / 127.0.0.1: 8080\n\n\n\nSi la JSP contient une erreur, le serveur envoie une page d&#39;erreur:\n\nUne exception est levée et est affichée dans la fenêtre où le serveur est en cours d&#39;exécution:\n\n\nExemple: \n\n\n\n- Commentaires de la page JSP -\r\n^\r\n1 erreur\r\nà l&#39;adresse com.sun.jsp.compiler.Main.compile (Main.java:347)\r\nà l&#39;adresse com.sun.jsp.runtime.JspLoader.loadJSP (JspLoader.java:135)\r\nà l&#39;adresse com.sun.jsp.runtime.JspServlet $ JspServletWrapper.loadIfNecessary (JspS\r\nervlet.java:77)\r\nà l&#39;adresse com.sun.jsp.runtime.JspServlet $ JspServletWrapper.service (JspServlet.j\r\nava: 87)\r\nà l&#39;adresse com.sun.jsp.runtime.JspServlet.serviceJspFile (JspServlet.java:218)\r\nà l&#39;adresse com.sun.jsp.runtime.JspServlet.service (JspServlet.java:294)\r\nà l&#39;adresse javax.servlet.http.HttpServlet.service (HttpServlet.java:840)\r\nà l&#39;adresse com.sun.web.core.ServletWrapper.handleRequest (ServletWrapper.java:155\r\n)\r\nà l&#39;adresse com.sun.web.core.Context.handleRequest (Context.java:414)\r\nà l&#39;adresse com.sun.web.server.ConnectionHandler.run (ConnectionHandler.java:139)\r\nPROBLEME DE FIL SUIVANT: java.io.IOException: socket fermé\r\njava.io.IOException: socket fermé\r\nsur java.net.PlainSocketImpl.getInputStream (Source inconnue)\r\nat java.net.Socket $ 1.run (Source inconnue)\r\nat java.security.AccessController.doPrivileged (Native Method)\r\nat java.net.Socket.getInputStream (Source inconnue)\r\nà l&#39;adresse com.sun.web.server.ConnectionHandler.run (ConnectionHandler.java:161)\n\n\n\nLe répertoire de travail contient le code et le bytecode des servlets générés à partir des JSP.\nPour arrêter le serveur, exécutez simplement le script stopserver.bat.\nLorsque le serveur s&#39;arrête, le répertoire de travail contenant les servlets générés à partir des fichiers JSP est supprimé.\n\n73.2.2. Le serveur Tomcat\nLa mise en oeuvre et l’utilisation de Tomcat sont détaillées dans une section du chapitre. &quot;Servlets&quot;.\n\nUne grande partie du contenu d&#39;une JSP est constituée de code HTML. De plus, la méthode la plus simple pour écrire un fichier JSP consiste à écrire le fichier HTML avec un outil dédié, puis à ajouter les balises JSP pour les pièces dynamiques.\nLa seule restriction sur HTML est l&#39;utilisation de fragments &quot;  Dans ce cas, le moyen le plus simple consiste à utiliser les caractères spéciaux HTML &amp; lt; et &amp; gt; sinon, l&#39;analyseur de moteur JSP considère qu&#39;il s&#39;agit de balises JSP et renvoie une erreur.\n\n\nExemple: \n\n\n\n\r\n\r\nTester\r\n\r\n\r\nPlusieurs balises JSP commencent par &lt;% et se terminent par% &amp; gt;\r\n\r\n\n\n\n\nIl existe trois types de tags:\n\nbalises directive: elles permettent de contrôler la structure du servlet\ngénéré\nbalises de script: elles permettent d&#39;insérer du code Java dans le servlet\nbalises d&#39;action: elles facilitent l&#39;utilisation de composants\n\n\n\n\nAvertissement: Les noms de balises sont sensibles à la casse.\n\n\n73.4.1. Les balises directives \nLes directives vous permettent de spécifier des informations globales sur la page JSP. Les spécifications JSP définissent trois directives:\n\npage: Définir les options de configuration\ninclude: permet d&#39;inclure des fichiers statiques dans le fichier JSP avant la génération.\nde la servlet\ntaglib: permet de définir des tags personnalisés\n\nLeur syntaxe est la suivante:\n&lt;% @ Directif attribut= &quot;valeur&quot;&#8230;%&gt;\n\n73.4.1.1. La directive de page\nCette directive doit être utilisée dans toutes les pages JSP: elle vous permet de définir des options s’appliquant à l’ensemble du JSP.\nIl peut être placé n&#39;importe où dans la source mais il est préférable de le mettre au début du fichier, même avant la balise. . Il peut être utilisé plusieurs fois dans la même page, mais il ne doit définir la valeur d&#39;une option qu&#39;une seule fois, à l&#39;exception de l&#39;option d&#39;importation.\nLes options définies par cette directive sont de la forme option = valeur.\n\n\n\n       Option\n   \n\nValeur\n\n\nValeur par défaut\n\n\nAutre valeur possible\n\n\n\n\nautoFlush\n\n\nChaîne\n\n\n&quot;Vrai&quot;\n\n\n&quot;Faux&quot;\n\n\n\n\ntampon\n\n\nChaîne\n\n\n&quot;8kb&quot;\n\n\n&quot;Aucun&quot; ou &quot;nnnkb&quot; (nnn indiquant la valeur)\n\n\n\n\ncontentType\n\n\nUne chaîne contenant le type MIME\n\n \n \n\n\n\nerrorPage\n\n\nUne chaîne contenant une URL\n\n \n \n\n\n\ns&#39;étend\n\n\nUne classe\n\n \n \n\n\n\nimportation\n\n\nUne classe ou un package. *\n\n \n \n\n\n\nInfo\n\n\nChaîne\n\n \n \n\n\n\nisErrorPage\n\n\nChaîne\n\n\n&quot;Faux&quot;\n\n\n&quot;Vrai&quot;\n\n\n\n\nisThreadSafe\n\n\nChaîne\n\n\n&quot;Vrai&quot;\n\n\n&quot;Faux&quot;\n\n\n\n\nla langue\n\n\nChaîne\n\n\n&quot;Java&quot;\n\n \n\n\n\nsession\n\n\nChaîne\n\n\n&quot;Vrai&quot;\n\n\n&quot;Faux&quot;\n\n\n\n\n\n\nExemple: \n\n\n\n\r\n\r\n\n\n\n\nLes options sont:\n\nautoFlush = &quot;vrai| Faux &quot;\nCette option spécifie si le flux de sortie du servlet doit être vidé lorsque\nle tampon est plein. Si la valeur est false, une exception est levée dès que\nle tampon est plein. Nous ne pouvons pas définir false si la valeur du tampon est\naucun.\n\ntampon = &quot;aucun |8kb|Taillekb &quot;\nCette option permet de spécifier la taille de la mémoire tampon des données générées contenues\npar l&#39;objet de type JspWriter.\n\ncontentType = &quot;mimeType [;charset=[;charset=[;charset=[;charset=jeu de caractères ]&quot;\n| &quot;text / html; jeu de caractères = ISO-8859-1&quot; \nCette option spécifie le type MIME des données générées.\nCette option est équivalente à \n\nerrorPage =&quot;RelativeURL&quot;\nCette option vous permet de spécifier le JSP appelé en cas d’exception.\nlevage\nSi l&#39;URL ne commence pas par &amp; # 39; / &amp; # 39 ;, alors l&#39;URL est relative au répertoire\nserveur Web principal sinon il est relatif au répertoire qui contient\nle JSP\n\ns&#39;étend= &quot;Package.class&quot;\nCette option vous permet de spécifier la classe qui sera la super classe de l&#39;objet\nJava créé à partir du JSP.\n\nimport = &quot; paquet. * , &#8230; &quot;\nCette option importe les classes contenues dans les packages utilisés.\ndans le code du JSP. Cette option est utilisée comme instruction d&#39;importation\ndans un code source Java. \nChaque classe ou package est séparé par une virgule.\nCette option peut être présente dans plusieurs directives de page.\n\ninfo = &quot;text&quot;\nCette option vous permet de spécifier une petite description du fichier JSP. Le texte fourni\nsera renvoyé par la méthode getServletInfo () du servlet généré.\n\nisErrorPage = &quot;true |faux&quot;\nCette option spécifie si le JSP génère une page d&#39;erreur. La valeur\ntrue permet à l&#39;objet Exception d&#39;être utilisé dans le JSP\n\nisThreadSafe = &quot;vrai| Faux &quot;\nCette option indique si le servlet généré sera multithread: dans ce cas,\nla même instance du servlet peut gérer plusieurs demandes simultanément.\nEn retour, il doit gérer correctement les accès concurrents aux ressources.\nLa valeur false amène le servlet généré à implémenter l&#39;interface SingleThreadModel.\n\nlanguage = &quot;java&quot;\nCette option définit le langage utilisé pour écrire du code dans le JSP. le\nla seule valeur actuellement autorisée est &quot;java&quot;.\n\nsession = &quot;vrai| faux&quot;\nCette option spécifie si le JSP est inclus dans une session ou si\nnon. La valeur par défaut (true) permet l&#39;utilisation d&#39;un objet de session de\nType HttpSession qui gère les informations dans une session. \n\n\n73.4.1.2. La directive include\nCette directive vous permet d&#39;inclure un fichier dans le code source JSP. Le fichier inclus peut être un extrait de code JSP, HTML ou Java. Le fichier est inclus dans le JSP avant d&#39;être interprété par le moteur JSP.\nCette balise est particulièrement utile pour insérer un élément multi-page commun tel qu&#39;un en-tête ou un pied de page.\nSi le fichier inclus est un fichier HTML, il ne doit pas contenir de balise. , ,  ou  ce qui dupliquerait ceux présents dans le fichier JSP. Cela nécessite l&#39;écriture de fichiers HTML particuliers uniquement pour être inclus dans les JSP: ils ne peuvent pas être utilisés seuls.\nLa syntaxe est la suivante:\n\nSi le chemin commence par &amp; # 39; / # 39 ;, le chemin est relatif au contexte de l&#39;application, sinon il est relatif au fichier JSP.\n\n\nExemple: \n\n\n\nhello.htm:\r\n\r\n\r\n\r\nBONJOUR\r\n\r\n\n\n\n\n\n\n\nExemple: Test1.jsp\n\n\n\n\r\n\r\n\r\nTest de page JSP\r\n\r\n\r\nTest d&#39;inclusion d&#39;un fichier dans le JSP\r\n\r\nfin\r\n\r\n\n\n\n\nPour tester cette JSP avec le JSWDK, placez simplement ces deux fichiers dans le répertoire jswdk-1.0.1  examples  jsp  test.\nPour afficher le fichier JSP, entrez l&#39;URL http: // localhost: 8080 / examples / jsp / test / Test1.jsp dans un navigateur.\n\n\n\nAttention: une modification du fichier inclus ne provoque pas de régénération\net une compilation du servlet correspondant au JSP. Pour insérer un\nfichier dynamiquement lors de l&#39;exécution du servlet, il est nécessaire d&#39;utiliser la balise\n      .\n\n\n73.4.1.3. La directive taglib\nCette directive déclare l&#39;utilisation d&#39;une bibliothèque de balises personnalisée. L&#39;utilisation de cette directive est détaillée dans la section consacrée aux bibliothèques de balises personnalisées.\n\n73.4.2. Tags de script\nCes balises sont utilisées pour insérer du code Java qui sera inclus dans le servlet généré à partir du JSP. Il existe trois balises pour l&#39;insertion de code Java:\n\nla balise de déclaration: le code Java est inclus dans le corps du servlet\ngénéré. Ce code peut être la déclaration de variables d&#39;instance ou de classe ou la déclaration de méthodes.\nla balise expression: évalue une expression et insère le résultat dans la forme\nchaîne dans la page Web générée.\nla balise scriptlets: Par défaut, le code Java est inclus dans la méthode service () du servlet.\n\nIl est possible d&#39;utiliser dans ces balises plusieurs objets définis par les JSP.\n\n73.4.2.1. La balise de déclaration \nCette balise est utilisée pour déclarer des variables ou des méthodes pouvant être utilisées dans le JSP. Il ne génère aucun caractère dans le fichier HTML de sortie.\nLa syntaxe est la suivante:\n\n\n\nExemple: \n\n\n\n \r\n\n\n\n\nLes variables déclarées de cette manière peuvent être utilisées dans les balises d&#39;expression et de scriptlet.\nIl est possible de déclarer plusieurs variables dans la même balise en les séparant avec &amp; # 39 ;; &amp; # 39; personnages.\nCette balise vous permet également d’insérer des méthodes dans le corps du servlet.\n\n\nExemple: \n\n\n\n\r\n\r\nTester\r\n\r\n\r\n\r\n\r\n\r\n&lt;%!\r\nint minimum (int val1, int val2) \r\nsi (val1 < val2) return val1;\r\n   else return val2;\r\n \r\n%> \r\n\r\nLe plus petit des 5 et 3 est \r\n \r\n\n\n\n\n73.4.2.2. La balise d&#39;expression \nLe moteur JSP remplace cette balise par le résultat de l&#39;évaluation de l&#39;expression présente dans la balise.\nCe résultat est toujours converti en chaîne. Cette balise est un raccourci pour éviter d’utiliser la méthode println () lors de l’insertion de données dynamiques dans le fichier HTML.\nLa syntaxe est la suivante:\n\nLe signe &amp; # 39; = &amp; # 39; doit être collé sous le signe%.\n\n\n\nAttention: ne mettez pas &amp; # 39; &amp; # 39; &amp; # 39; &amp; # 39; à la fin de l&#39;expression.\n\n\n\n\n\nExemple: insertion de la date dans la page HTML\n\n\n\n\r\n\r\n\r\nTest de page JSP\r\n\r\n\r\nDate d&#39;aujourd&#39;hui: \r\n\r\n\r\n\r\n\n\n\n\n\n\n\nRésultat: \n\n\n\nDate du jour: jeu 15 fév 11:15:24 CET 2001\n\n\n\nL&#39;expression est évaluée et convertie en une chaîne avec un appel à la méthode toString (). Cette chaîne est insérée dans la page HTML à la place de la balise. Il est possible que le résultat corresponde à une partie ou à la totalité d&#39;une balise HTML ou même à une JSP\n\n\nExemple: \n\n\n\n\r\n\r\nTest de page JSP\r\n\r\n\r\n\r\n\r\n\r\n&lt;% = &quot;&quot;%&gt; Bonjour &lt;% =&quot;&quot;%&gt;\r\n\r\n\n\n\n\n\n\n\nRésultat: code HTML généré\n\n\n\n\r\n\r\nTest de page JSP\r\n\r\n\r\nBonjour\r\n\r\n\n\n\n\n73.4.2.3. Les variables implicites\nLes spécifications JSP définissent plusieurs objets utilisables dans le code, les plus utiles étant:\n\n\nObjet\n\nClasse \n\n\nRôle \n\n\n\nen dehors\n\njavax.servlet.jsp.JspWriter \n\n\nFlux de sortie de la page HTML générée \n\n\n\ndemande\n\njavax.servlet.http.HttpServletRequest \n\n\nContient les informations de la requête \n\n\n\nréponse\n\njavax.servlet.http.HttpServletResponse \n\n\nContient l&#39;information de réponse \n\n\n\nsession\n\njavax.servlet.http.HttpSession \n\n\nGère la session \n\n\n\n73.4.2.4. La balise scriptlets \nCette balise contient du code Java nommé scriptlet.\nLa syntaxe est la suivante: \n\n\nExemple: \n\n\n\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nDate d&#39;aujourd&#39;hui: \r\n\r\n\n\n\n\nPar défaut, le code inclus dans la balise est inséré dans la méthode service () du servlet généré à partir du JSP.\nCette balise ne peut contenir autre chose que du code Java: elle ne peut pas contenir par exemple des balises HTML ou JSP. Pour ce faire, vous devez fermer la balise de scriptlet, placer la balise HTML ou JSP, puis redémarrer une balise de scriptlet pour continuer le code.\n\n\nExemple: \n\n\n\n\r\n\r\nTest de page JSP\r\n\r\n\r\n\r\n\r\n\r\n&lt;% pour (int i = 0; i \r\n \r\n\r\n\r\n\n\n\n\n\n\n\nRésultat: la page HTML générée\n\n\n\n\r\n\r\nTest de page JSP\r\n\r\n\r\n\r\n\r\n\r\n0 \r\n1 \r\n2 \r\n3 \r\n4 \r\n5 \r\n6 \r\n7 \r\n8 \r\n9 \r\n\r\n\n\n\n\n73.4.3. Tags de commentaire\nIl existe deux types de commentaires avec les JSP:\n\ncommentaires visibles dans le code HTML\ncommentaires invisibles dans le code HTML\n\n73.4.3.1. Commentaires HTML \nCes commentaires sont ceux définis par le format HTML. Ils sont entièrement reproduits dans le fichier HTML généré. Il est possible d&#39;insérer dans cette balise une balise JSP de type expression à exécuter.\nLa syntaxe est la suivante:\n&lt;! &#8211; commentaires[[[[ ]-&gt;\n\n\nExemple: \n\n\n\n\r\n\r\n\r\nTest de page JSP\r\n\r\n\r\n\r\n\r\n\r\n&lt;! - Cette page a été générée sur  -&gt;\r\nBonjour\r\n\r\n\n\n\n\n\n\n\nRésultat: \n\n\n\n\r\n\r\nTest de page JSP\r\n\r\n\r\n\r\nBonjour\r\n\r\n\n\n\n\nLe contenu d&#39;une expression incluse dans les commentaires est dynamique: sa valeur peut changer à chaque génération de la page en fonction de son contenu.\n\n73.4.3.2. Commentaires cachés \nLes commentaires masqués sont utilisés pour documenter la page JSP. Leur contenu est ignoré par le moteur JSP et n&#39;est donc pas reproduit dans la page HTML générée.\nLa syntaxe est la suivante:\n\n\n\nExemple: \n\n\n\n\r\n\r\nTest de page JSP\r\n\r\n\r\n\r\nBonjour\r\n\r\n\n\n\n\n\n\n\nRésultat: \n\n\n\n\r\n\r\nTest de page JSP\r\n\r\n\r\nBonjour\r\n\r\n\n\n\n\nCette balise peut être utile pour éviter l&#39;exécution de code pendant la phase de débogage.\n\n73.4.4. Les balises d&#39;action\nLes étiquettes d&#39;action permettent d&#39;effectuer des traitements couramment utilisés.\n\n73.4.4.1. Le tag \nLe tag  vous permet de localiser une instance ou d&#39;instancier un bean à utiliser dans le fichier JSP.\nL&#39;utilisation d&#39;un bean dans une JSP est très pratique car elle peut encapsuler des processus complexes et être réutilisée par d&#39;autres JSP ou composants. Par exemple, le bean peut fournir un accès à une base de données. L&#39;utilisation de beans simplifie les processus inclus dans le JSP.\nLors de l&#39;instanciation d&#39;un bean, nous spécifions la portée du bean. Si le bean demandé est déjà instancié pour la portée spécifiée, aucune nouvelle instance du bean n&#39;est créée, mais sa référence est simplement renvoyée: la balise  n&#39;instancie pas nécessairement un objet.\nCette balise ne permet pas de traiter directement EJB.\nLa syntaxe est la suivante:\n&lt;Jsp: useBeanid = &quot;beanInstanceName &quot;scope = &quot;page| Demande | session | application &quot;\nbeanName = &quot; &lt;% = expression %&gt; &quot;type =&quot;package.class&quot;\n/&gt; \nL&#39;attribut id est utilisé pour donner un nom à la variable qui contiendra la référence sur le bean.\nL&#39;attribut scope permet de définir la portée sur laquelle le bean est défini et utilisable. La valeur de cet attribut détermine la manière dont la balise localise ou instancie le bean. Les valeurs possibles sont:\n\n\n\n      Valeur\n   \n\n      Rôle\n   \n\n\n\n      page\n   \n\n      Le haricot peut être utilisé sur toute la page\nJSP ainsi que dans les fichiers statiques inclus.\nC&#39;est la valeur par défaut.\n\n\n    demande\n    le haricot est accessible pendant la durée de vie de la demande.\nLa méthode getAttribute () de l&#39;objet request fournit une référence\nsur le haricot.\n\n\n\n      session\n   \n    le haricot est utilisable par tous les JSP qui appartiennent\nà la même session que le JSP qui a instancié le bean. Le haricot est utilisable\ntout au long de la session par toutes les pages qui y participent. Le JSP\nqui crée le bean doit avoir l&#39;attribut session = &quot;true&quot; dans sa directive\npage.\n\n\n\n      application\n   \n    le haricot est utilisable par tous les JSP qui appartiennent\nà la même application que le JSP qui a instancié le bean. Le haricot est\ninstancié uniquement lors du rechargement de l&#39;application.\n\n\nL&#39;attribut class est utilisé pour indiquer la classe du bean.\nL&#39;attribut type est utilisé pour spécifier le type de la variable qui contiendra la référence du bean. La valeur spécifiée doit être une super classe du bean ou une interface implémentée par le bean (directement ou par héritage).\nL&#39;attribut beanName est utilisé pour instancier le bean à l&#39;aide de la méthode instanciate () de la classe Beans.\n\n\nExemple: \n\n\n\n\n\n\n\nDans cet exemple, une instance de MonBean est créée une fois dans la session. Dans la même session, l&#39;appel de la balise  avec le même bean et la même portée ne renverra que l&#39;instance créée. Le haricot est donc accessible tout au long de la session.\nLe tag  recherche si une instance du bean existe avec le nom et la portée spécifiés. S&#39;il n&#39;existe pas, une instance est créée. S&#39;il y a instanciation du haricot, alors les balises  inclus dans la balise sont utilisés pour initialiser les propriétés du bean, sinon ils sont ignorés. Tags inclus entre les tags  et  ne sont exécutés que si le haricot est instancié.\n\n\nExemple: \n\n\n\n\r\n\r\n\n\n\n\nCet exemple a le même effet que le précédent avec une initialisation des propriétés du bean lors de son instanciation.\n\n\nExemple complet: TestBean.jsp\n\n\n\n\r\n\r\nTest d&#39;instanciation d&#39;un haricot dans un JSP\r\n\r\n\r\nTest d&#39;utilisation d&#39;un bean dans un JSP \r\n\r\nnom initial = \r\n\r\nnom mis à jour = \r\n\r\n\n\n\n\n\n\n\nExemple complet: Person.java\n\n\n\npaquet de test;\r\nClasse publique Personne \r\nnom de chaîne privé;\r\nprivate String prenom;\r\n\r\npersonne publique () \r\nthis.name = &quot;nom par défaut&quot;;\r\nthis.prenom = &quot;nom par défaut&quot;;\r\n\r\n\r\npublic void setName (nom de chaîne) \r\nthis.name = name;\r\n\r\n\r\npublic String getName () \r\nreturn (this.name);\r\n\r\n\r\npublic void setPenom (String name) \r\nthis.prenom = prénom;\r\n\r\n\r\npublic String getPrenom () \r\nretour (this.prenom);\r\n\r\n\n\n\n\nSelon le moteur JSP utilisé, les fichiers bean doivent être placés dans un répertoire particulier pour être accessibles par JSP.\nPour tester cette JSP avec Tomcat, vous devez compiler le bean Person dans le répertoire c:  jakarta-tomcat  webapps  examples  web-inf  classes  test et placer le fichier TestBean.jsp dans le répertoire c:  jakarta-tomcat. répertoire  webapps  examples  jsp  test.\n\n\n73.4.4.2. Le tag \nLe tag  vous permet de mettre à jour la valeur d&#39;un ou plusieurs attributs d&#39;un bean. La balise utilise la méthode setter (setXXX () où XXX est le nom de la propriété avec la première lettre en majuscule) pour mettre à jour la valeur. Le haricot doit exister via un appel à la balise .\nIl existe trois façons de mettre à jour les propriétés à partir des paramètres de la requête ou avec une valeur:\n\nalimente automatiquement toutes les propriétés avec les paramètres correspondants de la requête\nnourrir automatiquement une propriété avec le paramètre de requête\ncorrespondant\nfournir une propriété avec la valeur spécifiée\n\nLa syntaxe est la suivante:\n&lt;jsp: setProperty name = &quot;beanInstanceName&quot;\npropriété = &quot;nom de la propriété&quot;valeur =&quot;  &lt;% = expression%&gt; &quot;\n/&gt;\nL&#39;attribut name doit contenir le nom de la variable contenant la référence du bean. Cette valeur doit être identique à celle de l&#39;attribut id de la balise  utilisé pour instancier le haricot.\nL&#39;attribut property = &quot;*&quot; est utilisé pour alimenter automatiquement les propriétés du bean avec les paramètres correspondants contenus dans la requête. Le nom des propriétés et le nom des paramètres doivent être identiques.\nLes paramètres de la requête étant toujours fournis sous forme de chaîne, une conversion est effectuée à l&#39;aide de la méthode valueOf () du wrapper du type de propriété.\n\n\nExemple: \n\n\n\n\n\n\n\nLa propriété d&#39;attribut = &quot;propertyName &quot;[param=&quot;[param=&quot;[param= »[param= »paramètreName &quot;]permet de mettre à jour un attribut du haricot. Par défaut, l&#39;alimentation est automatiquement effectuée avec le paramètre correspondant dans la requête. Si le nom de la propriété et le paramètre sont différents, il est nécessaire de spécifier la propriété d&#39;attribut et l&#39;attribut param contenant le nom du paramètre qui alimentera la propriété du bean.\n\n\nExemple: \n\n\n\n\n\n\n\nLa propriété d&#39;attribut = &quot;propertyName &quot;valeur =&quot; chaîne  &quot;alimente la propriété du bean avec une valeur particulière.\n\n\nExemple: \n\n\n\n\n\n\n\nIl n&#39;est pas possible d&#39;utiliser param et value dans la même balise.\n\n\nExemple: Cet exemple est identique au précédent\n\n\n\n\r\n\r\nTest d&#39;instanciation d&#39;un haricot dans un JSP\r\n\r\n\r\nTest d&#39;utilisation d&#39;un bean dans un JSP \r\n\r\nnom initial =  \r\n\r\nnom mis à jour = \r\n\r\n\n\n\n\nCette balise peut être utilisée entre les balises  et  initialiser les propriétés du haricot lors de son instanciation.\n\n73.4.4.3. Le tag \nLe tag  Obtenir la valeur d&#39;un attribut d&#39;un haricot. La balise utilise la méthode getter (getXXX () où XXX est le nom de la propriété avec la première lettre en majuscule) pour obtenir la valeur et l&#39;insérer dans la page HTML générée. Le haricot doit exister via un appel à la balise .\nLa syntaxe est la suivante:\n&lt;jsp: getProperty name = &quot;beanInstanceName&quot;propriété =&quot; nom de la propriété« />\nL&#39;attribut name indique le nom du bean tel que déclaré dans la balise .\nL&#39;attribut de propriété indique le nom de la propriété dont nous voulons la valeur.\n\n\nExemple: \n\n\n\n\r\n\r\nTest d&#39;instanciation d&#39;un haricot dans un JSP\r\n\r\n\r\nTest d&#39;utilisation d&#39;un bean dans un JSP \r\n\r\nnom initial = \r\n\r\nnom mis à jour = \r\n\r\n\n\n\n\n\n\n\n\nAttention: cette balise n&#39;obtient pas la valeur d&#39;une propriété indexée\nni les valeurs d&#39;un attribut d&#39;un EJB.\n\n\nNote: avec Tomcat 3.1, utilisation de la balise  sur un attribut dont la valeur est null n&#39;affiche rien tandis que l&#39;utilisation d&#39;une balise d&#39;expression renvoie &quot;null&quot;.\n\n\nExemple: \n\n\n\n\r\n\r\nTest d&#39;instanciation d&#39;un haricot dans un JSP\r\n\r\n\r\nTest d&#39;utilisation d&#39;un bean dans un JSP  \r\n\r\nnom initial = \r\n\r\nnom mis à jour = \r\nnom mis à jour = \r\n\r\n\n\n\n\n\n\n73.4.4.4. La balise de redirection \nLe tag  Vous permet de rediriger la demande vers une autre URL pointant vers un fichier HTML, JSP ou un fichier de servlet.\nDès que le moteur JSP rencontre cette balise, il redirige la demande vers l&#39;URL spécifiée et ignore le reste de la JSP actuelle. Tout ce qui a été généré par le JSP est perdu.\nLa syntaxe est la suivante:\n&lt;jsp: forward page = &quot;RelativeURL  « />ou&lt;jsp: forward page = &quot; &lt;% = expression %&gt; &quot;&gt;&lt;jsp: param name = &quot;le nom du paramètre&quot;valeur =&quot;  &lt;% = expression  %&gt; « /> +\nL&#39;option de page doit contenir la valeur de l&#39;URL de la ressource vers laquelle la demande sera redirigée.\nCette URL est absolue si elle commence par un &amp; # 39; / &amp; # 39; sinon, il est relatif au JSP. Dans le cas d&#39;une URL absolue, le serveur Web détermine l&#39;emplacement de la ressource.\nIl est possible de passer un ou plusieurs paramètres à la ressource appelée grâce au tag .\n\n\nExemple: Test8.jsp\n\n\n\n \r\n \r\nPage initiale appelée\r\n\r\n\r\n\n\n\n\n\n\n\nExemple: forward.htm\n\n\n\n\r\n\r\nPage HTML\r\n\r\n\r\n\r\n\r\nPage HTML transférée\r\n\r\n\r\n\r\n\n\n\n\nDans l&#39;exemple, le fichier forward.htm doit se trouver dans le même répertoire que le fichier JSP. Lors de l&#39;appel de la JSP, la page HTML est affichée. Le contenu généré par la page JSP n&#39;est pas affiché.\n\n73.4.4.5. Le tag \nCette balise inclut de manière dynamique le contenu généré par un JSP ou un servlet au moment de l’exécution du JSP. C&#39;est la différence avec la directive include pour laquelle le fichier est inséré dans le fichier JSP avant la génération du servlet.\nLa syntaxe est la suivante:\n&lt;jsp: include page = &quot;relativeURL &quot;flush =&quot; true &quot; /&gt;\nL&#39;attribut page vous permet de spécifier l&#39;URL relative de l&#39;élément à insérer.\nL&#39;attribut flush indique si le tampon doit être envoyé au client et vidé. Si la valeur de ce paramètre est true, il n&#39;est pas possible d&#39;utiliser certaines fonctionnalités du servlet ou du JSP appelé: il n&#39;est pas possible de modifier l&#39;en-tête de la réponse (en-tête, cookies) ni de le suivre sur une autre page.\n\n\nExemple: \n\n\n\n\r\n  \r\n    \r\n    Bonjour\r\n    \r\n  \r\n\n\n\n\nIl est possible de fournir des paramètres au servlet ou au JSP appelé à l’aide de la balise .\n\n73.4.4.6. Le tag \nCette balise permet de générer le code HTML nécessaire pour exécuter une applet en fonction du navigateur: une balise HTML  ou  est généré en fonction de l&#39;attribut User-Agent de la requête.\nLe tag  a trois attributs requis:\n\n\nAttribut\nRôle\n\n\ncode\npermet de spécifier le nom de la classe\n\n\nbase de code\ncontient une URL spécifiant le chemin absolu ou relatif du répertoire contenant la classe ou l&#39;archive\n\n\ntype\nles valeurs possibles sont applet ou bean\n\n\nIl possède également plusieurs autres attributs facultatifs, les plus utilisés étant:\n\n\nAttribut\nRôle\n\n\naligner\npermet de spécifier l&#39;alignement de l&#39;applet: les valeurs possibles sont bas, milieu ou haut\n\n\narchiver\npermet de spécifier un ensemble de ressources (bibliothèques JAR, classes, &#8230;) à charger automatiquement. Le chemin de ces ressources prend en compte l&#39;attribut codebase\n\n\nla taille\nspécifie la hauteur de l&#39;applet en pixel ou en pourcentage\n\n\nhspace\nspécifie le nombre de pixels insérés à gauche et à droite de l&#39;applet\n\n\nreconversion\nspécifie la version minimale du jer à utiliser pour exécuter l&#39;applet\n\n\nprénom\nspécifier le nom de l&#39;applet\n\n\nvspace\nspécifie le nombre de pixels insérés en haut et en bas de l&#39;applet\n\n\nlargeur\nspécifie la longueur de l&#39;applet en pixel ou en pourcentage\n\n\nTo be a try out of the setting of tag, it faut utiliser in the body of tag  le tag . Chaque paramètre sera alors défini dans un tag .\n\n\nExemple: \n\n\n\n\r\n  \r\n     \r\n  \r\n\n\n\n\nLe tag  dans le corps du tag  permet de préciser un message qui sera affiché dans les navigateurs ne supportant pas le tag HTML  ou .\n\nL&#39;exemple de cette section est composé de deux pages.\nLa première page est une page HTML qui demande à être son nom et invoquant une url vers une JSP.\n\n\nExemple: TestJSPIdent.html\n\n\n\n\r\n\r\nIdentification\r\n\r\n\r\n\r\n\r\n\r\n\r\nEntrez votre nom: \r\n\r\n\r\n\r\n\r\n\n\n\n\nLa page JSP salue l&#39;utilisateur en récupérant son nom.\n\n\nExemple: TestJSPAccueil.jsp\n\n\n\n \r\n \r\nAccueil\r\n \r\n \r\n \r\nBonjour  \r\n \r\n\n\n\n\nLors de l&#39;exécution d&#39;une page JSP, des erreurs peuvent survenir. Chaque erreur est traduite par la levée d&#39;une exception. Si cette exception est capturée dans un bloc try / catch of the JSP, celle-ci est traitée. Si l’exception n’est pas capturée dans la page, il ya deux possibilités selon qu’une page d’erreur soit associée à la page JSP ou non:\n\nsans page d&#39;erreur associée, la pile d&#39;exécution de l&#39;exception est affichée\navec une page d&#39;erreur associée, une redirection est effectuée vers ce JSP\n\nLa définition d&#39;une page d&#39;erreur permet de préciser dans l&#39;attribut errorPage de la page de directive des autres JSP de l&#39;application. Si une exception est levée dans les traitements d&#39;une de ces pages, le JSP va automatiquement rediriger l&#39;utilisateur vers la page d&#39;erreur précisée.\nLa valeur de l&#39;attribut page d&#39;erreur de la directive doit contenir l&#39;adresse URL de la page d&#39;erreur. Le plus simple est de définir cette page à la racine de l&#39;application web et de faire précéder le nom de la page par un caractère &amp; # 39; / # 39; / # 39; dans l&#39;URL.\n\n\nExemple: \n\n\n\n\n\n\n\n73.6.1. La définition d&#39;une page d&#39;erreur\nUne page d&#39;erreur est une JSP sans l&#39;attribut isErrorPage est égal à true dans la page de directive. Une telle page dispose d&#39;un accès à la variable implicite nommée exception de type Jetable qui encapsule l&#39;exception qui a été levée.\nIl est possible dans une telle page d&#39;afficher un message d&#39;erreur personnalisée mais aussi de traiter de manière liée à la gestion de l&#39;exception: ajouter l&#39;exception dans un journal, envoyer un mail pour son traitement, &#8230;\n\n\nExemple: \n\n\n\n\r\n\r\n\r\n\r\n% @ page isErrorPage = &quot;true&quot;%&gt;\r\n\r\n  \r\n    Une erreur est survenue lors des traitements\r\n    \r\n  \r\n\n\n\n\nLes bibliothèques de tags (taglibs) ou les tags personnalisés (tags personnalisés) permettent de définir leurs propres balises XML, de regrouper dans une bibliothèque et de réutiliser dans des fichiers JSP. C’est une extension de la technologie JSP à partir de la version 1.1 des spécifications du JSP.\n\n73.7.1. La présentation des tags personnalisés\nUn élément personnalisé du langage JSP a été personnalisé avec JSP. Ces dernières dernières permettent de définir ses propres tags qui ont été réalisées pour générer la réponse.\nLe principal, mais est de préférer la séparation des rôles entre le développeur Java et le concepteur de pages web. L&#39;idée maîtresse est de déformer le code Java contenu dans les scriplets de la classe JSP dans les classes dédiées et l&#39;appelant dans le code source de la classe JSP.\nCe concept peut sembler proche de celui des javabeans. Les javabeans sont particulièrement adaptés pour stocker et échanger des données entre les composants de l&amp;#39;application web en passant par la session.\nLes tags personnalisés sont adaptés pour enlever du code Java inclus dans les JSP et le déporter dans une classe dédiée. Cette classe est physiquement un javabean qui implémente une interface particulière.\nLa principale différence entre un javabean et un tag personnalisé est que ce dernier tient compte de l&amp;#39;environnement dans lequel il s&amp;#39;exécute (notamment la JSP et le contexte de l&amp;#39;application web ) et interagit avec lui.\nPour de plus amples informations sur les bibliothèques de tags personnalisés, il suffit de consulter le site qui leur est consacré : http://www.oracle.com/technetwork/java/index-jsp-135995.html.\nLes tags personnalisés possèdent des fonctionnalités intéressantes :\n\nils ont un accès aux objets de la JSP notamment l&amp;#39;objet de type HttpResponse. Ils peuvent donc modifier le contenu de la réponse générée par la JSP\nils peuvent recevoir des paramètres envoyés à partir de la JSP qui les appelle\nils peuvent avoir un corps qu&amp;#39;ils peuvent manipuler. Par extension de cette fonctionnalité, il est possible d&amp;#39;imbriquer un tag personnalisé dans un autre avec un nombre d&amp;#39;imbrications illimité\n\nLes avantages des bibliothèques de tags personnalisés sont :\n\nune suppression du code Java dans la JSP remplacé par un tag XML facilement compréhensible ce qui simplifie grandement la JSP\nune API facile à mettre en oeuvre\nune forte et facile réutilisabilité des tags développés\nune maintenance des JSP facilitée\n\nLa définition d&amp;#39;une bibliothèque de tags comprend plusieurs entités :\n\nune classe dite &quot;handler&quot; pour chaque tag qui compose la bibliothèque\nun fichier de description de la bibliothèque\n\n73.7.2. Les handlers de tags\nChaque tag est associé à une classe qui va contenir les traitements à exécuter lors de l&amp;#39;utilisation du tag. Une telle classe est nommée &quot;handler de tag&quot; (tag handler). Pour permettre son appel, une telle classe doit obligatoirement implémenter directement ou indirectement l&amp;#39;interface javax.servlet.jsp.tagext.Tag\nL&amp;#39;interface Tag possède une interface fille BodyTag qui doit être utilisée dans le cas où le corps du tag est utilisé.\nPour plus de facilité, l&amp;#39;API JSP propose les classes TagSupport et BodyTagSupport qui implémentent respectivement l&amp;#39;interface Tag et BodyTag. Ces deux classes, contenues dans le package javax.servlet.jsp.tagext, proposent des implémentations par défaut des méthodes de l&amp;#39;interface. Ces deux classes proposent un traitement standard par défaut pour chacune des méthodes de l&amp;#39;interface qu&amp;#39;elles implémentent. Pour définir un handler de tag, il suffit d&amp;#39;hériter de l&amp;#39;une ou l&amp;#39;autre de ces deux classes.\nLes méthodes définies dans les interfaces Tag et BodyTag sont appelées, par la servlet issue de la compilation de la JSP, au cours de l&amp;#39;utilisation du tag.\nLe cycle de vie général d&amp;#39;un tag est le suivant :\n\nlors de la rencontre du début du tag, un objet du type du handler est instancié\nplusieurs propriétés sont initialisées (pageContext, parent, &#8230;) en utilisant les setters correspondants\nsi le tag contient des attributs, les setters correspondants sont appelés pour alimenter leurs valeurs\nla méthode doStartTag() est appelée\nsi la méthode doStartTag() renvoie la valeur EVAL_BODYINCLUDE alors le contenu du corps du tag est évalué\nlors de la rencontre de la fin du tag, appel de la méthode doEndTag()\nsi la méthode doEndTag() renvoie la valeur EVAL_PAGE alors l&amp;#39;évaluation de la page se poursuit, si elle renvoie la valeur SKIP_PAGE elle ne se poursuit pas\n\nToutes ces opérations sont réalisées par le code généré lors de la compilation de la JSP.\nUn handler de tag possède un objet qui permet d&amp;#39;avoir un accès aux objets implicites de la JSP. Cet objet est du type javax.servlet.jsp.PageContext\nComme le code contenu dans la classe du tag ne peut être utilisé que dans le contexte particulier du tag, il peut être intéressant de sortir une partie de ce code dans une ou plusieurs classes dédiées qui peuvent être éventuellement des beans.\nPour compiler ces classes, il faut obligatoirement que le jar de l&amp;#39;API servlets (servlets.jar) soit inclus dans la variable CLASSPATH.\n\n73.7.3. L&amp;#39;interface Tag\nCette interface définit les méthodes principales pour la gestion du cycle de vie d&amp;#39;un tag personnalisé qui ne doit pas manipuler le contenu de son corps.\nElle définit plusieurs constantes :\n\n\nConstante\nRôle\n\n\nEVAL_BODY_INCLUDE\nContinuer avec l&amp;#39;évaluation du corps du tag\n\n\nEVAL_PAGE\nContinuer l&amp;#39;évaluation de la page\n\n\nSKIP_BODY\nEmpêcher l&amp;#39;évaluation du corps du tag\n\n\nSKIP_PAGE\nEmpêcher l&amp;#39;évaluation du reste de la page\n\n\nElle définit aussi plusieurs méthodes :\n\n\nMéthode\nRôle\n\n\nint doEndTag()\nTraitements à la rencontre du tag de fin\n\n\nint doStartTag()\nTraitements à la rencontre du tag de début\n\n\nsetPageContext(Context)\nSauvegarde du contexte de la page\n\n\nLa méthode doStartTag() est appelée lors de la rencontre du tag d&amp;#39;ouverture et contient les traitements à effectuer dans ce cas. Elle doit renvoyer un entier prédéfini qui indique comment va se poursuivre le traitement du tag :\n\nEVAL_BODY_INCLUDE : poursuite du traitement avec évaluation du corps du tag\nSKIP_BODY : poursuite du traitement sans évaluation du corps du tag\n\nLa méthode doEndTag() est appelée lors de la rencontre du tag de fermeture et contient les traitements à effectuer dans ce cas. Elle doit renvoyer un entier prédéfini qui indique comment va se poursuivre le traitement de la JSP.\n\nEVAL_PAGE : poursuite du traitement de la JSP\nSKIP_PAGE : ne pas poursuivre le traitement du reste de la JSP\n\n73.7.4. L&amp;#39;accès aux variables implicites de la JSP\nLes tags ont accès aux variables implicites de la JSP dans laquelle ils s&amp;#39;exécutent grâce à un objet de type PageContext. La variable pageContext est un objet de ce type qui est initialisé juste après l&amp;#39;instanciation du handler.\nLe classe PageContext est une classe abstraite dont l&amp;#39;implémentation des spécifications doit fournir une adaptation concrète.\nCette classe définit plusieurs méthodes :\n\n\nMéthodes\nRôles\n\n\nJspWriter getOut()\nPermet un accès à la variable out de la JSP\n\n\nException getException()\nPermet un accès à la variable exception de la JSP\n\n\nObject getPage()\nPermet un accès à la variable page de la JSP\n\n\nServletRequest getRequest()\nPermet un accès à la variable request de la JSP\n\n\nServletResponse getResponse()\nPermet un accès à la variable response de la JSP\n\n\nServletConfig getServletConfig()\nPermet un accès à l&amp;#39;instance de la variable de type ServletConfig\n\n\nServletContext getServletContext()\nPermet un accès à l&amp;#39;instance de la variable de type ServletContext\n\n\nHttpSession getSession()\nPermet un accès à la session\n\n\nObject getAttribute(String)\nRenvoie l&amp;#39;objet associé au nom fourni en paramètre dans la portée de la page\n\n\nsetAttribute(String, Object)\nPermet de placer dans la portée de la page un objet dont le nom est fourni en paramètre\n\n\n73.7.5. Les deux types de handlers\nIl existe deux types de handlers :\n\nles handlers de tags sans corps\nles handlers de tags avec corps\n\n73.7.5.1. Les handlers de tags sans corps\nPour définir le handler d&amp;#39;un tag personnalisé sans corps, il suffit de définir une classe qui implémente l&amp;#39;interface Tag ou qui héritent de la classe TagSupport. Il faut définir ou redéfinir les méthodes doStartTag() et endStartTag().\nLa méthode doStartTag() est appelée à la rencontre du début du tag. Cette méthode doit contenir le code à exécuter dans ce cas et renvoyer la constante SKIP_BODY puisque le tag ne contient pas de corps.\n\n73.7.5.2. Les handlers de tags avec corps\nLe cycle de vie d&amp;#39;un tel tag inclut le traitement du corps si la méthode doStartTag() renvoie la valeur EVAL_BODY_TAG.\nDans ce cas, les opérations suivantes sont réalisées :\n\nla méthode setBodyContent() est appelée\nle contenu du corps est traité\nla méthode doAfterBody() est appelée. Si elle renvoie la valeur EVAL_BODY_TAG, le contenu du corps est de nouveau traité\n\n73.7.6. Les paramètres d&amp;#39;un tag\nUn tag peut avoir un ou plusieurs paramètres qui seront transmis à la classe par des attributs. Pour chacun des paramètres, il faut définir des getters et des setters en respectant les règles et conventions des Java beans. Il est impératif de définir un champ, un setter et éventuellement un accesseur pour chaque attribut.\nLa JSP utilisera le setter pour fournir à l&amp;#39;objet la valeur de l&amp;#39;attribut.\nAu moment de la génération de la servlet par le moteur de JSP, celui-ci vérifie par introspection la présence d&amp;#39;un setter pour l&amp;#39;attribut concerné.\n\n73.7.7. La définition du fichier de description de la bibliothèque de tags (TLD)\nLe fichier de description de la bibliothèque de tags (tag library descriptor file) est un fichier au format XML qui décrit une bibliothèque de tags. Les informations qu&amp;#39;il contient concernent la bibliothèque de tags elle-même et aussi chacun des tags qui la compose.\nCe fichier est utilisé par le conteneur Web lors de la compilation de la JSP pour remplacer le tag par du code Java.\nCe fichier doit toujours avoir pour extension .tld. Il doit être placé dans le répertoire web-inf du fichier war ou dans un de ses sous-répertoires. Le plus pratique est de tous les regrouper dans un répertoire nommé par exemple tags ou tld.\nComme tout bon fichier XML, le fichier TLD commence par un prologue :\n\n\nExemple : \n\n\n\n\r\n\n\n\n\nLa DTD précisée doit correspondre à la version de l&amp;#39;API JSP utilisée. L&amp;#39;exemple précédent concernait la version 1.1, l&amp;#39;exemple suivant concerne la version 1.2\n\n\nExemple : \n\n\n\n\r\n\n\n\n\nLe tag racine du document XML est le tag .\nCe tag peut contenir plusieurs tags qui définissent les caractéristiques générales de la bibliothèque. Les tags suivants  sont définis dans les spécifications 1.2 :\n\n\nprénom\nRôle\n\n\ntlib-version\nversion de la bibliothèque\n\n\njsp-version\nversion des spécifications JSP utilisées\n\n\nshort-name\nnom court de la bibliothèque (optionnel)\n\n\nuri\nURI qui identifie de façon unique la bibliothèque : cette URI n&amp;#39;a pas besoin d&amp;#39;exister réellement\n\n\ndisplay-name\nnom de la bibliothèque\n\n\nsmall-icon\n(optionnel)\n\n\nlarge-icon\n(optionnel)\n\n\nla description\ndescription de la bibliothèque\n\n\nvalidateur\n(optionnel)\n\n\nauditeur\n(optionnel)\n\n\nétiquette\nil en faut autant que de tags qui composent la bibliothèque\n\n\nPour chaque tag personnalisé défini dans la bibliothèque, il faut un tag . Ce tag permet de définir les caractéristiques d&amp;#39;un tag de la bibliothèque.\nCe tag peut contenir les tags suivants :\n\n\nprénom\nRôle\n\n\nprénom\nnom du tag : il doit être unique dans la bibliothèque\n\n\ntag-class\nnom entièrement qualifié de la classe qui contient le handler du tag\n\n\ntei-class\nnom qualifié d&amp;#39;une classe fille de la classe javax.servlet.jsp.tagext.TagExtraInfo (optionnel)\n\n\nbody-content\ntype du corps du tag. Les valeurs possibles sont : \n\nJSP : le corps du tag contient des tags JSP qui doivent être interprétés\ntagdependent : l&amp;#39;interprétation du contenu du corps est faite par le tag\nempty : le corps doit obligatoirement être vide\n\n      La valeur par défaut est JSP\n\n\ndisplay-name\nnom court du tag\n\n\nsmall-icon\nnom relatif à la bibliothèque d&amp;#39;un fichier gif ou jpeg contenant une icône. (optionnel)\n\n\nlarge-icon\nnom relatif à la bibliothèque d&amp;#39;un fichier gif ou jpeg contenant une icône. (optionnel)\n\n\nla description\ndescription du tag (optionnel)\n\n\nvariable\n(optionnel)\n\n\nattribut\nil en faut autant que d&amp;#39;attributs possédés par le tag (optionnel)\n\n\nExemple\nun exemple de l&amp;#39;utilisation du tag (optionnel)\n\n\nPour chaque attribut du tag personnalisé, il faut utiliser un tag . Ce tag décrit un attribut d&amp;#39;un tag et peut contenir les tags suivants :\n\n\nprénom\nLa description\n\n\nprénom\nnom de l&amp;#39;attribut\n\n\nChamps obligatoires\nbooléen qui indique la présence obligatoire de l&amp;#39;attribut\n\n\nrtexprvalue\nbooléen qui indique si la page doit évaluer l&amp;#39;expression lors de l&amp;#39;exécution. Il faut donc mettre la valeur true si la valeur de l&amp;#39;attribut est fournie avec un tag JSP d&amp;#39;expression \n\n\nLe tag  contient les tags suivants :\n\n\nprénom\nRôle\n\n\nname-given\n \n\n\nname-from-attribut\n \n\n\nvariable-class\nnom de la classe de la valeur de l&amp;#39;attribut. Par défaut java.lang.String\n\n\ndéclarer\npar défaut : True\n\n\nportée\nvisibilité de l&amp;#39;attribut. Les valeurs possibles sont :\n      Par défaut : NESTED (optionnel)\n\n\nla description\ndescription de l&amp;#39;attribut (optionnel)\n\n\nChaque bibliothèque doit être définie avec un fichier de description au format xml possédant une extension .tld. Le contenu de ce fichier doit pouvoir être validé avec une DTD fournie par Sun.\nCe fichier est habituellement stocké dans le répertoire web-inf de l&amp;#39;application web ou un de ses sous-répertoires.\n\n\nExemple : \n\n\n\n\r\n  \r\n\r\n  1,0\r\n  1.1\r\n  testtaglib\r\n  http://perso.jmd.test.taglib\r\n  Bibliotheque de test des taglibs\r\n\r\n  \r\n  testtaglib1\r\n  perso.jmd.test.taglib.TestTaglib1\r\n  Tag qui affiche bonjour\r\n  \r\n\n\n\n\n73.7.8. L&amp;#39;utilisation d&amp;#39;une bibliothèque de tags\nPour utiliser une bibliothèque de tags, il y a des actions à réaliser au niveau du code source de la JSP et au niveau de conteneur d&amp;#39;applications web pour la déployer.\n\n73.7.8.1. L&amp;#39;utilisation dans le code source d&amp;#39;une JSP\nChaque bibliothèque utilisée dans une JSP doit être déclarée avant son utilisation en utilisant la directive taglib. Le plus simple est d&amp;#39;effectuer ces déclarations tout au début du code de la JSP.\nCette directive possède deux attributs :\nDans ce dernier cas, il faut ajouter pour chaque bibliothèque un tag  dans le fichier de description de déploiement de l&amp;#39;application/WEB-INF/web.xml\n\n\nExemple : \n\n\n\n  \r\n    /maTagLibTest\r\n    /WEB-INF/tld/testtaglib.tld\r\n  \n\n\n\nL&amp;#39;appel d&amp;#39;un tag se fait en utilisant un tag dont le nom a la forme suivante : prefix:tag\nLe préfix est celui défini dans la directive taglib.\n\n\nExemple : un tag sans corps\n\n\n\n\n\n\n\n\n\n\nExemple : un tag avec corps\n\n\n\n\r\n   \r\n   \r\n   \r\n   ...\r\n\n\n\n\nLe corps peut contenir du code HTML, du code JSP ou d&amp;#39;autre tag personnalisé.\nLe tag peut avoir des attributs si ceux-ci ont été définis. La syntaxe pour les utiliser respecte la norme XML.\n\n\nExemple : un tag avec un paramètre constant\n\n\n\n\n\n\n\nLa valeur de cet attribut peut être une donnée dynamiquement évaluée lors de l&amp;#39;exécution :\n\n\nExemple : un tag avec un paramètre\n\n\n\n&lt;prefix:tag attribut=&quot;\"/>\n\n\n\n73.7.8.2. Le déploiement d&amp;#39;une bibliothèque\nAu moment de la compilation de la JSP en servlet, le conteneur transforme chaque tag en un appel à un objet du type de la classe associée au tag.\nIl y a deux types d&amp;#39;éléments auxquels le conteneur d&amp;#39;applications web doit pouvoir accéder :\n\nle fichier de description de la bibliothèque\nles classes des handlers de tags\n\nLes classes des handlers de tags peuvent être stockées à deux endroits dans le fichier war selon leur format :\n\ns&amp;#39;ils sont packagés sous forme de fichiers jar alors ils doivent être placés dans le répertoire /WEB-INF/lib\ns&amp;#39;ils ne sont pas packagés alors ils doivent être placés dans le répertoire /WEB-INF/classes\n\n73.7.9. Le déploiement et les tests dans Tomcat\nTomcat étant l&amp;#39;implémentation de référence pour les technologies servlets et JSP, il est pratique d&amp;#39;effectuer des tests avec cet outil.\nLa version de Tomcat utilisée dans cette section est la 3.2.1.\nLe déploiement se fait en deux étapes :\n\nla copie des fichiers\nl&amp;#39;enregistrement de la bibliothèque\n\nLes classes compilées doivent être copiées dans le répertoire WEB-INF/classes de la webapp si elles ne sont pas packagées dans une archive jar, sinon le ou les fichiers .jar doivent être copiés dans le répertoire WEB-INF/lib.\nLe fichier .tld doit être copié dans le répertoire WEB-INF ou dans un de ses sous-répertoires.\nIl faut ensuite enregistrer la bibliothèque dans le fichier de configuration web.xml contenu dans le répertoire web-inf du répertoire de l&amp;#39;application web.\nIl faut ajouter dans ce fichier, un tag  pour chaque bibliothèque utilisée par l&amp;#39;application web. Ce tag contient deux informations :\n\nl&amp;#39;URI de la bibliothèque contenue dans le tag taglib-uri. Cette URI doit être identique à celle définie dans le fichier de description de la bibliothèque\nla localisation du fichier de description\n\n\n\n\nExemple : \n\n\n\n\r\n\r\n\r\n  \r\n    index.htm\r\n    index.jsp\r\n  \r\n\t\r\n  \r\n    /maTagLibTest\r\n    /WEB-INF/tld/testtaglib.tld\r\n  \r\n\n\n\n\nIl ne reste plus qu&amp;#39;à lancer Tomcat si ce n&amp;#39;est pas encore fait et à saisir l&amp;#39;url de la page contenant l&amp;#39;appel au tag personnalisé.\n\n73.7.10. Les bibliothèques de tags existantes\nIl existe de nombreuses bibliothèques de tags libres ou commerciales disponibles sur le marché. Cette section va tenter de présenter quelques-unes des plus connues et des plus utilisées du monde libre. Cette liste n&amp;#39;est pas exhaustive.\n\n73.7.10.1. Struts\nStruts est un framework pour la réalisation d&amp;#39;applications web reposant sur le modèle MVC 2.\nPour la partie vue, Struts utilise les JSP et propose en plus plusieurs bibliothèques de tags pour faciliter le développement de cette partie présentation. Struts possède quatre grandes bibliothèques :\n\nformulaire HMTL\nmodèles (templates)\nJavabeans (bean)\ntraitements logiques (logic)\n\nLe site web de Struts se trouve à l&amp;#39;url : http://struts.apache.org/index.html.\nCe framework est détaillée dans le chapitre «Struts».\n\n73.7.10.2. JSP Standard Tag Library (JSTL)\nJSP Standard Tag Library (JSTL) est une spécification issue du travail du JCP sous la JSR numéro 52. Le chapitre «JSTL (Java server page Standard Tag Library)» fournit plus de détails sur cette spécification.\n\n73.7.10.3. Apache Taglibs (Jakarta Taglibs)\nApache Taglibs est un ensemble de taglibs : la plupart a été déclarée deprecated notamment à cause de la standardisation de la JSTL.\nIl propose en particulier, la bibliothèque Apache Standard Tag Library qui est une implémentation des versions 1.0, 1.1 et 1.2 de la spécification JSTL.\nLe site officiel est à l&amp;#39;url : http://tomcat.apache.org/taglibs/\n\nClick to rate this post!\r\n                                   \r\n                               [Total: 0  Average: 0]","paragraphs":["Niveau:\n  Supérieur","Les pages de serveur Java (JSP) sont une technologie Java permettant de générer des pages Web dynamiques.\nLa technologie JSP est utilisée pour séparer la présentation en code HTML et les processus écrits en Java en tant que JavaBeans ou servlets. Cela est d&#39;autant plus facile que les JSP définissent une syntaxe particulière pour l&#39;appel d&#39;un bean et l&#39;insertion dynamique du résultat de son traitement dans la page HTML.\nLes informations de ce chapitre concernent les spécifications JSP 1.0 et ultérieures.\nCe chapitre contient plusieurs sections:\n  \n  \nLes JSP vous permettent d&#39;introduire du code Java dans des balises prédéfinies d&#39;une page HTML. La technologie JSP allie la puissance Java côté serveur à la facilité de disposition HTML du côté client.\nLa page officielle de cette technologie est à l&#39;adresse suivante: http://www.oracle.com/technetwork/java/javaee/jsp/index.html.\nUn JSP est généralement composé de:","balises de données et HTML\nBalises JSP\nscriptlets (code Java intégré dans le JSP)","Les fichiers JSP ont l&#39;extension .jsp par convention.\nConcrètement, les JSP sont basés sur des servlets. Lors du premier appel de la page JSP, le moteur JSP génère et compile automatiquement le servlet qui permet la génération de la page Web. Le code HTML est entièrement inclus dans le servlet. Le code Java est inséré dans le servlet.\nLe servlet généré est compilé, enregistré et exécuté. Les appels suivants depuis le JSP sont beaucoup plus rapides car la servlet, conservée par le serveur, est exécutée directement.\nIl existe plusieurs façons de combiner les technologies JSP, les EJB et les servlets pour développer des applications Web.\nÉtant donné que le code de servlet est généré de manière dynamique, les JSP sont relativement difficiles à déboguer.\nCette approche présente toutefois plusieurs avantages:","l&#39;utilisation de Java par le JSP permet l&#39;indépendance de la plate-forme\nexécution mais aussi le serveur Web utilisé.\nséparation des traitements et présentation: la page Web peut être\nécrit par un concepteur et les balises Java peuvent être ajoutés plus tard par le\ndéveloppeur. Les traitements peuvent être faits avec des composants réutilisables\n(Haricots Java).\nLes JSP sont basés sur des servlets: tout ce qui est fait par un servlet\npour la génération de pages dynamiques peut être fait avec un JSP.","Il existe plusieurs versions des spécifications JSP:","Version","0,91\nPremière sortie","1,0","Juin 1999: première version finale\n    lié à l&#39;API servlet 2.1","1.1\nDécembre 1999lié à l&#39;API servlet 2.2","1.2\nOctobre 2000, JSR 053lié à l&#39;API servlet 2.3","2.0\nNovembre 2003, JSR 152lié à l&#39;API servlet 2.4","2.1\nMai 2006, JSR 245lié à l&#39;API servlet 2.5","2.2\nDécembre 2009, version de maintenance de la JSR 245lié à l&#39;API servlet 3.0","2.3\nJuin 2013, version de maintenance de la JSR 245lié à l&#39;API servlet 3.1","73.1.1. Le choix entre JSP et Servlets\nLes servlets et les JSP ont beaucoup de choses en commun puisqu&#39;un JSP est finalement converti en un servlet. Le choix d&#39;utiliser l&#39;une ou l&#39;autre de ces technologies ou les deux doit être fait pour tirer le meilleur parti de leurs avantages.\nDans une servlet, les traitements et la présentation sont regroupés. L’aspect présentation est dans ce cas difficile à développer et à maintenir en raison de l’utilisation répétée de méthodes pour insérer le code HTML dans le flux de sortie. De plus, une simple modification du code HTML nécessite la recompilation du servlet. Avec un JSP, la séparation des traitements et de la présentation rend cela très simple et automatique.\nIl est préférable d’utiliser les JSP pour générer des pages Web dynamiques.\nL&#39;utilisation des servlets est obligatoire si elles doivent communiquer directement avec une applet ou une application et non plus avec un serveur Web.","73.1.2. JSP et technologies concurrentes\nIl existe plusieurs technologies dont le but est similaire aux JSP, notamment ASP, PHP et ASP.Net. Chacune de ces technologies présente des avantages et des inconvénients, dont voici une liste non exhaustive.","JSP","PHP","ASPIC","ASP.Net","la langue","Java","PHP","VBScript ou JScript","Toutes les langues supportées par .Net (C #, VB.Net, Delphi, &#8230;)","mode d&#39;exécution","Compilé en pseudo-code (bytecode)","Interprète","Interprète","Compilé en pseudo-code (MSIL)","Principaux avantages\nReposez-vous sur la plate-forme Java dont il hérite des avantages\nOpen source \n      Nombreuses bibliothèques et sources d&#39;applications gratuites disponibles\n      Facile à mettre en œuvre\nFacile à mettre en œuvre\nReposez-vous sur la plate-forme .Net dont il hérite des avantages \n      Wysiwyg et les événements\n      Code derrière pour la séparation affichage / traitement","principaux inconvénients\nDébogage plutôt fastidieux\n      Beaucoup de code à écrire\nDébogage plutôt fastidieux\n      Beaucoup de code à écrire \n      support partiel de la programmation orientée objet en attente de la version 5\nDébogage plutôt fastidieux\n      Beaucoup de code à écrire \n      Fonctionne principalement sur les plateformes Windows\n      Pas de POO, objets métier encapsulés dans des objets COM lourds à implémenter\nFonctionne principalement sur les plates-formes Windows. (Voir le projet Mono pour le support d&#39;autres plateformes)","Dans un premier temps, Sun a fourni un kit de développement pour les JSP: le kit de développement Web du serveur Java (JSWDK). Ensuite, Sun a confié au projet Apache le développement de l’implémentation de référence du moteur JSP: le projet Tomcat. Depuis la version 2.2, l&#39;implémentation de référence est le projet Glassfish.\nSelon la version de l&#39;API utilisée, vous devez choisir un produit différent. Le tableau ci-dessous récapitule les implémentations de référence basées sur la version de l&#39;API implémentée.","Produit","Version","Version de l&#39;API Servlet implémentée","Version de l&#39;API JSP implémentée","JSWDK","1.0.1","2.1","1,0","Matou","3.2","2.2","1.1","Matou","4.0","2.3","1.2","Matou","5.0","2.4","2.0","Matou","6.0","2,5","2.1","Glassfish","3.0","3.0","2.2","Glassfish","4.0","3.1","2.3","Il est également possible d&#39;utiliser tout conteneur Web compatible avec les spécifications de la plate-forme J2EE / Java EE. Une liste non exhaustive est fournie dans le chapitre &quot;Outils gratuits et commerciaux&quot;.","73.2.1. Le kit de développement Web JavaServer (JSWDK) sous Windows\nLe fichier JSWDK est proposé sous forme de fichier zip nommé jswdk_1_0_1-win.zip.\nPour l&#39;installer, décompressez simplement l&#39;archive dans un répertoire du système. Le serveur commence à exécuter le fichier startserver.bat.","Pour lancer le serveur:","C:  jswdk-1.0.1&gt; startserver.bat","Utiliser classpath :.  Des classes;.  Webserver.jar ;.  Lib  jakarta.jar ;.  Lib  servlet.jar;.\n Lib  jsp.jar ;.  Lib  jspengine.jar ;.  Exemples  WEB-INF  jsp  beans ;.  Pages Web  WEB-INF\n Servlets ;.  Webpages  WEB-INF  jsp  beans ;.  Lib  xml.jar ;.  Lib  moo.jar  lib  tools.ja\nDr. C:  jdk1.3  lib  tools.jar;\nC:  jswdk-1.0.1&gt;","Le serveur s&#39;exécute dans une console en arrière-plan. Cette console permet de voir les messages envoyés par le serveur.","Exemple: au démarrage","JSWDK WebServer Version 1.0.1\nConfiguration chargée à partir de: fichier: C:  jswdk-1.0.1  webserver.xml\nnoeud final créé: localhost / 127.0.0.1: 8080","Si la JSP contient une erreur, le serveur envoie une page d&#39;erreur:","Une exception est levée et est affichée dans la fenêtre où le serveur est en cours d&#39;exécution:","Exemple:","- Commentaires de la page JSP -\n^\n1 erreur\nà l&#39;adresse com.sun.jsp.compiler.Main.compile (Main.java:347)\nà l&#39;adresse com.sun.jsp.runtime.JspLoader.loadJSP (JspLoader.java:135)\nà l&#39;adresse com.sun.jsp.runtime.JspServlet $ JspServletWrapper.loadIfNecessary (JspS\nervlet.java:77)\nà l&#39;adresse com.sun.jsp.runtime.JspServlet $ JspServletWrapper.service (JspServlet.j\nava: 87)\nà l&#39;adresse com.sun.jsp.runtime.JspServlet.serviceJspFile (JspServlet.java:218)\nà l&#39;adresse com.sun.jsp.runtime.JspServlet.service (JspServlet.java:294)\nà l&#39;adresse javax.servlet.http.HttpServlet.service (HttpServlet.java:840)\nà l&#39;adresse com.sun.web.core.ServletWrapper.handleRequest (ServletWrapper.java:155\n)\nà l&#39;adresse com.sun.web.core.Context.handleRequest (Context.java:414)\nà l&#39;adresse com.sun.web.server.ConnectionHandler.run (ConnectionHandler.java:139)\nPROBLEME DE FIL SUIVANT: java.io.IOException: socket fermé\njava.io.IOException: socket fermé\nsur java.net.PlainSocketImpl.getInputStream (Source inconnue)\nat java.net.Socket $ 1.run (Source inconnue)\nat java.security.AccessController.doPrivileged (Native Method)\nat java.net.Socket.getInputStream (Source inconnue)\nà l&#39;adresse com.sun.web.server.ConnectionHandler.run (ConnectionHandler.java:161)","Le répertoire de travail contient le code et le bytecode des servlets générés à partir des JSP.\nPour arrêter le serveur, exécutez simplement le script stopserver.bat.\nLorsque le serveur s&#39;arrête, le répertoire de travail contenant les servlets générés à partir des fichiers JSP est supprimé.","73.2.2. Le serveur Tomcat\nLa mise en oeuvre et l’utilisation de Tomcat sont détaillées dans une section du chapitre. &quot;Servlets&quot;.","Une grande partie du contenu d&#39;une JSP est constituée de code HTML. De plus, la méthode la plus simple pour écrire un fichier JSP consiste à écrire le fichier HTML avec un outil dédié, puis à ajouter les balises JSP pour les pièces dynamiques.\nLa seule restriction sur HTML est l&#39;utilisation de fragments &quot;  Dans ce cas, le moyen le plus simple consiste à utiliser les caractères spéciaux HTML &amp; lt; et &amp; gt; sinon, l&#39;analyseur de moteur JSP considère qu&#39;il s&#39;agit de balises JSP et renvoie une erreur.","Exemple:","Tester","Plusieurs balises JSP commencent par &lt;% et se terminent par% &amp; gt;","Il existe trois types de tags:","balises directive: elles permettent de contrôler la structure du servlet\ngénéré\nbalises de script: elles permettent d&#39;insérer du code Java dans le servlet\nbalises d&#39;action: elles facilitent l&#39;utilisation de composants","Avertissement: Les noms de balises sont sensibles à la casse.","73.4.1. Les balises directives \nLes directives vous permettent de spécifier des informations globales sur la page JSP. Les spécifications JSP définissent trois directives:","page: Définir les options de configuration\ninclude: permet d&#39;inclure des fichiers statiques dans le fichier JSP avant la génération.\nde la servlet\ntaglib: permet de définir des tags personnalisés","Leur syntaxe est la suivante:\n&lt;% @ Directif attribut= &quot;valeur&quot;&#8230;%&gt;","73.4.1.1. La directive de page\nCette directive doit être utilisée dans toutes les pages JSP: elle vous permet de définir des options s’appliquant à l’ensemble du JSP.\nIl peut être placé n&#39;importe où dans la source mais il est préférable de le mettre au début du fichier, même avant la balise. . Il peut être utilisé plusieurs fois dans la même page, mais il ne doit définir la valeur d&#39;une option qu&#39;une seule fois, à l&#39;exception de l&#39;option d&#39;importation.\nLes options définies par cette directive sont de la forme option = valeur.","Option","Valeur","Valeur par défaut","Autre valeur possible","autoFlush","Chaîne","&quot;Vrai&quot;","&quot;Faux&quot;","tampon","Chaîne","&quot;8kb&quot;","&quot;Aucun&quot; ou &quot;nnnkb&quot; (nnn indiquant la valeur)","contentType","Une chaîne contenant le type MIME","errorPage","Une chaîne contenant une URL","s&#39;étend","Une classe","importation","Une classe ou un package. *","Info","Chaîne","isErrorPage","Chaîne","&quot;Faux&quot;","&quot;Vrai&quot;","isThreadSafe","Chaîne","&quot;Vrai&quot;","&quot;Faux&quot;","la langue","Chaîne","&quot;Java&quot;","session","Chaîne","&quot;Vrai&quot;","&quot;Faux&quot;","Exemple:","Les options sont:","autoFlush = &quot;vrai| Faux &quot;\nCette option spécifie si le flux de sortie du servlet doit être vidé lorsque\nle tampon est plein. Si la valeur est false, une exception est levée dès que\nle tampon est plein. Nous ne pouvons pas définir false si la valeur du tampon est\naucun.","tampon = &quot;aucun |8kb|Taillekb &quot;\nCette option permet de spécifier la taille de la mémoire tampon des données générées contenues\npar l&#39;objet de type JspWriter.","contentType = &quot;mimeType [;charset=[;charset=[;charset=[;charset=jeu de caractères ]&quot;\n| &quot;text / html; jeu de caractères = ISO-8859-1&quot; \nCette option spécifie le type MIME des données générées.\nCette option est équivalente à","errorPage =&quot;RelativeURL&quot;\nCette option vous permet de spécifier le JSP appelé en cas d’exception.\nlevage\nSi l&#39;URL ne commence pas par &amp; # 39; / &amp; # 39 ;, alors l&#39;URL est relative au répertoire\nserveur Web principal sinon il est relatif au répertoire qui contient\nle JSP","s&#39;étend= &quot;Package.class&quot;\nCette option vous permet de spécifier la classe qui sera la super classe de l&#39;objet\nJava créé à partir du JSP.","import = &quot; paquet. * , &#8230; &quot;\nCette option importe les classes contenues dans les packages utilisés.\ndans le code du JSP. Cette option est utilisée comme instruction d&#39;importation\ndans un code source Java. \nChaque classe ou package est séparé par une virgule.\nCette option peut être présente dans plusieurs directives de page.","info = &quot;text&quot;\nCette option vous permet de spécifier une petite description du fichier JSP. Le texte fourni\nsera renvoyé par la méthode getServletInfo () du servlet généré.","isErrorPage = &quot;true |faux&quot;\nCette option spécifie si le JSP génère une page d&#39;erreur. La valeur\ntrue permet à l&#39;objet Exception d&#39;être utilisé dans le JSP","isThreadSafe = &quot;vrai| Faux &quot;\nCette option indique si le servlet généré sera multithread: dans ce cas,\nla même instance du servlet peut gérer plusieurs demandes simultanément.\nEn retour, il doit gérer correctement les accès concurrents aux ressources.\nLa valeur false amène le servlet généré à implémenter l&#39;interface SingleThreadModel.","language = &quot;java&quot;\nCette option définit le langage utilisé pour écrire du code dans le JSP. le\nla seule valeur actuellement autorisée est &quot;java&quot;.","session = &quot;vrai| faux&quot;\nCette option spécifie si le JSP est inclus dans une session ou si\nnon. La valeur par défaut (true) permet l&#39;utilisation d&#39;un objet de session de\nType HttpSession qui gère les informations dans une session.","73.4.1.2. La directive include\nCette directive vous permet d&#39;inclure un fichier dans le code source JSP. Le fichier inclus peut être un extrait de code JSP, HTML ou Java. Le fichier est inclus dans le JSP avant d&#39;être interprété par le moteur JSP.\nCette balise est particulièrement utile pour insérer un élément multi-page commun tel qu&#39;un en-tête ou un pied de page.\nSi le fichier inclus est un fichier HTML, il ne doit pas contenir de balise. , ,  ou  ce qui dupliquerait ceux présents dans le fichier JSP. Cela nécessite l&#39;écriture de fichiers HTML particuliers uniquement pour être inclus dans les JSP: ils ne peuvent pas être utilisés seuls.\nLa syntaxe est la suivante:","Si le chemin commence par &amp; # 39; / # 39 ;, le chemin est relatif au contexte de l&#39;application, sinon il est relatif au fichier JSP.","Exemple:","hello.htm:","BONJOUR","Exemple: Test1.jsp","Test de page JSP","Test d&#39;inclusion d&#39;un fichier dans le JSP","fin","Pour tester cette JSP avec le JSWDK, placez simplement ces deux fichiers dans le répertoire jswdk-1.0.1  examples  jsp  test.\nPour afficher le fichier JSP, entrez l&#39;URL http: // localhost: 8080 / examples / jsp / test / Test1.jsp dans un navigateur.","Attention: une modification du fichier inclus ne provoque pas de régénération\net une compilation du servlet correspondant au JSP. Pour insérer un\nfichier dynamiquement lors de l&#39;exécution du servlet, il est nécessaire d&#39;utiliser la balise\n      .","73.4.1.3. La directive taglib\nCette directive déclare l&#39;utilisation d&#39;une bibliothèque de balises personnalisée. L&#39;utilisation de cette directive est détaillée dans la section consacrée aux bibliothèques de balises personnalisées.","73.4.2. Tags de script\nCes balises sont utilisées pour insérer du code Java qui sera inclus dans le servlet généré à partir du JSP. Il existe trois balises pour l&#39;insertion de code Java:","la balise de déclaration: le code Java est inclus dans le corps du servlet\ngénéré. Ce code peut être la déclaration de variables d&#39;instance ou de classe ou la déclaration de méthodes.\nla balise expression: évalue une expression et insère le résultat dans la forme\nchaîne dans la page Web générée.\nla balise scriptlets: Par défaut, le code Java est inclus dans la méthode service () du servlet.","Il est possible d&#39;utiliser dans ces balises plusieurs objets définis par les JSP.","73.4.2.1. La balise de déclaration \nCette balise est utilisée pour déclarer des variables ou des méthodes pouvant être utilisées dans le JSP. Il ne génère aucun caractère dans le fichier HTML de sortie.\nLa syntaxe est la suivante:","Exemple:","Les variables déclarées de cette manière peuvent être utilisées dans les balises d&#39;expression et de scriptlet.\nIl est possible de déclarer plusieurs variables dans la même balise en les séparant avec &amp; # 39 ;; &amp; # 39; personnages.\nCette balise vous permet également d’insérer des méthodes dans le corps du servlet.","Exemple:","Tester","&lt;%!\nint minimum (int val1, int val2) \nsi (val1 < val2) return val1;\n   else return val2;\n \n%>","Le plus petit des 5 et 3 est","73.4.2.2. La balise d&#39;expression \nLe moteur JSP remplace cette balise par le résultat de l&#39;évaluation de l&#39;expression présente dans la balise.\nCe résultat est toujours converti en chaîne. Cette balise est un raccourci pour éviter d’utiliser la méthode println () lors de l’insertion de données dynamiques dans le fichier HTML.\nLa syntaxe est la suivante:","Le signe &amp; # 39; = &amp; # 39; doit être collé sous le signe%.","Attention: ne mettez pas &amp; # 39; &amp; # 39; &amp; # 39; &amp; # 39; à la fin de l&#39;expression.","Exemple: insertion de la date dans la page HTML","Test de page JSP","Date d&#39;aujourd&#39;hui:","Résultat:","Date du jour: jeu 15 fév 11:15:24 CET 2001","L&#39;expression est évaluée et convertie en une chaîne avec un appel à la méthode toString (). Cette chaîne est insérée dans la page HTML à la place de la balise. Il est possible que le résultat corresponde à une partie ou à la totalité d&#39;une balise HTML ou même à une JSP","Exemple:","Test de page JSP","&lt;% = &quot;&quot;%&gt; Bonjour &lt;% =&quot;&quot;%&gt;","Résultat: code HTML généré","Test de page JSP","Bonjour","73.4.2.3. Les variables implicites\nLes spécifications JSP définissent plusieurs objets utilisables dans le code, les plus utiles étant:","Objet","Classe","Rôle","en dehors","javax.servlet.jsp.JspWriter","Flux de sortie de la page HTML générée","demande","javax.servlet.http.HttpServletRequest","Contient les informations de la requête","réponse","javax.servlet.http.HttpServletResponse","Contient l&#39;information de réponse","session","javax.servlet.http.HttpSession","Gère la session","73.4.2.4. La balise scriptlets \nCette balise contient du code Java nommé scriptlet.\nLa syntaxe est la suivante:","Exemple:","Date d&#39;aujourd&#39;hui:","Par défaut, le code inclus dans la balise est inséré dans la méthode service () du servlet généré à partir du JSP.\nCette balise ne peut contenir autre chose que du code Java: elle ne peut pas contenir par exemple des balises HTML ou JSP. Pour ce faire, vous devez fermer la balise de scriptlet, placer la balise HTML ou JSP, puis redémarrer une balise de scriptlet pour continuer le code.","Exemple:","Test de page JSP","&lt;% pour (int i = 0; i","Résultat: la page HTML générée","Test de page JSP","0 \n1 \n2 \n3 \n4 \n5 \n6 \n7 \n8 \n9","73.4.3. Tags de commentaire\nIl existe deux types de commentaires avec les JSP:","commentaires visibles dans le code HTML\ncommentaires invisibles dans le code HTML","73.4.3.1. Commentaires HTML \nCes commentaires sont ceux définis par le format HTML. Ils sont entièrement reproduits dans le fichier HTML généré. Il est possible d&#39;insérer dans cette balise une balise JSP de type expression à exécuter.\nLa syntaxe est la suivante:\n&lt;! &#8211; commentaires[[[[ ]-&gt;","Exemple:","Test de page JSP","&lt;! - Cette page a été générée sur  -&gt;\nBonjour","Résultat:","Test de page JSP","Bonjour","Le contenu d&#39;une expression incluse dans les commentaires est dynamique: sa valeur peut changer à chaque génération de la page en fonction de son contenu.","73.4.3.2. Commentaires cachés \nLes commentaires masqués sont utilisés pour documenter la page JSP. Leur contenu est ignoré par le moteur JSP et n&#39;est donc pas reproduit dans la page HTML générée.\nLa syntaxe est la suivante:","Exemple:","Test de page JSP","Bonjour","Résultat:","Test de page JSP","Bonjour","Cette balise peut être utile pour éviter l&#39;exécution de code pendant la phase de débogage.","73.4.4. Les balises d&#39;action\nLes étiquettes d&#39;action permettent d&#39;effectuer des traitements couramment utilisés.","73.4.4.1. Le tag \nLe tag  vous permet de localiser une instance ou d&#39;instancier un bean à utiliser dans le fichier JSP.\nL&#39;utilisation d&#39;un bean dans une JSP est très pratique car elle peut encapsuler des processus complexes et être réutilisée par d&#39;autres JSP ou composants. Par exemple, le bean peut fournir un accès à une base de données. L&#39;utilisation de beans simplifie les processus inclus dans le JSP.\nLors de l&#39;instanciation d&#39;un bean, nous spécifions la portée du bean. Si le bean demandé est déjà instancié pour la portée spécifiée, aucune nouvelle instance du bean n&#39;est créée, mais sa référence est simplement renvoyée: la balise  n&#39;instancie pas nécessairement un objet.\nCette balise ne permet pas de traiter directement EJB.\nLa syntaxe est la suivante:\n&lt;Jsp: useBeanid = &quot;beanInstanceName &quot;scope = &quot;page| Demande | session | application &quot;\nbeanName = &quot; &lt;% = expression %&gt; &quot;type =&quot;package.class&quot;\n/&gt; \nL&#39;attribut id est utilisé pour donner un nom à la variable qui contiendra la référence sur le bean.\nL&#39;attribut scope permet de définir la portée sur laquelle le bean est défini et utilisable. La valeur de cet attribut détermine la manière dont la balise localise ou instancie le bean. Les valeurs possibles sont:","Valeur","Rôle","page","Le haricot peut être utilisé sur toute la page\nJSP ainsi que dans les fichiers statiques inclus.\nC&#39;est la valeur par défaut.","demande\n    le haricot est accessible pendant la durée de vie de la demande.\nLa méthode getAttribute () de l&#39;objet request fournit une référence\nsur le haricot.","session\n   \n    le haricot est utilisable par tous les JSP qui appartiennent\nà la même session que le JSP qui a instancié le bean. Le haricot est utilisable\ntout au long de la session par toutes les pages qui y participent. Le JSP\nqui crée le bean doit avoir l&#39;attribut session = &quot;true&quot; dans sa directive\npage.","application\n   \n    le haricot est utilisable par tous les JSP qui appartiennent\nà la même application que le JSP qui a instancié le bean. Le haricot est\ninstancié uniquement lors du rechargement de l&#39;application.","L&#39;attribut class est utilisé pour indiquer la classe du bean.\nL&#39;attribut type est utilisé pour spécifier le type de la variable qui contiendra la référence du bean. La valeur spécifiée doit être une super classe du bean ou une interface implémentée par le bean (directement ou par héritage).\nL&#39;attribut beanName est utilisé pour instancier le bean à l&#39;aide de la méthode instanciate () de la classe Beans.","Exemple:","Dans cet exemple, une instance de MonBean est créée une fois dans la session. Dans la même session, l&#39;appel de la balise  avec le même bean et la même portée ne renverra que l&#39;instance créée. Le haricot est donc accessible tout au long de la session.\nLe tag  recherche si une instance du bean existe avec le nom et la portée spécifiés. S&#39;il n&#39;existe pas, une instance est créée. S&#39;il y a instanciation du haricot, alors les balises  inclus dans la balise sont utilisés pour initialiser les propriétés du bean, sinon ils sont ignorés. Tags inclus entre les tags  et  ne sont exécutés que si le haricot est instancié.","Exemple:","Cet exemple a le même effet que le précédent avec une initialisation des propriétés du bean lors de son instanciation.","Exemple complet: TestBean.jsp","Test d&#39;instanciation d&#39;un haricot dans un JSP","Test d&#39;utilisation d&#39;un bean dans un JSP","nom initial =","nom mis à jour =","Exemple complet: Person.java","paquet de test;\nClasse publique Personne \nnom de chaîne privé;\nprivate String prenom;","personne publique () \nthis.name = &quot;nom par défaut&quot;;\nthis.prenom = &quot;nom par défaut&quot;;","public void setName (nom de chaîne) \nthis.name = name;","public String getName () \nreturn (this.name);","public void setPenom (String name) \nthis.prenom = prénom;","public String getPrenom () \nretour (this.prenom);","Selon le moteur JSP utilisé, les fichiers bean doivent être placés dans un répertoire particulier pour être accessibles par JSP.\nPour tester cette JSP avec Tomcat, vous devez compiler le bean Person dans le répertoire c:  jakarta-tomcat  webapps  examples  web-inf  classes  test et placer le fichier TestBean.jsp dans le répertoire c:  jakarta-tomcat. répertoire  webapps  examples  jsp  test.","73.4.4.2. Le tag \nLe tag  vous permet de mettre à jour la valeur d&#39;un ou plusieurs attributs d&#39;un bean. La balise utilise la méthode setter (setXXX () où XXX est le nom de la propriété avec la première lettre en majuscule) pour mettre à jour la valeur. Le haricot doit exister via un appel à la balise .\nIl existe trois façons de mettre à jour les propriétés à partir des paramètres de la requête ou avec une valeur:","alimente automatiquement toutes les propriétés avec les paramètres correspondants de la requête\nnourrir automatiquement une propriété avec le paramètre de requête\ncorrespondant\nfournir une propriété avec la valeur spécifiée","La syntaxe est la suivante:\n&lt;jsp: setProperty name = &quot;beanInstanceName&quot;\npropriété = &quot;nom de la propriété&quot;valeur =&quot;  &lt;% = expression%&gt; &quot;\n/&gt;\nL&#39;attribut name doit contenir le nom de la variable contenant la référence du bean. Cette valeur doit être identique à celle de l&#39;attribut id de la balise  utilisé pour instancier le haricot.\nL&#39;attribut property = &quot;*&quot; est utilisé pour alimenter automatiquement les propriétés du bean avec les paramètres correspondants contenus dans la requête. Le nom des propriétés et le nom des paramètres doivent être identiques.\nLes paramètres de la requête étant toujours fournis sous forme de chaîne, une conversion est effectuée à l&#39;aide de la méthode valueOf () du wrapper du type de propriété.","Exemple:","La propriété d&#39;attribut = &quot;propertyName &quot;[param=&quot;[param=&quot;[param= »[param= »paramètreName &quot;]permet de mettre à jour un attribut du haricot. Par défaut, l&#39;alimentation est automatiquement effectuée avec le paramètre correspondant dans la requête. Si le nom de la propriété et le paramètre sont différents, il est nécessaire de spécifier la propriété d&#39;attribut et l&#39;attribut param contenant le nom du paramètre qui alimentera la propriété du bean.","Exemple:","La propriété d&#39;attribut = &quot;propertyName &quot;valeur =&quot; chaîne  &quot;alimente la propriété du bean avec une valeur particulière.","Exemple:","Il n&#39;est pas possible d&#39;utiliser param et value dans la même balise.","Exemple: Cet exemple est identique au précédent","Test d&#39;instanciation d&#39;un haricot dans un JSP","Test d&#39;utilisation d&#39;un bean dans un JSP","nom initial =","nom mis à jour =","Cette balise peut être utilisée entre les balises  et  initialiser les propriétés du haricot lors de son instanciation.","73.4.4.3. Le tag \nLe tag  Obtenir la valeur d&#39;un attribut d&#39;un haricot. La balise utilise la méthode getter (getXXX () où XXX est le nom de la propriété avec la première lettre en majuscule) pour obtenir la valeur et l&#39;insérer dans la page HTML générée. Le haricot doit exister via un appel à la balise .\nLa syntaxe est la suivante:\n&lt;jsp: getProperty name = &quot;beanInstanceName&quot;propriété =&quot; nom de la propriété« />\nL&#39;attribut name indique le nom du bean tel que déclaré dans la balise .\nL&#39;attribut de propriété indique le nom de la propriété dont nous voulons la valeur.","Exemple:","Test d&#39;instanciation d&#39;un haricot dans un JSP","Test d&#39;utilisation d&#39;un bean dans un JSP","nom initial =","nom mis à jour =","Attention: cette balise n&#39;obtient pas la valeur d&#39;une propriété indexée\nni les valeurs d&#39;un attribut d&#39;un EJB.","Note: avec Tomcat 3.1, utilisation de la balise  sur un attribut dont la valeur est null n&#39;affiche rien tandis que l&#39;utilisation d&#39;une balise d&#39;expression renvoie &quot;null&quot;.","Exemple:","Test d&#39;instanciation d&#39;un haricot dans un JSP","Test d&#39;utilisation d&#39;un bean dans un JSP","nom initial =","nom mis à jour = \nnom mis à jour =","73.4.4.4. La balise de redirection \nLe tag  Vous permet de rediriger la demande vers une autre URL pointant vers un fichier HTML, JSP ou un fichier de servlet.\nDès que le moteur JSP rencontre cette balise, il redirige la demande vers l&#39;URL spécifiée et ignore le reste de la JSP actuelle. Tout ce qui a été généré par le JSP est perdu.\nLa syntaxe est la suivante:\n&lt;jsp: forward page = &quot;RelativeURL  « />ou&lt;jsp: forward page = &quot; &lt;% = expression %&gt; &quot;&gt;&lt;jsp: param name = &quot;le nom du paramètre&quot;valeur =&quot;  &lt;% = expression  %&gt; « /> +\nL&#39;option de page doit contenir la valeur de l&#39;URL de la ressource vers laquelle la demande sera redirigée.\nCette URL est absolue si elle commence par un &amp; # 39; / &amp; # 39; sinon, il est relatif au JSP. Dans le cas d&#39;une URL absolue, le serveur Web détermine l&#39;emplacement de la ressource.\nIl est possible de passer un ou plusieurs paramètres à la ressource appelée grâce au tag .","Exemple: Test8.jsp","Page initiale appelée","Exemple: forward.htm","Page HTML","Page HTML transférée","Dans l&#39;exemple, le fichier forward.htm doit se trouver dans le même répertoire que le fichier JSP. Lors de l&#39;appel de la JSP, la page HTML est affichée. Le contenu généré par la page JSP n&#39;est pas affiché.","73.4.4.5. Le tag \nCette balise inclut de manière dynamique le contenu généré par un JSP ou un servlet au moment de l’exécution du JSP. C&#39;est la différence avec la directive include pour laquelle le fichier est inséré dans le fichier JSP avant la génération du servlet.\nLa syntaxe est la suivante:\n&lt;jsp: include page = &quot;relativeURL &quot;flush =&quot; true &quot; /&gt;\nL&#39;attribut page vous permet de spécifier l&#39;URL relative de l&#39;élément à insérer.\nL&#39;attribut flush indique si le tampon doit être envoyé au client et vidé. Si la valeur de ce paramètre est true, il n&#39;est pas possible d&#39;utiliser certaines fonctionnalités du servlet ou du JSP appelé: il n&#39;est pas possible de modifier l&#39;en-tête de la réponse (en-tête, cookies) ni de le suivre sur une autre page.","Exemple:","Bonjour","Il est possible de fournir des paramètres au servlet ou au JSP appelé à l’aide de la balise .","73.4.4.6. Le tag \nCette balise permet de générer le code HTML nécessaire pour exécuter une applet en fonction du navigateur: une balise HTML  ou  est généré en fonction de l&#39;attribut User-Agent de la requête.\nLe tag  a trois attributs requis:","Attribut\nRôle","code\npermet de spécifier le nom de la classe","base de code\ncontient une URL spécifiant le chemin absolu ou relatif du répertoire contenant la classe ou l&#39;archive","type\nles valeurs possibles sont applet ou bean","Il possède également plusieurs autres attributs facultatifs, les plus utilisés étant:","Attribut\nRôle","aligner\npermet de spécifier l&#39;alignement de l&#39;applet: les valeurs possibles sont bas, milieu ou haut","archiver\npermet de spécifier un ensemble de ressources (bibliothèques JAR, classes, &#8230;) à charger automatiquement. Le chemin de ces ressources prend en compte l&#39;attribut codebase","la taille\nspécifie la hauteur de l&#39;applet en pixel ou en pourcentage","hspace\nspécifie le nombre de pixels insérés à gauche et à droite de l&#39;applet","reconversion\nspécifie la version minimale du jer à utiliser pour exécuter l&#39;applet","prénom\nspécifier le nom de l&#39;applet","vspace\nspécifie le nombre de pixels insérés en haut et en bas de l&#39;applet","largeur\nspécifie la longueur de l&#39;applet en pixel ou en pourcentage","To be a try out of the setting of tag, it faut utiliser in the body of tag  le tag . Chaque paramètre sera alors défini dans un tag .","Exemple:","Le tag  dans le corps du tag  permet de préciser un message qui sera affiché dans les navigateurs ne supportant pas le tag HTML  ou .","L&#39;exemple de cette section est composé de deux pages.\nLa première page est une page HTML qui demande à être son nom et invoquant une url vers une JSP.","Exemple: TestJSPIdent.html","Identification","Entrez votre nom:","La page JSP salue l&#39;utilisateur en récupérant son nom.","Exemple: TestJSPAccueil.jsp","Accueil\n \n \n \nBonjour","Lors de l&#39;exécution d&#39;une page JSP, des erreurs peuvent survenir. Chaque erreur est traduite par la levée d&#39;une exception. Si cette exception est capturée dans un bloc try / catch of the JSP, celle-ci est traitée. Si l’exception n’est pas capturée dans la page, il ya deux possibilités selon qu’une page d’erreur soit associée à la page JSP ou non:","sans page d&#39;erreur associée, la pile d&#39;exécution de l&#39;exception est affichée\navec une page d&#39;erreur associée, une redirection est effectuée vers ce JSP","La définition d&#39;une page d&#39;erreur permet de préciser dans l&#39;attribut errorPage de la page de directive des autres JSP de l&#39;application. Si une exception est levée dans les traitements d&#39;une de ces pages, le JSP va automatiquement rediriger l&#39;utilisateur vers la page d&#39;erreur précisée.\nLa valeur de l&#39;attribut page d&#39;erreur de la directive doit contenir l&#39;adresse URL de la page d&#39;erreur. Le plus simple est de définir cette page à la racine de l&#39;application web et de faire précéder le nom de la page par un caractère &amp; # 39; / # 39; / # 39; dans l&#39;URL.","Exemple:","73.6.1. La définition d&#39;une page d&#39;erreur\nUne page d&#39;erreur est une JSP sans l&#39;attribut isErrorPage est égal à true dans la page de directive. Une telle page dispose d&#39;un accès à la variable implicite nommée exception de type Jetable qui encapsule l&#39;exception qui a été levée.\nIl est possible dans une telle page d&#39;afficher un message d&#39;erreur personnalisée mais aussi de traiter de manière liée à la gestion de l&#39;exception: ajouter l&#39;exception dans un journal, envoyer un mail pour son traitement, &#8230;","Exemple:","% @ page isErrorPage = &quot;true&quot;%&gt;","Une erreur est survenue lors des traitements","Les bibliothèques de tags (taglibs) ou les tags personnalisés (tags personnalisés) permettent de définir leurs propres balises XML, de regrouper dans une bibliothèque et de réutiliser dans des fichiers JSP. C’est une extension de la technologie JSP à partir de la version 1.1 des spécifications du JSP.","73.7.1. La présentation des tags personnalisés\nUn élément personnalisé du langage JSP a été personnalisé avec JSP. Ces dernières dernières permettent de définir ses propres tags qui ont été réalisées pour générer la réponse.\nLe principal, mais est de préférer la séparation des rôles entre le développeur Java et le concepteur de pages web. L&#39;idée maîtresse est de déformer le code Java contenu dans les scriplets de la classe JSP dans les classes dédiées et l&#39;appelant dans le code source de la classe JSP.\nCe concept peut sembler proche de celui des javabeans. Les javabeans sont particulièrement adaptés pour stocker et échanger des données entre les composants de l&amp;#39;application web en passant par la session.\nLes tags personnalisés sont adaptés pour enlever du code Java inclus dans les JSP et le déporter dans une classe dédiée. Cette classe est physiquement un javabean qui implémente une interface particulière.\nLa principale différence entre un javabean et un tag personnalisé est que ce dernier tient compte de l&amp;#39;environnement dans lequel il s&amp;#39;exécute (notamment la JSP et le contexte de l&amp;#39;application web ) et interagit avec lui.\nPour de plus amples informations sur les bibliothèques de tags personnalisés, il suffit de consulter le site qui leur est consacré : http://www.oracle.com/technetwork/java/index-jsp-135995.html.\nLes tags personnalisés possèdent des fonctionnalités intéressantes :","ils ont un accès aux objets de la JSP notamment l&amp;#39;objet de type HttpResponse. Ils peuvent donc modifier le contenu de la réponse générée par la JSP\nils peuvent recevoir des paramètres envoyés à partir de la JSP qui les appelle\nils peuvent avoir un corps qu&amp;#39;ils peuvent manipuler. Par extension de cette fonctionnalité, il est possible d&amp;#39;imbriquer un tag personnalisé dans un autre avec un nombre d&amp;#39;imbrications illimité","Les avantages des bibliothèques de tags personnalisés sont :","une suppression du code Java dans la JSP remplacé par un tag XML facilement compréhensible ce qui simplifie grandement la JSP\nune API facile à mettre en oeuvre\nune forte et facile réutilisabilité des tags développés\nune maintenance des JSP facilitée","La définition d&amp;#39;une bibliothèque de tags comprend plusieurs entités :","une classe dite &quot;handler&quot; pour chaque tag qui compose la bibliothèque\nun fichier de description de la bibliothèque","73.7.2. Les handlers de tags\nChaque tag est associé à une classe qui va contenir les traitements à exécuter lors de l&amp;#39;utilisation du tag. Une telle classe est nommée &quot;handler de tag&quot; (tag handler). Pour permettre son appel, une telle classe doit obligatoirement implémenter directement ou indirectement l&amp;#39;interface javax.servlet.jsp.tagext.Tag\nL&amp;#39;interface Tag possède une interface fille BodyTag qui doit être utilisée dans le cas où le corps du tag est utilisé.\nPour plus de facilité, l&amp;#39;API JSP propose les classes TagSupport et BodyTagSupport qui implémentent respectivement l&amp;#39;interface Tag et BodyTag. Ces deux classes, contenues dans le package javax.servlet.jsp.tagext, proposent des implémentations par défaut des méthodes de l&amp;#39;interface. Ces deux classes proposent un traitement standard par défaut pour chacune des méthodes de l&amp;#39;interface qu&amp;#39;elles implémentent. Pour définir un handler de tag, il suffit d&amp;#39;hériter de l&amp;#39;une ou l&amp;#39;autre de ces deux classes.\nLes méthodes définies dans les interfaces Tag et BodyTag sont appelées, par la servlet issue de la compilation de la JSP, au cours de l&amp;#39;utilisation du tag.\nLe cycle de vie général d&amp;#39;un tag est le suivant :","lors de la rencontre du début du tag, un objet du type du handler est instancié\nplusieurs propriétés sont initialisées (pageContext, parent, &#8230;) en utilisant les setters correspondants\nsi le tag contient des attributs, les setters correspondants sont appelés pour alimenter leurs valeurs\nla méthode doStartTag() est appelée\nsi la méthode doStartTag() renvoie la valeur EVAL_BODYINCLUDE alors le contenu du corps du tag est évalué\nlors de la rencontre de la fin du tag, appel de la méthode doEndTag()\nsi la méthode doEndTag() renvoie la valeur EVAL_PAGE alors l&amp;#39;évaluation de la page se poursuit, si elle renvoie la valeur SKIP_PAGE elle ne se poursuit pas","Toutes ces opérations sont réalisées par le code généré lors de la compilation de la JSP.\nUn handler de tag possède un objet qui permet d&amp;#39;avoir un accès aux objets implicites de la JSP. Cet objet est du type javax.servlet.jsp.PageContext\nComme le code contenu dans la classe du tag ne peut être utilisé que dans le contexte particulier du tag, il peut être intéressant de sortir une partie de ce code dans une ou plusieurs classes dédiées qui peuvent être éventuellement des beans.\nPour compiler ces classes, il faut obligatoirement que le jar de l&amp;#39;API servlets (servlets.jar) soit inclus dans la variable CLASSPATH.","73.7.3. L&amp;#39;interface Tag\nCette interface définit les méthodes principales pour la gestion du cycle de vie d&amp;#39;un tag personnalisé qui ne doit pas manipuler le contenu de son corps.\nElle définit plusieurs constantes :","Constante\nRôle","EVAL_BODY_INCLUDE\nContinuer avec l&amp;#39;évaluation du corps du tag","EVAL_PAGE\nContinuer l&amp;#39;évaluation de la page","SKIP_BODY\nEmpêcher l&amp;#39;évaluation du corps du tag","SKIP_PAGE\nEmpêcher l&amp;#39;évaluation du reste de la page","Elle définit aussi plusieurs méthodes :","Méthode\nRôle","int doEndTag()\nTraitements à la rencontre du tag de fin","int doStartTag()\nTraitements à la rencontre du tag de début","setPageContext(Context)\nSauvegarde du contexte de la page","La méthode doStartTag() est appelée lors de la rencontre du tag d&amp;#39;ouverture et contient les traitements à effectuer dans ce cas. Elle doit renvoyer un entier prédéfini qui indique comment va se poursuivre le traitement du tag :","EVAL_BODY_INCLUDE : poursuite du traitement avec évaluation du corps du tag\nSKIP_BODY : poursuite du traitement sans évaluation du corps du tag","La méthode doEndTag() est appelée lors de la rencontre du tag de fermeture et contient les traitements à effectuer dans ce cas. Elle doit renvoyer un entier prédéfini qui indique comment va se poursuivre le traitement de la JSP.","EVAL_PAGE : poursuite du traitement de la JSP\nSKIP_PAGE : ne pas poursuivre le traitement du reste de la JSP","73.7.4. L&amp;#39;accès aux variables implicites de la JSP\nLes tags ont accès aux variables implicites de la JSP dans laquelle ils s&amp;#39;exécutent grâce à un objet de type PageContext. La variable pageContext est un objet de ce type qui est initialisé juste après l&amp;#39;instanciation du handler.\nLe classe PageContext est une classe abstraite dont l&amp;#39;implémentation des spécifications doit fournir une adaptation concrète.\nCette classe définit plusieurs méthodes :","Méthodes\nRôles","JspWriter getOut()\nPermet un accès à la variable out de la JSP","Exception getException()\nPermet un accès à la variable exception de la JSP","Object getPage()\nPermet un accès à la variable page de la JSP","ServletRequest getRequest()\nPermet un accès à la variable request de la JSP","ServletResponse getResponse()\nPermet un accès à la variable response de la JSP","ServletConfig getServletConfig()\nPermet un accès à l&amp;#39;instance de la variable de type ServletConfig","ServletContext getServletContext()\nPermet un accès à l&amp;#39;instance de la variable de type ServletContext","HttpSession getSession()\nPermet un accès à la session","Object getAttribute(String)\nRenvoie l&amp;#39;objet associé au nom fourni en paramètre dans la portée de la page","setAttribute(String, Object)\nPermet de placer dans la portée de la page un objet dont le nom est fourni en paramètre","73.7.5. Les deux types de handlers\nIl existe deux types de handlers :","les handlers de tags sans corps\nles handlers de tags avec corps","73.7.5.1. Les handlers de tags sans corps\nPour définir le handler d&amp;#39;un tag personnalisé sans corps, il suffit de définir une classe qui implémente l&amp;#39;interface Tag ou qui héritent de la classe TagSupport. Il faut définir ou redéfinir les méthodes doStartTag() et endStartTag().\nLa méthode doStartTag() est appelée à la rencontre du début du tag. Cette méthode doit contenir le code à exécuter dans ce cas et renvoyer la constante SKIP_BODY puisque le tag ne contient pas de corps.","73.7.5.2. Les handlers de tags avec corps\nLe cycle de vie d&amp;#39;un tel tag inclut le traitement du corps si la méthode doStartTag() renvoie la valeur EVAL_BODY_TAG.\nDans ce cas, les opérations suivantes sont réalisées :","la méthode setBodyContent() est appelée\nle contenu du corps est traité\nla méthode doAfterBody() est appelée. Si elle renvoie la valeur EVAL_BODY_TAG, le contenu du corps est de nouveau traité","73.7.6. Les paramètres d&amp;#39;un tag\nUn tag peut avoir un ou plusieurs paramètres qui seront transmis à la classe par des attributs. Pour chacun des paramètres, il faut définir des getters et des setters en respectant les règles et conventions des Java beans. Il est impératif de définir un champ, un setter et éventuellement un accesseur pour chaque attribut.\nLa JSP utilisera le setter pour fournir à l&amp;#39;objet la valeur de l&amp;#39;attribut.\nAu moment de la génération de la servlet par le moteur de JSP, celui-ci vérifie par introspection la présence d&amp;#39;un setter pour l&amp;#39;attribut concerné.","73.7.7. La définition du fichier de description de la bibliothèque de tags (TLD)\nLe fichier de description de la bibliothèque de tags (tag library descriptor file) est un fichier au format XML qui décrit une bibliothèque de tags. Les informations qu&amp;#39;il contient concernent la bibliothèque de tags elle-même et aussi chacun des tags qui la compose.\nCe fichier est utilisé par le conteneur Web lors de la compilation de la JSP pour remplacer le tag par du code Java.\nCe fichier doit toujours avoir pour extension .tld. Il doit être placé dans le répertoire web-inf du fichier war ou dans un de ses sous-répertoires. Le plus pratique est de tous les regrouper dans un répertoire nommé par exemple tags ou tld.\nComme tout bon fichier XML, le fichier TLD commence par un prologue :","Exemple :","La DTD précisée doit correspondre à la version de l&amp;#39;API JSP utilisée. L&amp;#39;exemple précédent concernait la version 1.1, l&amp;#39;exemple suivant concerne la version 1.2","Exemple :","Le tag racine du document XML est le tag .\nCe tag peut contenir plusieurs tags qui définissent les caractéristiques générales de la bibliothèque. Les tags suivants  sont définis dans les spécifications 1.2 :","prénom\nRôle","tlib-version\nversion de la bibliothèque","jsp-version\nversion des spécifications JSP utilisées","short-name\nnom court de la bibliothèque (optionnel)","uri\nURI qui identifie de façon unique la bibliothèque : cette URI n&amp;#39;a pas besoin d&amp;#39;exister réellement","display-name\nnom de la bibliothèque","small-icon\n(optionnel)","large-icon\n(optionnel)","la description\ndescription de la bibliothèque","validateur\n(optionnel)","auditeur\n(optionnel)","étiquette\nil en faut autant que de tags qui composent la bibliothèque","Pour chaque tag personnalisé défini dans la bibliothèque, il faut un tag . Ce tag permet de définir les caractéristiques d&amp;#39;un tag de la bibliothèque.\nCe tag peut contenir les tags suivants :","prénom\nRôle","prénom\nnom du tag : il doit être unique dans la bibliothèque","tag-class\nnom entièrement qualifié de la classe qui contient le handler du tag","tei-class\nnom qualifié d&amp;#39;une classe fille de la classe javax.servlet.jsp.tagext.TagExtraInfo (optionnel)","body-content\ntype du corps du tag. Les valeurs possibles sont :","JSP : le corps du tag contient des tags JSP qui doivent être interprétés\ntagdependent : l&amp;#39;interprétation du contenu du corps est faite par le tag\nempty : le corps doit obligatoirement être vide","La valeur par défaut est JSP","display-name\nnom court du tag","small-icon\nnom relatif à la bibliothèque d&amp;#39;un fichier gif ou jpeg contenant une icône. (optionnel)","large-icon\nnom relatif à la bibliothèque d&amp;#39;un fichier gif ou jpeg contenant une icône. (optionnel)","la description\ndescription du tag (optionnel)","variable\n(optionnel)","attribut\nil en faut autant que d&amp;#39;attributs possédés par le tag (optionnel)","Exemple\nun exemple de l&amp;#39;utilisation du tag (optionnel)","Pour chaque attribut du tag personnalisé, il faut utiliser un tag . Ce tag décrit un attribut d&amp;#39;un tag et peut contenir les tags suivants :","prénom\nLa description","prénom\nnom de l&amp;#39;attribut","Champs obligatoires\nbooléen qui indique la présence obligatoire de l&amp;#39;attribut","rtexprvalue\nbooléen qui indique si la page doit évaluer l&amp;#39;expression lors de l&amp;#39;exécution. Il faut donc mettre la valeur true si la valeur de l&amp;#39;attribut est fournie avec un tag JSP d&amp;#39;expression","Le tag  contient les tags suivants :","prénom\nRôle","name-given","name-from-attribut","variable-class\nnom de la classe de la valeur de l&amp;#39;attribut. Par défaut java.lang.String","déclarer\npar défaut : True","portée\nvisibilité de l&amp;#39;attribut. Les valeurs possibles sont :\n      Par défaut : NESTED (optionnel)","la description\ndescription de l&amp;#39;attribut (optionnel)","Chaque bibliothèque doit être définie avec un fichier de description au format xml possédant une extension .tld. Le contenu de ce fichier doit pouvoir être validé avec une DTD fournie par Sun.\nCe fichier est habituellement stocké dans le répertoire web-inf de l&amp;#39;application web ou un de ses sous-répertoires.","Exemple :","1,0\n  1.1\n  testtaglib\n  http://perso.jmd.test.taglib\n  Bibliotheque de test des taglibs","testtaglib1\n  perso.jmd.test.taglib.TestTaglib1\n  Tag qui affiche bonjour","73.7.8. L&amp;#39;utilisation d&amp;#39;une bibliothèque de tags\nPour utiliser une bibliothèque de tags, il y a des actions à réaliser au niveau du code source de la JSP et au niveau de conteneur d&amp;#39;applications web pour la déployer.","73.7.8.1. L&amp;#39;utilisation dans le code source d&amp;#39;une JSP\nChaque bibliothèque utilisée dans une JSP doit être déclarée avant son utilisation en utilisant la directive taglib. Le plus simple est d&amp;#39;effectuer ces déclarations tout au début du code de la JSP.\nCette directive possède deux attributs :\nDans ce dernier cas, il faut ajouter pour chaque bibliothèque un tag  dans le fichier de description de déploiement de l&amp;#39;application/WEB-INF/web.xml","Exemple :","/maTagLibTest\n    /WEB-INF/tld/testtaglib.tld","L&amp;#39;appel d&amp;#39;un tag se fait en utilisant un tag dont le nom a la forme suivante : prefix:tag\nLe préfix est celui défini dans la directive taglib.","Exemple : un tag sans corps","Exemple : un tag avec corps","...","Le corps peut contenir du code HTML, du code JSP ou d&amp;#39;autre tag personnalisé.\nLe tag peut avoir des attributs si ceux-ci ont été définis. La syntaxe pour les utiliser respecte la norme XML.","Exemple : un tag avec un paramètre constant","La valeur de cet attribut peut être une donnée dynamiquement évaluée lors de l&amp;#39;exécution :","Exemple : un tag avec un paramètre","&lt;prefix:tag attribut=&quot;\"/>","73.7.8.2. Le déploiement d&amp;#39;une bibliothèque\nAu moment de la compilation de la JSP en servlet, le conteneur transforme chaque tag en un appel à un objet du type de la classe associée au tag.\nIl y a deux types d&amp;#39;éléments auxquels le conteneur d&amp;#39;applications web doit pouvoir accéder :","le fichier de description de la bibliothèque\nles classes des handlers de tags","Les classes des handlers de tags peuvent être stockées à deux endroits dans le fichier war selon leur format :","s&amp;#39;ils sont packagés sous forme de fichiers jar alors ils doivent être placés dans le répertoire /WEB-INF/lib\ns&amp;#39;ils ne sont pas packagés alors ils doivent être placés dans le répertoire /WEB-INF/classes","73.7.9. Le déploiement et les tests dans Tomcat\nTomcat étant l&amp;#39;implémentation de référence pour les technologies servlets et JSP, il est pratique d&amp;#39;effectuer des tests avec cet outil.\nLa version de Tomcat utilisée dans cette section est la 3.2.1.\nLe déploiement se fait en deux étapes :","la copie des fichiers\nl&amp;#39;enregistrement de la bibliothèque","Les classes compilées doivent être copiées dans le répertoire WEB-INF/classes de la webapp si elles ne sont pas packagées dans une archive jar, sinon le ou les fichiers .jar doivent être copiés dans le répertoire WEB-INF/lib.\nLe fichier .tld doit être copié dans le répertoire WEB-INF ou dans un de ses sous-répertoires.\nIl faut ensuite enregistrer la bibliothèque dans le fichier de configuration web.xml contenu dans le répertoire web-inf du répertoire de l&amp;#39;application web.\nIl faut ajouter dans ce fichier, un tag  pour chaque bibliothèque utilisée par l&amp;#39;application web. Ce tag contient deux informations :","l&amp;#39;URI de la bibliothèque contenue dans le tag taglib-uri. Cette URI doit être identique à celle définie dans le fichier de description de la bibliothèque\nla localisation du fichier de description","Exemple :","index.htm\n    index.jsp\n  \n\t\n  \n    /maTagLibTest\n    /WEB-INF/tld/testtaglib.tld","Il ne reste plus qu&amp;#39;à lancer Tomcat si ce n&amp;#39;est pas encore fait et à saisir l&amp;#39;url de la page contenant l&amp;#39;appel au tag personnalisé.","73.7.10. Les bibliothèques de tags existantes\nIl existe de nombreuses bibliothèques de tags libres ou commerciales disponibles sur le marché. Cette section va tenter de présenter quelques-unes des plus connues et des plus utilisées du monde libre. Cette liste n&amp;#39;est pas exhaustive.","73.7.10.1. Struts\nStruts est un framework pour la réalisation d&amp;#39;applications web reposant sur le modèle MVC 2.\nPour la partie vue, Struts utilise les JSP et propose en plus plusieurs bibliothèques de tags pour faciliter le développement de cette partie présentation. Struts possède quatre grandes bibliothèques :","formulaire HMTL\nmodèles (templates)\nJavabeans (bean)\ntraitements logiques (logic)","Le site web de Struts se trouve à l&amp;#39;url : http://struts.apache.org/index.html.\nCe framework est détaillée dans le chapitre «Struts».","73.7.10.2. JSP Standard Tag Library (JSTL)\nJSP Standard Tag Library (JSTL) est une spécification issue du travail du JCP sous la JSR numéro 52. Le chapitre «JSTL (Java server page Standard Tag Library)» fournit plus de détails sur cette spécification.","73.7.10.3. Apache Taglibs (Jakarta Taglibs)\nApache Taglibs est un ensemble de taglibs : la plupart a été déclarée deprecated notamment à cause de la standardisation de la JSTL.\nIl propose en particulier, la bibliothèque Apache Standard Tag Library qui est une implémentation des versions 1.0, 1.1 et 1.2 de la spécification JSTL.\nLe site officiel est à l&amp;#39;url : http://tomcat.apache.org/taglibs/","Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"],"content_blocks":[{"id":"text-1","type":"text","heading":"","plain_text":"Niveau:\n  Supérieur","html":"<p>Niveau:\n  Supérieur</p>"},{"id":"text-2","type":"text","heading":"","plain_text":"Les pages de serveur Java (JSP) sont une technologie Java permettant de générer des pages Web dynamiques.\nLa technologie JSP est utilisée pour séparer la présentation en code HTML et les processus écrits en Java en tant que JavaBeans ou servlets. Cela est d&#39;autant plus facile que les JSP définissent une syntaxe particulière pour l&#39;appel d&#39;un bean et l&#39;insertion dynamique du résultat de son traitement dans la page HTML.\nLes informations de ce chapitre concernent les spécifications JSP 1.0 et ultérieures.\nCe chapitre contient plusieurs sections:\n  \n  \nLes JSP vous permettent d&#39;introduire du code Java dans des balises prédéfinies d&#39;une page HTML. La technologie JSP allie la puissance Java côté serveur à la facilité de disposition HTML du côté client.\nLa page officielle de cette technologie est à l&#39;adresse suivante: http://www.oracle.com/technetwork/java/javaee/jsp/index.html.\nUn JSP est généralement composé de:","html":"<p>Les pages de serveur Java (JSP) sont une technologie Java permettant de générer des pages Web dynamiques.\nLa technologie JSP est utilisée pour séparer la présentation en code HTML et les processus écrits en Java en tant que JavaBeans ou servlets. Cela est d&#039;autant plus facile que les JSP définissent une syntaxe particulière pour l&#039;appel d&#039;un bean et l&#039;insertion dynamique du résultat de son traitement dans la page HTML.\nLes informations de ce chapitre concernent les spécifications JSP 1.0 et ultérieures.\nCe chapitre contient plusieurs sections:\n  \n  \nLes JSP vous permettent d&#039;introduire du code Java dans des balises prédéfinies d&#039;une page HTML. La technologie JSP allie la puissance Java côté serveur à la facilité de disposition HTML du côté client.\nLa page officielle de cette technologie est à l&#039;adresse suivante: http://www.oracle.com/technetwork/java/javaee/jsp/index.html.\nUn JSP est généralement composé de:</p>"},{"id":"text-3","type":"text","heading":"","plain_text":"balises de données et HTML\nBalises JSP\nscriptlets (code Java intégré dans le JSP)","html":"<p>balises de données et HTML\nBalises JSP\nscriptlets (code Java intégré dans le JSP)</p>"},{"id":"text-4","type":"text","heading":"","plain_text":"Les fichiers JSP ont l&#39;extension .jsp par convention.\nConcrètement, les JSP sont basés sur des servlets. Lors du premier appel de la page JSP, le moteur JSP génère et compile automatiquement le servlet qui permet la génération de la page Web. Le code HTML est entièrement inclus dans le servlet. Le code Java est inséré dans le servlet.\nLe servlet généré est compilé, enregistré et exécuté. Les appels suivants depuis le JSP sont beaucoup plus rapides car la servlet, conservée par le serveur, est exécutée directement.\nIl existe plusieurs façons de combiner les technologies JSP, les EJB et les servlets pour développer des applications Web.\nÉtant donné que le code de servlet est généré de manière dynamique, les JSP sont relativement difficiles à déboguer.\nCette approche présente toutefois plusieurs avantages:","html":"<p>Les fichiers JSP ont l&#039;extension .jsp par convention.\nConcrètement, les JSP sont basés sur des servlets. Lors du premier appel de la page JSP, le moteur JSP génère et compile automatiquement le servlet qui permet la génération de la page Web. Le code HTML est entièrement inclus dans le servlet. Le code Java est inséré dans le servlet.\nLe servlet généré est compilé, enregistré et exécuté. Les appels suivants depuis le JSP sont beaucoup plus rapides car la servlet, conservée par le serveur, est exécutée directement.\nIl existe plusieurs façons de combiner les technologies JSP, les EJB et les servlets pour développer des applications Web.\nÉtant donné que le code de servlet est généré de manière dynamique, les JSP sont relativement difficiles à déboguer.\nCette approche présente toutefois plusieurs avantages:</p>"},{"id":"text-5","type":"text","heading":"","plain_text":"l&#39;utilisation de Java par le JSP permet l&#39;indépendance de la plate-forme\nexécution mais aussi le serveur Web utilisé.\nséparation des traitements et présentation: la page Web peut être\nécrit par un concepteur et les balises Java peuvent être ajoutés plus tard par le\ndéveloppeur. Les traitements peuvent être faits avec des composants réutilisables\n(Haricots Java).\nLes JSP sont basés sur des servlets: tout ce qui est fait par un servlet\npour la génération de pages dynamiques peut être fait avec un JSP.","html":"<p>l&#039;utilisation de Java par le JSP permet l&#039;indépendance de la plate-forme\nexécution mais aussi le serveur Web utilisé.\nséparation des traitements et présentation: la page Web peut être\nécrit par un concepteur et les balises Java peuvent être ajoutés plus tard par le\ndéveloppeur. Les traitements peuvent être faits avec des composants réutilisables\n(Haricots Java).\nLes JSP sont basés sur des servlets: tout ce qui est fait par un servlet\npour la génération de pages dynamiques peut être fait avec un JSP.</p>"},{"id":"text-6","type":"text","heading":"","plain_text":"Il existe plusieurs versions des spécifications JSP:","html":"<p>Il existe plusieurs versions des spécifications JSP:</p>"},{"id":"text-7","type":"text","heading":"","plain_text":"Version","html":"<p>Version</p>"},{"id":"text-8","type":"text","heading":"","plain_text":"0,91\nPremière sortie","html":"<p>0,91\nPremière sortie</p>"},{"id":"text-9","type":"text","heading":"","plain_text":"1,0","html":"<p>1,0</p>"},{"id":"text-10","type":"text","heading":"","plain_text":"Juin 1999: première version finale\n    lié à l&#39;API servlet 2.1","html":"<p>Juin 1999: première version finale\n    lié à l&#039;API servlet 2.1</p>"},{"id":"text-11","type":"text","heading":"","plain_text":"1.1\nDécembre 1999lié à l&#39;API servlet 2.2","html":"<p>1.1\nDécembre 1999lié à l&#039;API servlet 2.2</p>"},{"id":"text-12","type":"text","heading":"","plain_text":"1.2\nOctobre 2000, JSR 053lié à l&#39;API servlet 2.3","html":"<p>1.2\nOctobre 2000, JSR 053lié à l&#039;API servlet 2.3</p>"},{"id":"text-13","type":"text","heading":"","plain_text":"2.0\nNovembre 2003, JSR 152lié à l&#39;API servlet 2.4","html":"<p>2.0\nNovembre 2003, JSR 152lié à l&#039;API servlet 2.4</p>"},{"id":"text-14","type":"text","heading":"","plain_text":"2.1\nMai 2006, JSR 245lié à l&#39;API servlet 2.5","html":"<p>2.1\nMai 2006, JSR 245lié à l&#039;API servlet 2.5</p>"},{"id":"text-15","type":"text","heading":"","plain_text":"2.2\nDécembre 2009, version de maintenance de la JSR 245lié à l&#39;API servlet 3.0","html":"<p>2.2\nDécembre 2009, version de maintenance de la JSR 245lié à l&#039;API servlet 3.0</p>"},{"id":"text-16","type":"text","heading":"","plain_text":"2.3\nJuin 2013, version de maintenance de la JSR 245lié à l&#39;API servlet 3.1","html":"<p>2.3\nJuin 2013, version de maintenance de la JSR 245lié à l&#039;API servlet 3.1</p>"},{"id":"text-17","type":"text","heading":"","plain_text":"73.1.1. Le choix entre JSP et Servlets\nLes servlets et les JSP ont beaucoup de choses en commun puisqu&#39;un JSP est finalement converti en un servlet. Le choix d&#39;utiliser l&#39;une ou l&#39;autre de ces technologies ou les deux doit être fait pour tirer le meilleur parti de leurs avantages.\nDans une servlet, les traitements et la présentation sont regroupés. L’aspect présentation est dans ce cas difficile à développer et à maintenir en raison de l’utilisation répétée de méthodes pour insérer le code HTML dans le flux de sortie. De plus, une simple modification du code HTML nécessite la recompilation du servlet. Avec un JSP, la séparation des traitements et de la présentation rend cela très simple et automatique.\nIl est préférable d’utiliser les JSP pour générer des pages Web dynamiques.\nL&#39;utilisation des servlets est obligatoire si elles doivent communiquer directement avec une applet ou une application et non plus avec un serveur Web.","html":"<p>73.1.1. Le choix entre JSP et Servlets\nLes servlets et les JSP ont beaucoup de choses en commun puisqu&#039;un JSP est finalement converti en un servlet. Le choix d&#039;utiliser l&#039;une ou l&#039;autre de ces technologies ou les deux doit être fait pour tirer le meilleur parti de leurs avantages.\nDans une servlet, les traitements et la présentation sont regroupés. L’aspect présentation est dans ce cas difficile à développer et à maintenir en raison de l’utilisation répétée de méthodes pour insérer le code HTML dans le flux de sortie. De plus, une simple modification du code HTML nécessite la recompilation du servlet. Avec un JSP, la séparation des traitements et de la présentation rend cela très simple et automatique.\nIl est préférable d’utiliser les JSP pour générer des pages Web dynamiques.\nL&#039;utilisation des servlets est obligatoire si elles doivent communiquer directement avec une applet ou une application et non plus avec un serveur Web.</p>"},{"id":"text-18","type":"text","heading":"","plain_text":"73.1.2. JSP et technologies concurrentes\nIl existe plusieurs technologies dont le but est similaire aux JSP, notamment ASP, PHP et ASP.Net. Chacune de ces technologies présente des avantages et des inconvénients, dont voici une liste non exhaustive.","html":"<p>73.1.2. JSP et technologies concurrentes\nIl existe plusieurs technologies dont le but est similaire aux JSP, notamment ASP, PHP et ASP.Net. Chacune de ces technologies présente des avantages et des inconvénients, dont voici une liste non exhaustive.</p>"},{"id":"text-19","type":"text","heading":"","plain_text":"JSP","html":"<p>JSP</p>"},{"id":"text-20","type":"text","heading":"","plain_text":"PHP","html":"<p>PHP</p>"},{"id":"text-21","type":"text","heading":"","plain_text":"ASPIC","html":"<p>ASPIC</p>"},{"id":"text-22","type":"text","heading":"","plain_text":"ASP.Net","html":"<p>ASP.Net</p>"},{"id":"text-23","type":"text","heading":"","plain_text":"la langue","html":"<p>la langue</p>"},{"id":"text-24","type":"text","heading":"","plain_text":"Java","html":"<p>Java</p>"},{"id":"text-25","type":"text","heading":"","plain_text":"PHP","html":"<p>PHP</p>"},{"id":"text-26","type":"text","heading":"","plain_text":"VBScript ou JScript","html":"<p>VBScript ou JScript</p>"},{"id":"text-27","type":"text","heading":"","plain_text":"Toutes les langues supportées par .Net (C #, VB.Net, Delphi, &#8230;)","html":"<p>Toutes les langues supportées par .Net (C #, VB.Net, Delphi, &#8230;)</p>"},{"id":"text-28","type":"text","heading":"","plain_text":"mode d&#39;exécution","html":"<p>mode d&#039;exécution</p>"},{"id":"text-29","type":"text","heading":"","plain_text":"Compilé en pseudo-code (bytecode)","html":"<p>Compilé en pseudo-code (bytecode)</p>"},{"id":"text-30","type":"text","heading":"","plain_text":"Interprète","html":"<p>Interprète</p>"},{"id":"text-31","type":"text","heading":"","plain_text":"Interprète","html":"<p>Interprète</p>"},{"id":"text-32","type":"text","heading":"","plain_text":"Compilé en pseudo-code (MSIL)","html":"<p>Compilé en pseudo-code (MSIL)</p>"},{"id":"text-33","type":"text","heading":"","plain_text":"Principaux avantages\nReposez-vous sur la plate-forme Java dont il hérite des avantages\nOpen source \n      Nombreuses bibliothèques et sources d&#39;applications gratuites disponibles\n      Facile à mettre en œuvre\nFacile à mettre en œuvre\nReposez-vous sur la plate-forme .Net dont il hérite des avantages \n      Wysiwyg et les événements\n      Code derrière pour la séparation affichage / traitement","html":"<p>Principaux avantages\nReposez-vous sur la plate-forme Java dont il hérite des avantages\nOpen source \n      Nombreuses bibliothèques et sources d&#039;applications gratuites disponibles\n      Facile à mettre en œuvre\nFacile à mettre en œuvre\nReposez-vous sur la plate-forme .Net dont il hérite des avantages \n      Wysiwyg et les événements\n      Code derrière pour la séparation affichage / traitement</p>"},{"id":"text-34","type":"text","heading":"","plain_text":"principaux inconvénients\nDébogage plutôt fastidieux\n      Beaucoup de code à écrire\nDébogage plutôt fastidieux\n      Beaucoup de code à écrire \n      support partiel de la programmation orientée objet en attente de la version 5\nDébogage plutôt fastidieux\n      Beaucoup de code à écrire \n      Fonctionne principalement sur les plateformes Windows\n      Pas de POO, objets métier encapsulés dans des objets COM lourds à implémenter\nFonctionne principalement sur les plates-formes Windows. (Voir le projet Mono pour le support d&#39;autres plateformes)","html":"<p>principaux inconvénients\nDébogage plutôt fastidieux\n      Beaucoup de code à écrire\nDébogage plutôt fastidieux\n      Beaucoup de code à écrire \n      support partiel de la programmation orientée objet en attente de la version 5\nDébogage plutôt fastidieux\n      Beaucoup de code à écrire \n      Fonctionne principalement sur les plateformes Windows\n      Pas de POO, objets métier encapsulés dans des objets COM lourds à implémenter\nFonctionne principalement sur les plates-formes Windows. (Voir le projet Mono pour le support d&#039;autres plateformes)</p>"},{"id":"text-35","type":"text","heading":"","plain_text":"Dans un premier temps, Sun a fourni un kit de développement pour les JSP: le kit de développement Web du serveur Java (JSWDK). Ensuite, Sun a confié au projet Apache le développement de l’implémentation de référence du moteur JSP: le projet Tomcat. Depuis la version 2.2, l&#39;implémentation de référence est le projet Glassfish.\nSelon la version de l&#39;API utilisée, vous devez choisir un produit différent. Le tableau ci-dessous récapitule les implémentations de référence basées sur la version de l&#39;API implémentée.","html":"<p>Dans un premier temps, Sun a fourni un kit de développement pour les JSP: le kit de développement Web du serveur Java (JSWDK). Ensuite, Sun a confié au projet Apache le développement de l’implémentation de référence du moteur JSP: le projet Tomcat. Depuis la version 2.2, l&#039;implémentation de référence est le projet Glassfish.\nSelon la version de l&#039;API utilisée, vous devez choisir un produit différent. Le tableau ci-dessous récapitule les implémentations de référence basées sur la version de l&#039;API implémentée.</p>"},{"id":"text-36","type":"text","heading":"","plain_text":"Produit","html":"<p>Produit</p>"},{"id":"text-37","type":"text","heading":"","plain_text":"Version","html":"<p>Version</p>"},{"id":"text-38","type":"text","heading":"","plain_text":"Version de l&#39;API Servlet implémentée","html":"<p>Version de l&#039;API Servlet implémentée</p>"},{"id":"text-39","type":"text","heading":"","plain_text":"Version de l&#39;API JSP implémentée","html":"<p>Version de l&#039;API JSP implémentée</p>"},{"id":"text-40","type":"text","heading":"","plain_text":"JSWDK","html":"<p>JSWDK</p>"},{"id":"text-41","type":"text","heading":"","plain_text":"1.0.1","html":"<p>1.0.1</p>"},{"id":"text-42","type":"text","heading":"","plain_text":"2.1","html":"<p>2.1</p>"},{"id":"text-43","type":"text","heading":"","plain_text":"1,0","html":"<p>1,0</p>"},{"id":"text-44","type":"text","heading":"","plain_text":"Matou","html":"<p>Matou</p>"},{"id":"text-45","type":"text","heading":"","plain_text":"3.2","html":"<p>3.2</p>"},{"id":"text-46","type":"text","heading":"","plain_text":"2.2","html":"<p>2.2</p>"},{"id":"text-47","type":"text","heading":"","plain_text":"1.1","html":"<p>1.1</p>"},{"id":"text-48","type":"text","heading":"","plain_text":"Matou","html":"<p>Matou</p>"},{"id":"text-49","type":"text","heading":"","plain_text":"4.0","html":"<p>4.0</p>"},{"id":"text-50","type":"text","heading":"","plain_text":"2.3","html":"<p>2.3</p>"},{"id":"text-51","type":"text","heading":"","plain_text":"1.2","html":"<p>1.2</p>"},{"id":"text-52","type":"text","heading":"","plain_text":"Matou","html":"<p>Matou</p>"},{"id":"text-53","type":"text","heading":"","plain_text":"5.0","html":"<p>5.0</p>"},{"id":"text-54","type":"text","heading":"","plain_text":"2.4","html":"<p>2.4</p>"},{"id":"text-55","type":"text","heading":"","plain_text":"2.0","html":"<p>2.0</p>"},{"id":"text-56","type":"text","heading":"","plain_text":"Matou","html":"<p>Matou</p>"},{"id":"text-57","type":"text","heading":"","plain_text":"6.0","html":"<p>6.0</p>"},{"id":"text-58","type":"text","heading":"","plain_text":"2,5","html":"<p>2,5</p>"},{"id":"text-59","type":"text","heading":"","plain_text":"2.1","html":"<p>2.1</p>"},{"id":"text-60","type":"text","heading":"","plain_text":"Glassfish","html":"<p>Glassfish</p>"},{"id":"text-61","type":"text","heading":"","plain_text":"3.0","html":"<p>3.0</p>"},{"id":"text-62","type":"text","heading":"","plain_text":"3.0","html":"<p>3.0</p>"},{"id":"text-63","type":"text","heading":"","plain_text":"2.2","html":"<p>2.2</p>"},{"id":"text-64","type":"text","heading":"","plain_text":"Glassfish","html":"<p>Glassfish</p>"},{"id":"text-65","type":"text","heading":"","plain_text":"4.0","html":"<p>4.0</p>"},{"id":"text-66","type":"text","heading":"","plain_text":"3.1","html":"<p>3.1</p>"},{"id":"text-67","type":"text","heading":"","plain_text":"2.3","html":"<p>2.3</p>"},{"id":"text-68","type":"text","heading":"","plain_text":"Il est également possible d&#39;utiliser tout conteneur Web compatible avec les spécifications de la plate-forme J2EE / Java EE. Une liste non exhaustive est fournie dans le chapitre &quot;Outils gratuits et commerciaux&quot;.","html":"<p>Il est également possible d&#039;utiliser tout conteneur Web compatible avec les spécifications de la plate-forme J2EE / Java EE. Une liste non exhaustive est fournie dans le chapitre &quot;Outils gratuits et commerciaux&quot;.</p>"},{"id":"text-69","type":"text","heading":"","plain_text":"73.2.1. Le kit de développement Web JavaServer (JSWDK) sous Windows\nLe fichier JSWDK est proposé sous forme de fichier zip nommé jswdk_1_0_1-win.zip.\nPour l&#39;installer, décompressez simplement l&#39;archive dans un répertoire du système. Le serveur commence à exécuter le fichier startserver.bat.","html":"<p>73.2.1. Le kit de développement Web JavaServer (JSWDK) sous Windows\nLe fichier JSWDK est proposé sous forme de fichier zip nommé jswdk_1_0_1-win.zip.\nPour l&#039;installer, décompressez simplement l&#039;archive dans un répertoire du système. Le serveur commence à exécuter le fichier startserver.bat.</p>"},{"id":"text-70","type":"text","heading":"","plain_text":"Pour lancer le serveur:","html":"<p>Pour lancer le serveur:</p>"},{"id":"text-71","type":"text","heading":"","plain_text":"C:  jswdk-1.0.1&gt; startserver.bat","html":"<p>C:  jswdk-1.0.1&gt; startserver.bat</p>"},{"id":"text-72","type":"text","heading":"","plain_text":"Utiliser classpath :.  Des classes;.  Webserver.jar ;.  Lib  jakarta.jar ;.  Lib  servlet.jar;.\n Lib  jsp.jar ;.  Lib  jspengine.jar ;.  Exemples  WEB-INF  jsp  beans ;.  Pages Web  WEB-INF\n Servlets ;.  Webpages  WEB-INF  jsp  beans ;.  Lib  xml.jar ;.  Lib  moo.jar  lib  tools.ja\nDr. C:  jdk1.3  lib  tools.jar;\nC:  jswdk-1.0.1&gt;","html":"<p>Utiliser classpath :.  Des classes;.  Webserver.jar ;.  Lib  jakarta.jar ;.  Lib  servlet.jar;.\n Lib  jsp.jar ;.  Lib  jspengine.jar ;.  Exemples  WEB-INF  jsp  beans ;.  Pages Web  WEB-INF\n Servlets ;.  Webpages  WEB-INF  jsp  beans ;.  Lib  xml.jar ;.  Lib  moo.jar  lib  tools.ja\nDr. C:  jdk1.3  lib  tools.jar;\nC:  jswdk-1.0.1&gt;</p>"},{"id":"text-73","type":"text","heading":"","plain_text":"Le serveur s&#39;exécute dans une console en arrière-plan. Cette console permet de voir les messages envoyés par le serveur.","html":"<p>Le serveur s&#039;exécute dans une console en arrière-plan. Cette console permet de voir les messages envoyés par le serveur.</p>"},{"id":"text-74","type":"text","heading":"","plain_text":"Exemple: au démarrage","html":"<p>Exemple: au démarrage</p>"},{"id":"text-75","type":"text","heading":"","plain_text":"JSWDK WebServer Version 1.0.1\nConfiguration chargée à partir de: fichier: C:  jswdk-1.0.1  webserver.xml\nnoeud final créé: localhost / 127.0.0.1: 8080","html":"<p>JSWDK WebServer Version 1.0.1\nConfiguration chargée à partir de: fichier: C:  jswdk-1.0.1  webserver.xml\nnoeud final créé: localhost / 127.0.0.1: 8080</p>"},{"id":"text-76","type":"text","heading":"","plain_text":"Si la JSP contient une erreur, le serveur envoie une page d&#39;erreur:","html":"<p>Si la JSP contient une erreur, le serveur envoie une page d&#039;erreur:</p>"},{"id":"text-77","type":"text","heading":"","plain_text":"Une exception est levée et est affichée dans la fenêtre où le serveur est en cours d&#39;exécution:","html":"<p>Une exception est levée et est affichée dans la fenêtre où le serveur est en cours d&#039;exécution:</p>"},{"id":"text-78","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-79","type":"text","heading":"","plain_text":"- Commentaires de la page JSP -\n^\n1 erreur\nà l&#39;adresse com.sun.jsp.compiler.Main.compile (Main.java:347)\nà l&#39;adresse com.sun.jsp.runtime.JspLoader.loadJSP (JspLoader.java:135)\nà l&#39;adresse com.sun.jsp.runtime.JspServlet $ JspServletWrapper.loadIfNecessary (JspS\nervlet.java:77)\nà l&#39;adresse com.sun.jsp.runtime.JspServlet $ JspServletWrapper.service (JspServlet.j\nava: 87)\nà l&#39;adresse com.sun.jsp.runtime.JspServlet.serviceJspFile (JspServlet.java:218)\nà l&#39;adresse com.sun.jsp.runtime.JspServlet.service (JspServlet.java:294)\nà l&#39;adresse javax.servlet.http.HttpServlet.service (HttpServlet.java:840)\nà l&#39;adresse com.sun.web.core.ServletWrapper.handleRequest (ServletWrapper.java:155\n)\nà l&#39;adresse com.sun.web.core.Context.handleRequest (Context.java:414)\nà l&#39;adresse com.sun.web.server.ConnectionHandler.run (ConnectionHandler.java:139)\nPROBLEME DE FIL SUIVANT: java.io.IOException: socket fermé\njava.io.IOException: socket fermé\nsur java.net.PlainSocketImpl.getInputStream (Source inconnue)\nat java.net.Socket $ 1.run (Source inconnue)\nat java.security.AccessController.doPrivileged (Native Method)\nat java.net.Socket.getInputStream (Source inconnue)\nà l&#39;adresse com.sun.web.server.ConnectionHandler.run (ConnectionHandler.java:161)","html":"<p>- Commentaires de la page JSP -\n^\n1 erreur\nà l&#039;adresse com.sun.jsp.compiler.Main.compile (Main.java:347)\nà l&#039;adresse com.sun.jsp.runtime.JspLoader.loadJSP (JspLoader.java:135)\nà l&#039;adresse com.sun.jsp.runtime.JspServlet $ JspServletWrapper.loadIfNecessary (JspS\nervlet.java:77)\nà l&#039;adresse com.sun.jsp.runtime.JspServlet $ JspServletWrapper.service (JspServlet.j\nava: 87)\nà l&#039;adresse com.sun.jsp.runtime.JspServlet.serviceJspFile (JspServlet.java:218)\nà l&#039;adresse com.sun.jsp.runtime.JspServlet.service (JspServlet.java:294)\nà l&#039;adresse javax.servlet.http.HttpServlet.service (HttpServlet.java:840)\nà l&#039;adresse com.sun.web.core.ServletWrapper.handleRequest (ServletWrapper.java:155\n)\nà l&#039;adresse com.sun.web.core.Context.handleRequest (Context.java:414)\nà l&#039;adresse com.sun.web.server.ConnectionHandler.run (ConnectionHandler.java:139)\nPROBLEME DE FIL SUIVANT: java.io.IOException: socket fermé\njava.io.IOException: socket fermé\nsur java.net.PlainSocketImpl.getInputStream (Source inconnue)\nat java.net.Socket $ 1.run (Source inconnue)\nat java.security.AccessController.doPrivileged (Native Method)\nat java.net.Socket.getInputStream (Source inconnue)\nà l&#039;adresse com.sun.web.server.ConnectionHandler.run (ConnectionHandler.java:161)</p>"},{"id":"text-80","type":"text","heading":"","plain_text":"Le répertoire de travail contient le code et le bytecode des servlets générés à partir des JSP.\nPour arrêter le serveur, exécutez simplement le script stopserver.bat.\nLorsque le serveur s&#39;arrête, le répertoire de travail contenant les servlets générés à partir des fichiers JSP est supprimé.","html":"<p>Le répertoire de travail contient le code et le bytecode des servlets générés à partir des JSP.\nPour arrêter le serveur, exécutez simplement le script stopserver.bat.\nLorsque le serveur s&#039;arrête, le répertoire de travail contenant les servlets générés à partir des fichiers JSP est supprimé.</p>"},{"id":"text-81","type":"text","heading":"","plain_text":"73.2.2. Le serveur Tomcat\nLa mise en oeuvre et l’utilisation de Tomcat sont détaillées dans une section du chapitre. &quot;Servlets&quot;.","html":"<p>73.2.2. Le serveur Tomcat\nLa mise en oeuvre et l’utilisation de Tomcat sont détaillées dans une section du chapitre. &quot;Servlets&quot;.</p>"},{"id":"text-82","type":"text","heading":"","plain_text":"Une grande partie du contenu d&#39;une JSP est constituée de code HTML. De plus, la méthode la plus simple pour écrire un fichier JSP consiste à écrire le fichier HTML avec un outil dédié, puis à ajouter les balises JSP pour les pièces dynamiques.\nLa seule restriction sur HTML est l&#39;utilisation de fragments &quot;  Dans ce cas, le moyen le plus simple consiste à utiliser les caractères spéciaux HTML &amp; lt; et &amp; gt; sinon, l&#39;analyseur de moteur JSP considère qu&#39;il s&#39;agit de balises JSP et renvoie une erreur.","html":"<p>Une grande partie du contenu d&#039;une JSP est constituée de code HTML. De plus, la méthode la plus simple pour écrire un fichier JSP consiste à écrire le fichier HTML avec un outil dédié, puis à ajouter les balises JSP pour les pièces dynamiques.\nLa seule restriction sur HTML est l&#039;utilisation de fragments &quot;  Dans ce cas, le moyen le plus simple consiste à utiliser les caractères spéciaux HTML &amp; lt; et &amp; gt; sinon, l&#039;analyseur de moteur JSP considère qu&#039;il s&#039;agit de balises JSP et renvoie une erreur.</p>"},{"id":"text-83","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-84","type":"text","heading":"","plain_text":"Tester","html":"<p>Tester</p>"},{"id":"text-85","type":"text","heading":"","plain_text":"Plusieurs balises JSP commencent par &lt;% et se terminent par% &amp; gt;","html":"<p>Plusieurs balises JSP commencent par &lt;% et se terminent par% &amp; gt;</p>"},{"id":"text-86","type":"text","heading":"","plain_text":"Il existe trois types de tags:","html":"<p>Il existe trois types de tags:</p>"},{"id":"text-87","type":"text","heading":"","plain_text":"balises directive: elles permettent de contrôler la structure du servlet\ngénéré\nbalises de script: elles permettent d&#39;insérer du code Java dans le servlet\nbalises d&#39;action: elles facilitent l&#39;utilisation de composants","html":"<p>balises directive: elles permettent de contrôler la structure du servlet\ngénéré\nbalises de script: elles permettent d&#039;insérer du code Java dans le servlet\nbalises d&#039;action: elles facilitent l&#039;utilisation de composants</p>"},{"id":"text-88","type":"text","heading":"","plain_text":"Avertissement: Les noms de balises sont sensibles à la casse.","html":"<p>Avertissement: Les noms de balises sont sensibles à la casse.</p>"},{"id":"text-89","type":"text","heading":"","plain_text":"73.4.1. Les balises directives \nLes directives vous permettent de spécifier des informations globales sur la page JSP. Les spécifications JSP définissent trois directives:","html":"<p>73.4.1. Les balises directives \nLes directives vous permettent de spécifier des informations globales sur la page JSP. Les spécifications JSP définissent trois directives:</p>"},{"id":"text-90","type":"text","heading":"","plain_text":"page: Définir les options de configuration\ninclude: permet d&#39;inclure des fichiers statiques dans le fichier JSP avant la génération.\nde la servlet\ntaglib: permet de définir des tags personnalisés","html":"<p>page: Définir les options de configuration\ninclude: permet d&#039;inclure des fichiers statiques dans le fichier JSP avant la génération.\nde la servlet\ntaglib: permet de définir des tags personnalisés</p>"},{"id":"text-91","type":"text","heading":"","plain_text":"Leur syntaxe est la suivante:\n&lt;% @ Directif attribut= &quot;valeur&quot;&#8230;%&gt;","html":"<p>Leur syntaxe est la suivante:\n&lt;% @ Directif attribut= &quot;valeur&quot;&#8230;%&gt;</p>"},{"id":"text-92","type":"text","heading":"","plain_text":"73.4.1.1. La directive de page\nCette directive doit être utilisée dans toutes les pages JSP: elle vous permet de définir des options s’appliquant à l’ensemble du JSP.\nIl peut être placé n&#39;importe où dans la source mais il est préférable de le mettre au début du fichier, même avant la balise. . Il peut être utilisé plusieurs fois dans la même page, mais il ne doit définir la valeur d&#39;une option qu&#39;une seule fois, à l&#39;exception de l&#39;option d&#39;importation.\nLes options définies par cette directive sont de la forme option = valeur.","html":"<p>73.4.1.1. La directive de page\nCette directive doit être utilisée dans toutes les pages JSP: elle vous permet de définir des options s’appliquant à l’ensemble du JSP.\nIl peut être placé n&#039;importe où dans la source mais il est préférable de le mettre au début du fichier, même avant la balise. . Il peut être utilisé plusieurs fois dans la même page, mais il ne doit définir la valeur d&#039;une option qu&#039;une seule fois, à l&#039;exception de l&#039;option d&#039;importation.\nLes options définies par cette directive sont de la forme option = valeur.</p>"},{"id":"text-93","type":"text","heading":"","plain_text":"Option","html":"<p>Option</p>"},{"id":"text-94","type":"text","heading":"","plain_text":"Valeur","html":"<p>Valeur</p>"},{"id":"text-95","type":"text","heading":"","plain_text":"Valeur par défaut","html":"<p>Valeur par défaut</p>"},{"id":"text-96","type":"text","heading":"","plain_text":"Autre valeur possible","html":"<p>Autre valeur possible</p>"},{"id":"text-97","type":"text","heading":"","plain_text":"autoFlush","html":"<p>autoFlush</p>"},{"id":"text-98","type":"text","heading":"","plain_text":"Chaîne","html":"<p>Chaîne</p>"},{"id":"text-99","type":"text","heading":"","plain_text":"&quot;Vrai&quot;","html":"<p>&quot;Vrai&quot;</p>"},{"id":"text-100","type":"text","heading":"","plain_text":"&quot;Faux&quot;","html":"<p>&quot;Faux&quot;</p>"},{"id":"text-101","type":"text","heading":"","plain_text":"tampon","html":"<p>tampon</p>"},{"id":"text-102","type":"text","heading":"","plain_text":"Chaîne","html":"<p>Chaîne</p>"},{"id":"text-103","type":"text","heading":"","plain_text":"&quot;8kb&quot;","html":"<p>&quot;8kb&quot;</p>"},{"id":"text-104","type":"text","heading":"","plain_text":"&quot;Aucun&quot; ou &quot;nnnkb&quot; (nnn indiquant la valeur)","html":"<p>&quot;Aucun&quot; ou &quot;nnnkb&quot; (nnn indiquant la valeur)</p>"},{"id":"text-105","type":"text","heading":"","plain_text":"contentType","html":"<p>contentType</p>"},{"id":"text-106","type":"text","heading":"","plain_text":"Une chaîne contenant le type MIME","html":"<p>Une chaîne contenant le type MIME</p>"},{"id":"text-107","type":"text","heading":"","plain_text":"errorPage","html":"<p>errorPage</p>"},{"id":"text-108","type":"text","heading":"","plain_text":"Une chaîne contenant une URL","html":"<p>Une chaîne contenant une URL</p>"},{"id":"text-109","type":"text","heading":"","plain_text":"s&#39;étend","html":"<p>s&#039;étend</p>"},{"id":"text-110","type":"text","heading":"","plain_text":"Une classe","html":"<p>Une classe</p>"},{"id":"text-111","type":"text","heading":"","plain_text":"importation","html":"<p>importation</p>"},{"id":"text-112","type":"text","heading":"","plain_text":"Une classe ou un package. *","html":"<p>Une classe ou un package. *</p>"},{"id":"text-113","type":"text","heading":"","plain_text":"Info","html":"<p>Info</p>"},{"id":"text-114","type":"text","heading":"","plain_text":"Chaîne","html":"<p>Chaîne</p>"},{"id":"text-115","type":"text","heading":"","plain_text":"isErrorPage","html":"<p>isErrorPage</p>"},{"id":"text-116","type":"text","heading":"","plain_text":"Chaîne","html":"<p>Chaîne</p>"},{"id":"text-117","type":"text","heading":"","plain_text":"&quot;Faux&quot;","html":"<p>&quot;Faux&quot;</p>"},{"id":"text-118","type":"text","heading":"","plain_text":"&quot;Vrai&quot;","html":"<p>&quot;Vrai&quot;</p>"},{"id":"text-119","type":"text","heading":"","plain_text":"isThreadSafe","html":"<p>isThreadSafe</p>"},{"id":"text-120","type":"text","heading":"","plain_text":"Chaîne","html":"<p>Chaîne</p>"},{"id":"text-121","type":"text","heading":"","plain_text":"&quot;Vrai&quot;","html":"<p>&quot;Vrai&quot;</p>"},{"id":"text-122","type":"text","heading":"","plain_text":"&quot;Faux&quot;","html":"<p>&quot;Faux&quot;</p>"},{"id":"text-123","type":"text","heading":"","plain_text":"la langue","html":"<p>la langue</p>"},{"id":"text-124","type":"text","heading":"","plain_text":"Chaîne","html":"<p>Chaîne</p>"},{"id":"text-125","type":"text","heading":"","plain_text":"&quot;Java&quot;","html":"<p>&quot;Java&quot;</p>"},{"id":"text-126","type":"text","heading":"","plain_text":"session","html":"<p>session</p>"},{"id":"text-127","type":"text","heading":"","plain_text":"Chaîne","html":"<p>Chaîne</p>"},{"id":"text-128","type":"text","heading":"","plain_text":"&quot;Vrai&quot;","html":"<p>&quot;Vrai&quot;</p>"},{"id":"text-129","type":"text","heading":"","plain_text":"&quot;Faux&quot;","html":"<p>&quot;Faux&quot;</p>"},{"id":"text-130","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-131","type":"text","heading":"","plain_text":"Les options sont:","html":"<p>Les options sont:</p>"},{"id":"text-132","type":"text","heading":"","plain_text":"autoFlush = &quot;vrai| Faux &quot;\nCette option spécifie si le flux de sortie du servlet doit être vidé lorsque\nle tampon est plein. Si la valeur est false, une exception est levée dès que\nle tampon est plein. Nous ne pouvons pas définir false si la valeur du tampon est\naucun.","html":"<p>autoFlush = &quot;vrai| Faux &quot;\nCette option spécifie si le flux de sortie du servlet doit être vidé lorsque\nle tampon est plein. Si la valeur est false, une exception est levée dès que\nle tampon est plein. Nous ne pouvons pas définir false si la valeur du tampon est\naucun.</p>"},{"id":"text-133","type":"text","heading":"","plain_text":"tampon = &quot;aucun |8kb|Taillekb &quot;\nCette option permet de spécifier la taille de la mémoire tampon des données générées contenues\npar l&#39;objet de type JspWriter.","html":"<p>tampon = &quot;aucun |8kb|Taillekb &quot;\nCette option permet de spécifier la taille de la mémoire tampon des données générées contenues\npar l&#039;objet de type JspWriter.</p>"},{"id":"text-134","type":"text","heading":"","plain_text":"contentType = &quot;mimeType [;charset=[;charset=[;charset=[;charset=jeu de caractères ]&quot;\n| &quot;text / html; jeu de caractères = ISO-8859-1&quot; \nCette option spécifie le type MIME des données générées.\nCette option est équivalente à","html":"<p>contentType = &quot;mimeType [;charset=[;charset=[;charset=[;charset=jeu de caractères ]&quot;\n| &quot;text / html; jeu de caractères = ISO-8859-1&quot; \nCette option spécifie le type MIME des données générées.\nCette option est équivalente à</p>"},{"id":"text-135","type":"text","heading":"","plain_text":"errorPage =&quot;RelativeURL&quot;\nCette option vous permet de spécifier le JSP appelé en cas d’exception.\nlevage\nSi l&#39;URL ne commence pas par &amp; # 39; / &amp; # 39 ;, alors l&#39;URL est relative au répertoire\nserveur Web principal sinon il est relatif au répertoire qui contient\nle JSP","html":"<p>errorPage =&quot;RelativeURL&quot;\nCette option vous permet de spécifier le JSP appelé en cas d’exception.\nlevage\nSi l&#039;URL ne commence pas par &amp; # 39; / &amp; # 39 ;, alors l&#039;URL est relative au répertoire\nserveur Web principal sinon il est relatif au répertoire qui contient\nle JSP</p>"},{"id":"text-136","type":"text","heading":"","plain_text":"s&#39;étend= &quot;Package.class&quot;\nCette option vous permet de spécifier la classe qui sera la super classe de l&#39;objet\nJava créé à partir du JSP.","html":"<p>s&#039;étend= &quot;Package.class&quot;\nCette option vous permet de spécifier la classe qui sera la super classe de l&#039;objet\nJava créé à partir du JSP.</p>"},{"id":"text-137","type":"text","heading":"","plain_text":"import = &quot; paquet. * , &#8230; &quot;\nCette option importe les classes contenues dans les packages utilisés.\ndans le code du JSP. Cette option est utilisée comme instruction d&#39;importation\ndans un code source Java. \nChaque classe ou package est séparé par une virgule.\nCette option peut être présente dans plusieurs directives de page.","html":"<p>import = &quot; paquet. * , &#8230; &quot;\nCette option importe les classes contenues dans les packages utilisés.\ndans le code du JSP. Cette option est utilisée comme instruction d&#039;importation\ndans un code source Java. \nChaque classe ou package est séparé par une virgule.\nCette option peut être présente dans plusieurs directives de page.</p>"},{"id":"text-138","type":"text","heading":"","plain_text":"info = &quot;text&quot;\nCette option vous permet de spécifier une petite description du fichier JSP. Le texte fourni\nsera renvoyé par la méthode getServletInfo () du servlet généré.","html":"<p>info = &quot;text&quot;\nCette option vous permet de spécifier une petite description du fichier JSP. Le texte fourni\nsera renvoyé par la méthode getServletInfo () du servlet généré.</p>"},{"id":"text-139","type":"text","heading":"","plain_text":"isErrorPage = &quot;true |faux&quot;\nCette option spécifie si le JSP génère une page d&#39;erreur. La valeur\ntrue permet à l&#39;objet Exception d&#39;être utilisé dans le JSP","html":"<p>isErrorPage = &quot;true |faux&quot;\nCette option spécifie si le JSP génère une page d&#039;erreur. La valeur\ntrue permet à l&#039;objet Exception d&#039;être utilisé dans le JSP</p>"},{"id":"text-140","type":"text","heading":"","plain_text":"isThreadSafe = &quot;vrai| Faux &quot;\nCette option indique si le servlet généré sera multithread: dans ce cas,\nla même instance du servlet peut gérer plusieurs demandes simultanément.\nEn retour, il doit gérer correctement les accès concurrents aux ressources.\nLa valeur false amène le servlet généré à implémenter l&#39;interface SingleThreadModel.","html":"<p>isThreadSafe = &quot;vrai| Faux &quot;\nCette option indique si le servlet généré sera multithread: dans ce cas,\nla même instance du servlet peut gérer plusieurs demandes simultanément.\nEn retour, il doit gérer correctement les accès concurrents aux ressources.\nLa valeur false amène le servlet généré à implémenter l&#039;interface SingleThreadModel.</p>"},{"id":"text-141","type":"text","heading":"","plain_text":"language = &quot;java&quot;\nCette option définit le langage utilisé pour écrire du code dans le JSP. le\nla seule valeur actuellement autorisée est &quot;java&quot;.","html":"<p>language = &quot;java&quot;\nCette option définit le langage utilisé pour écrire du code dans le JSP. le\nla seule valeur actuellement autorisée est &quot;java&quot;.</p>"},{"id":"text-142","type":"text","heading":"","plain_text":"session = &quot;vrai| faux&quot;\nCette option spécifie si le JSP est inclus dans une session ou si\nnon. La valeur par défaut (true) permet l&#39;utilisation d&#39;un objet de session de\nType HttpSession qui gère les informations dans une session.","html":"<p>session = &quot;vrai| faux&quot;\nCette option spécifie si le JSP est inclus dans une session ou si\nnon. La valeur par défaut (true) permet l&#039;utilisation d&#039;un objet de session de\nType HttpSession qui gère les informations dans une session.</p>"},{"id":"text-143","type":"text","heading":"","plain_text":"73.4.1.2. La directive include\nCette directive vous permet d&#39;inclure un fichier dans le code source JSP. Le fichier inclus peut être un extrait de code JSP, HTML ou Java. Le fichier est inclus dans le JSP avant d&#39;être interprété par le moteur JSP.\nCette balise est particulièrement utile pour insérer un élément multi-page commun tel qu&#39;un en-tête ou un pied de page.\nSi le fichier inclus est un fichier HTML, il ne doit pas contenir de balise. , ,  ou  ce qui dupliquerait ceux présents dans le fichier JSP. Cela nécessite l&#39;écriture de fichiers HTML particuliers uniquement pour être inclus dans les JSP: ils ne peuvent pas être utilisés seuls.\nLa syntaxe est la suivante:","html":"<p>73.4.1.2. La directive include\nCette directive vous permet d&#039;inclure un fichier dans le code source JSP. Le fichier inclus peut être un extrait de code JSP, HTML ou Java. Le fichier est inclus dans le JSP avant d&#039;être interprété par le moteur JSP.\nCette balise est particulièrement utile pour insérer un élément multi-page commun tel qu&#039;un en-tête ou un pied de page.\nSi le fichier inclus est un fichier HTML, il ne doit pas contenir de balise. , ,  ou  ce qui dupliquerait ceux présents dans le fichier JSP. Cela nécessite l&#039;écriture de fichiers HTML particuliers uniquement pour être inclus dans les JSP: ils ne peuvent pas être utilisés seuls.\nLa syntaxe est la suivante:</p>"},{"id":"text-144","type":"text","heading":"","plain_text":"Si le chemin commence par &amp; # 39; / # 39 ;, le chemin est relatif au contexte de l&#39;application, sinon il est relatif au fichier JSP.","html":"<p>Si le chemin commence par &amp; # 39; / # 39 ;, le chemin est relatif au contexte de l&#039;application, sinon il est relatif au fichier JSP.</p>"},{"id":"text-145","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-146","type":"text","heading":"","plain_text":"hello.htm:","html":"<p>hello.htm:</p>"},{"id":"text-147","type":"text","heading":"","plain_text":"BONJOUR","html":"<p>BONJOUR</p>"},{"id":"text-148","type":"text","heading":"","plain_text":"Exemple: Test1.jsp","html":"<p>Exemple: Test1.jsp</p>"},{"id":"text-149","type":"text","heading":"","plain_text":"Test de page JSP","html":"<p>Test de page JSP</p>"},{"id":"text-150","type":"text","heading":"","plain_text":"Test d&#39;inclusion d&#39;un fichier dans le JSP","html":"<p>Test d&#039;inclusion d&#039;un fichier dans le JSP</p>"},{"id":"text-151","type":"text","heading":"","plain_text":"fin","html":"<p>fin</p>"},{"id":"text-152","type":"text","heading":"","plain_text":"Pour tester cette JSP avec le JSWDK, placez simplement ces deux fichiers dans le répertoire jswdk-1.0.1  examples  jsp  test.\nPour afficher le fichier JSP, entrez l&#39;URL http: // localhost: 8080 / examples / jsp / test / Test1.jsp dans un navigateur.","html":"<p>Pour tester cette JSP avec le JSWDK, placez simplement ces deux fichiers dans le répertoire jswdk-1.0.1  examples  jsp  test.\nPour afficher le fichier JSP, entrez l&#039;URL http: // localhost: 8080 / examples / jsp / test / Test1.jsp dans un navigateur.</p>"},{"id":"text-153","type":"text","heading":"","plain_text":"Attention: une modification du fichier inclus ne provoque pas de régénération\net une compilation du servlet correspondant au JSP. Pour insérer un\nfichier dynamiquement lors de l&#39;exécution du servlet, il est nécessaire d&#39;utiliser la balise\n      .","html":"<p>Attention: une modification du fichier inclus ne provoque pas de régénération\net une compilation du servlet correspondant au JSP. Pour insérer un\nfichier dynamiquement lors de l&#039;exécution du servlet, il est nécessaire d&#039;utiliser la balise\n      .</p>"},{"id":"text-154","type":"text","heading":"","plain_text":"73.4.1.3. La directive taglib\nCette directive déclare l&#39;utilisation d&#39;une bibliothèque de balises personnalisée. L&#39;utilisation de cette directive est détaillée dans la section consacrée aux bibliothèques de balises personnalisées.","html":"<p>73.4.1.3. La directive taglib\nCette directive déclare l&#039;utilisation d&#039;une bibliothèque de balises personnalisée. L&#039;utilisation de cette directive est détaillée dans la section consacrée aux bibliothèques de balises personnalisées.</p>"},{"id":"text-155","type":"text","heading":"","plain_text":"73.4.2. Tags de script\nCes balises sont utilisées pour insérer du code Java qui sera inclus dans le servlet généré à partir du JSP. Il existe trois balises pour l&#39;insertion de code Java:","html":"<p>73.4.2. Tags de script\nCes balises sont utilisées pour insérer du code Java qui sera inclus dans le servlet généré à partir du JSP. Il existe trois balises pour l&#039;insertion de code Java:</p>"},{"id":"text-156","type":"text","heading":"","plain_text":"la balise de déclaration: le code Java est inclus dans le corps du servlet\ngénéré. Ce code peut être la déclaration de variables d&#39;instance ou de classe ou la déclaration de méthodes.\nla balise expression: évalue une expression et insère le résultat dans la forme\nchaîne dans la page Web générée.\nla balise scriptlets: Par défaut, le code Java est inclus dans la méthode service () du servlet.","html":"<p>la balise de déclaration: le code Java est inclus dans le corps du servlet\ngénéré. Ce code peut être la déclaration de variables d&#039;instance ou de classe ou la déclaration de méthodes.\nla balise expression: évalue une expression et insère le résultat dans la forme\nchaîne dans la page Web générée.\nla balise scriptlets: Par défaut, le code Java est inclus dans la méthode service () du servlet.</p>"},{"id":"text-157","type":"text","heading":"","plain_text":"Il est possible d&#39;utiliser dans ces balises plusieurs objets définis par les JSP.","html":"<p>Il est possible d&#039;utiliser dans ces balises plusieurs objets définis par les JSP.</p>"},{"id":"text-158","type":"text","heading":"","plain_text":"73.4.2.1. La balise de déclaration \nCette balise est utilisée pour déclarer des variables ou des méthodes pouvant être utilisées dans le JSP. Il ne génère aucun caractère dans le fichier HTML de sortie.\nLa syntaxe est la suivante:","html":"<p>73.4.2.1. La balise de déclaration \nCette balise est utilisée pour déclarer des variables ou des méthodes pouvant être utilisées dans le JSP. Il ne génère aucun caractère dans le fichier HTML de sortie.\nLa syntaxe est la suivante:</p>"},{"id":"text-159","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-160","type":"text","heading":"","plain_text":"Les variables déclarées de cette manière peuvent être utilisées dans les balises d&#39;expression et de scriptlet.\nIl est possible de déclarer plusieurs variables dans la même balise en les séparant avec &amp; # 39 ;; &amp; # 39; personnages.\nCette balise vous permet également d’insérer des méthodes dans le corps du servlet.","html":"<p>Les variables déclarées de cette manière peuvent être utilisées dans les balises d&#039;expression et de scriptlet.\nIl est possible de déclarer plusieurs variables dans la même balise en les séparant avec &amp; # 39 ;; &amp; # 39; personnages.\nCette balise vous permet également d’insérer des méthodes dans le corps du servlet.</p>"},{"id":"text-161","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-162","type":"text","heading":"","plain_text":"Tester","html":"<p>Tester</p>"},{"id":"text-163","type":"text","heading":"","plain_text":"&lt;%!\nint minimum (int val1, int val2) \nsi (val1 < val2) return val1;\n   else return val2;\n \n%>","html":"<p>&lt;%!\nint minimum (int val1, int val2) \nsi (val1 &lt; val2) return val1;\n   else return val2;\n \n%&gt;</p>"},{"id":"text-164","type":"text","heading":"","plain_text":"Le plus petit des 5 et 3 est","html":"<p>Le plus petit des 5 et 3 est</p>"},{"id":"text-165","type":"text","heading":"","plain_text":"73.4.2.2. La balise d&#39;expression \nLe moteur JSP remplace cette balise par le résultat de l&#39;évaluation de l&#39;expression présente dans la balise.\nCe résultat est toujours converti en chaîne. Cette balise est un raccourci pour éviter d’utiliser la méthode println () lors de l’insertion de données dynamiques dans le fichier HTML.\nLa syntaxe est la suivante:","html":"<p>73.4.2.2. La balise d&#039;expression \nLe moteur JSP remplace cette balise par le résultat de l&#039;évaluation de l&#039;expression présente dans la balise.\nCe résultat est toujours converti en chaîne. Cette balise est un raccourci pour éviter d’utiliser la méthode println () lors de l’insertion de données dynamiques dans le fichier HTML.\nLa syntaxe est la suivante:</p>"},{"id":"text-166","type":"text","heading":"","plain_text":"Le signe &amp; # 39; = &amp; # 39; doit être collé sous le signe%.","html":"<p>Le signe &amp; # 39; = &amp; # 39; doit être collé sous le signe%.</p>"},{"id":"text-167","type":"text","heading":"","plain_text":"Attention: ne mettez pas &amp; # 39; &amp; # 39; &amp; # 39; &amp; # 39; à la fin de l&#39;expression.","html":"<p>Attention: ne mettez pas &amp; # 39; &amp; # 39; &amp; # 39; &amp; # 39; à la fin de l&#039;expression.</p>"},{"id":"text-168","type":"text","heading":"","plain_text":"Exemple: insertion de la date dans la page HTML","html":"<p>Exemple: insertion de la date dans la page HTML</p>"},{"id":"text-169","type":"text","heading":"","plain_text":"Test de page JSP","html":"<p>Test de page JSP</p>"},{"id":"text-170","type":"text","heading":"","plain_text":"Date d&#39;aujourd&#39;hui:","html":"<p>Date d&#039;aujourd&#039;hui:</p>"},{"id":"text-171","type":"text","heading":"","plain_text":"Résultat:","html":"<p>Résultat:</p>"},{"id":"text-172","type":"text","heading":"","plain_text":"Date du jour: jeu 15 fév 11:15:24 CET 2001","html":"<p>Date du jour: jeu 15 fév 11:15:24 CET 2001</p>"},{"id":"text-173","type":"text","heading":"","plain_text":"L&#39;expression est évaluée et convertie en une chaîne avec un appel à la méthode toString (). Cette chaîne est insérée dans la page HTML à la place de la balise. Il est possible que le résultat corresponde à une partie ou à la totalité d&#39;une balise HTML ou même à une JSP","html":"<p>L&#039;expression est évaluée et convertie en une chaîne avec un appel à la méthode toString (). Cette chaîne est insérée dans la page HTML à la place de la balise. Il est possible que le résultat corresponde à une partie ou à la totalité d&#039;une balise HTML ou même à une JSP</p>"},{"id":"text-174","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-175","type":"text","heading":"","plain_text":"Test de page JSP","html":"<p>Test de page JSP</p>"},{"id":"text-176","type":"text","heading":"","plain_text":"&lt;% = &quot;&quot;%&gt; Bonjour &lt;% =&quot;&quot;%&gt;","html":"<p>&lt;% = &quot;&quot;%&gt; Bonjour &lt;% =&quot;&quot;%&gt;</p>"},{"id":"text-177","type":"text","heading":"","plain_text":"Résultat: code HTML généré","html":"<p>Résultat: code HTML généré</p>"},{"id":"text-178","type":"text","heading":"","plain_text":"Test de page JSP","html":"<p>Test de page JSP</p>"},{"id":"text-179","type":"text","heading":"","plain_text":"Bonjour","html":"<p>Bonjour</p>"},{"id":"text-180","type":"text","heading":"","plain_text":"73.4.2.3. Les variables implicites\nLes spécifications JSP définissent plusieurs objets utilisables dans le code, les plus utiles étant:","html":"<p>73.4.2.3. Les variables implicites\nLes spécifications JSP définissent plusieurs objets utilisables dans le code, les plus utiles étant:</p>"},{"id":"text-181","type":"text","heading":"","plain_text":"Objet","html":"<p>Objet</p>"},{"id":"text-182","type":"text","heading":"","plain_text":"Classe","html":"<p>Classe</p>"},{"id":"text-183","type":"text","heading":"","plain_text":"Rôle","html":"<p>Rôle</p>"},{"id":"text-184","type":"text","heading":"","plain_text":"en dehors","html":"<p>en dehors</p>"},{"id":"text-185","type":"text","heading":"","plain_text":"javax.servlet.jsp.JspWriter","html":"<p>javax.servlet.jsp.JspWriter</p>"},{"id":"text-186","type":"text","heading":"","plain_text":"Flux de sortie de la page HTML générée","html":"<p>Flux de sortie de la page HTML générée</p>"},{"id":"text-187","type":"text","heading":"","plain_text":"demande","html":"<p>demande</p>"},{"id":"text-188","type":"text","heading":"","plain_text":"javax.servlet.http.HttpServletRequest","html":"<p>javax.servlet.http.HttpServletRequest</p>"},{"id":"text-189","type":"text","heading":"","plain_text":"Contient les informations de la requête","html":"<p>Contient les informations de la requête</p>"},{"id":"text-190","type":"text","heading":"","plain_text":"réponse","html":"<p>réponse</p>"},{"id":"text-191","type":"text","heading":"","plain_text":"javax.servlet.http.HttpServletResponse","html":"<p>javax.servlet.http.HttpServletResponse</p>"},{"id":"text-192","type":"text","heading":"","plain_text":"Contient l&#39;information de réponse","html":"<p>Contient l&#039;information de réponse</p>"},{"id":"text-193","type":"text","heading":"","plain_text":"session","html":"<p>session</p>"},{"id":"text-194","type":"text","heading":"","plain_text":"javax.servlet.http.HttpSession","html":"<p>javax.servlet.http.HttpSession</p>"},{"id":"text-195","type":"text","heading":"","plain_text":"Gère la session","html":"<p>Gère la session</p>"},{"id":"text-196","type":"text","heading":"","plain_text":"73.4.2.4. La balise scriptlets \nCette balise contient du code Java nommé scriptlet.\nLa syntaxe est la suivante:","html":"<p>73.4.2.4. La balise scriptlets \nCette balise contient du code Java nommé scriptlet.\nLa syntaxe est la suivante:</p>"},{"id":"text-197","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-198","type":"text","heading":"","plain_text":"Date d&#39;aujourd&#39;hui:","html":"<p>Date d&#039;aujourd&#039;hui:</p>"},{"id":"text-199","type":"text","heading":"","plain_text":"Par défaut, le code inclus dans la balise est inséré dans la méthode service () du servlet généré à partir du JSP.\nCette balise ne peut contenir autre chose que du code Java: elle ne peut pas contenir par exemple des balises HTML ou JSP. Pour ce faire, vous devez fermer la balise de scriptlet, placer la balise HTML ou JSP, puis redémarrer une balise de scriptlet pour continuer le code.","html":"<p>Par défaut, le code inclus dans la balise est inséré dans la méthode service () du servlet généré à partir du JSP.\nCette balise ne peut contenir autre chose que du code Java: elle ne peut pas contenir par exemple des balises HTML ou JSP. Pour ce faire, vous devez fermer la balise de scriptlet, placer la balise HTML ou JSP, puis redémarrer une balise de scriptlet pour continuer le code.</p>"},{"id":"text-200","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-201","type":"text","heading":"","plain_text":"Test de page JSP","html":"<p>Test de page JSP</p>"},{"id":"text-202","type":"text","heading":"","plain_text":"&lt;% pour (int i = 0; i","html":"<p>&lt;% pour (int i = 0; i</p>"},{"id":"text-203","type":"text","heading":"","plain_text":"Résultat: la page HTML générée","html":"<p>Résultat: la page HTML générée</p>"},{"id":"text-204","type":"text","heading":"","plain_text":"Test de page JSP","html":"<p>Test de page JSP</p>"},{"id":"text-205","type":"text","heading":"","plain_text":"0 \n1 \n2 \n3 \n4 \n5 \n6 \n7 \n8 \n9","html":"<p>0 \n1 \n2 \n3 \n4 \n5 \n6 \n7 \n8 \n9</p>"},{"id":"text-206","type":"text","heading":"","plain_text":"73.4.3. Tags de commentaire\nIl existe deux types de commentaires avec les JSP:","html":"<p>73.4.3. Tags de commentaire\nIl existe deux types de commentaires avec les JSP:</p>"},{"id":"text-207","type":"text","heading":"","plain_text":"commentaires visibles dans le code HTML\ncommentaires invisibles dans le code HTML","html":"<p>commentaires visibles dans le code HTML\ncommentaires invisibles dans le code HTML</p>"},{"id":"text-208","type":"text","heading":"","plain_text":"73.4.3.1. Commentaires HTML \nCes commentaires sont ceux définis par le format HTML. Ils sont entièrement reproduits dans le fichier HTML généré. Il est possible d&#39;insérer dans cette balise une balise JSP de type expression à exécuter.\nLa syntaxe est la suivante:\n&lt;! &#8211; commentaires[[[[ ]-&gt;","html":"<p>73.4.3.1. Commentaires HTML \nCes commentaires sont ceux définis par le format HTML. Ils sont entièrement reproduits dans le fichier HTML généré. Il est possible d&#039;insérer dans cette balise une balise JSP de type expression à exécuter.\nLa syntaxe est la suivante:\n&lt;! &#8211; commentaires[[[[ ]-&gt;</p>"},{"id":"text-209","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-210","type":"text","heading":"","plain_text":"Test de page JSP","html":"<p>Test de page JSP</p>"},{"id":"text-211","type":"text","heading":"","plain_text":"&lt;! - Cette page a été générée sur  -&gt;\nBonjour","html":"<p>&lt;! - Cette page a été générée sur  -&gt;\nBonjour</p>"},{"id":"text-212","type":"text","heading":"","plain_text":"Résultat:","html":"<p>Résultat:</p>"},{"id":"text-213","type":"text","heading":"","plain_text":"Test de page JSP","html":"<p>Test de page JSP</p>"},{"id":"text-214","type":"text","heading":"","plain_text":"Bonjour","html":"<p>Bonjour</p>"},{"id":"text-215","type":"text","heading":"","plain_text":"Le contenu d&#39;une expression incluse dans les commentaires est dynamique: sa valeur peut changer à chaque génération de la page en fonction de son contenu.","html":"<p>Le contenu d&#039;une expression incluse dans les commentaires est dynamique: sa valeur peut changer à chaque génération de la page en fonction de son contenu.</p>"},{"id":"text-216","type":"text","heading":"","plain_text":"73.4.3.2. Commentaires cachés \nLes commentaires masqués sont utilisés pour documenter la page JSP. Leur contenu est ignoré par le moteur JSP et n&#39;est donc pas reproduit dans la page HTML générée.\nLa syntaxe est la suivante:","html":"<p>73.4.3.2. Commentaires cachés \nLes commentaires masqués sont utilisés pour documenter la page JSP. Leur contenu est ignoré par le moteur JSP et n&#039;est donc pas reproduit dans la page HTML générée.\nLa syntaxe est la suivante:</p>"},{"id":"text-217","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-218","type":"text","heading":"","plain_text":"Test de page JSP","html":"<p>Test de page JSP</p>"},{"id":"text-219","type":"text","heading":"","plain_text":"Bonjour","html":"<p>Bonjour</p>"},{"id":"text-220","type":"text","heading":"","plain_text":"Résultat:","html":"<p>Résultat:</p>"},{"id":"text-221","type":"text","heading":"","plain_text":"Test de page JSP","html":"<p>Test de page JSP</p>"},{"id":"text-222","type":"text","heading":"","plain_text":"Bonjour","html":"<p>Bonjour</p>"},{"id":"text-223","type":"text","heading":"","plain_text":"Cette balise peut être utile pour éviter l&#39;exécution de code pendant la phase de débogage.","html":"<p>Cette balise peut être utile pour éviter l&#039;exécution de code pendant la phase de débogage.</p>"},{"id":"text-224","type":"text","heading":"","plain_text":"73.4.4. Les balises d&#39;action\nLes étiquettes d&#39;action permettent d&#39;effectuer des traitements couramment utilisés.","html":"<p>73.4.4. Les balises d&#039;action\nLes étiquettes d&#039;action permettent d&#039;effectuer des traitements couramment utilisés.</p>"},{"id":"text-225","type":"text","heading":"","plain_text":"73.4.4.1. Le tag \nLe tag  vous permet de localiser une instance ou d&#39;instancier un bean à utiliser dans le fichier JSP.\nL&#39;utilisation d&#39;un bean dans une JSP est très pratique car elle peut encapsuler des processus complexes et être réutilisée par d&#39;autres JSP ou composants. Par exemple, le bean peut fournir un accès à une base de données. L&#39;utilisation de beans simplifie les processus inclus dans le JSP.\nLors de l&#39;instanciation d&#39;un bean, nous spécifions la portée du bean. Si le bean demandé est déjà instancié pour la portée spécifiée, aucune nouvelle instance du bean n&#39;est créée, mais sa référence est simplement renvoyée: la balise  n&#39;instancie pas nécessairement un objet.\nCette balise ne permet pas de traiter directement EJB.\nLa syntaxe est la suivante:\n&lt;Jsp: useBeanid = &quot;beanInstanceName &quot;scope = &quot;page| Demande | session | application &quot;\nbeanName = &quot; &lt;% = expression %&gt; &quot;type =&quot;package.class&quot;\n/&gt; \nL&#39;attribut id est utilisé pour donner un nom à la variable qui contiendra la référence sur le bean.\nL&#39;attribut scope permet de définir la portée sur laquelle le bean est défini et utilisable. La valeur de cet attribut détermine la manière dont la balise localise ou instancie le bean. Les valeurs possibles sont:","html":"<p>73.4.4.1. Le tag \nLe tag  vous permet de localiser une instance ou d&#039;instancier un bean à utiliser dans le fichier JSP.\nL&#039;utilisation d&#039;un bean dans une JSP est très pratique car elle peut encapsuler des processus complexes et être réutilisée par d&#039;autres JSP ou composants. Par exemple, le bean peut fournir un accès à une base de données. L&#039;utilisation de beans simplifie les processus inclus dans le JSP.\nLors de l&#039;instanciation d&#039;un bean, nous spécifions la portée du bean. Si le bean demandé est déjà instancié pour la portée spécifiée, aucune nouvelle instance du bean n&#039;est créée, mais sa référence est simplement renvoyée: la balise  n&#039;instancie pas nécessairement un objet.\nCette balise ne permet pas de traiter directement EJB.\nLa syntaxe est la suivante:\n&lt;Jsp: useBeanid = &quot;beanInstanceName &quot;scope = &quot;page| Demande | session | application &quot;\nbeanName = &quot; &lt;% = expression %&gt; &quot;type =&quot;package.class&quot;\n/&gt; \nL&#039;attribut id est utilisé pour donner un nom à la variable qui contiendra la référence sur le bean.\nL&#039;attribut scope permet de définir la portée sur laquelle le bean est défini et utilisable. La valeur de cet attribut détermine la manière dont la balise localise ou instancie le bean. Les valeurs possibles sont:</p>"},{"id":"text-226","type":"text","heading":"","plain_text":"Valeur","html":"<p>Valeur</p>"},{"id":"text-227","type":"text","heading":"","plain_text":"Rôle","html":"<p>Rôle</p>"},{"id":"text-228","type":"text","heading":"","plain_text":"page","html":"<p>page</p>"},{"id":"text-229","type":"text","heading":"","plain_text":"Le haricot peut être utilisé sur toute la page\nJSP ainsi que dans les fichiers statiques inclus.\nC&#39;est la valeur par défaut.","html":"<p>Le haricot peut être utilisé sur toute la page\nJSP ainsi que dans les fichiers statiques inclus.\nC&#039;est la valeur par défaut.</p>"},{"id":"text-230","type":"text","heading":"","plain_text":"demande\n    le haricot est accessible pendant la durée de vie de la demande.\nLa méthode getAttribute () de l&#39;objet request fournit une référence\nsur le haricot.","html":"<p>demande\n    le haricot est accessible pendant la durée de vie de la demande.\nLa méthode getAttribute () de l&#039;objet request fournit une référence\nsur le haricot.</p>"},{"id":"text-231","type":"text","heading":"","plain_text":"session\n   \n    le haricot est utilisable par tous les JSP qui appartiennent\nà la même session que le JSP qui a instancié le bean. Le haricot est utilisable\ntout au long de la session par toutes les pages qui y participent. Le JSP\nqui crée le bean doit avoir l&#39;attribut session = &quot;true&quot; dans sa directive\npage.","html":"<p>session\n   \n    le haricot est utilisable par tous les JSP qui appartiennent\nà la même session que le JSP qui a instancié le bean. Le haricot est utilisable\ntout au long de la session par toutes les pages qui y participent. Le JSP\nqui crée le bean doit avoir l&#039;attribut session = &quot;true&quot; dans sa directive\npage.</p>"},{"id":"text-232","type":"text","heading":"","plain_text":"application\n   \n    le haricot est utilisable par tous les JSP qui appartiennent\nà la même application que le JSP qui a instancié le bean. Le haricot est\ninstancié uniquement lors du rechargement de l&#39;application.","html":"<p>application\n   \n    le haricot est utilisable par tous les JSP qui appartiennent\nà la même application que le JSP qui a instancié le bean. Le haricot est\ninstancié uniquement lors du rechargement de l&#039;application.</p>"},{"id":"text-233","type":"text","heading":"","plain_text":"L&#39;attribut class est utilisé pour indiquer la classe du bean.\nL&#39;attribut type est utilisé pour spécifier le type de la variable qui contiendra la référence du bean. La valeur spécifiée doit être une super classe du bean ou une interface implémentée par le bean (directement ou par héritage).\nL&#39;attribut beanName est utilisé pour instancier le bean à l&#39;aide de la méthode instanciate () de la classe Beans.","html":"<p>L&#039;attribut class est utilisé pour indiquer la classe du bean.\nL&#039;attribut type est utilisé pour spécifier le type de la variable qui contiendra la référence du bean. La valeur spécifiée doit être une super classe du bean ou une interface implémentée par le bean (directement ou par héritage).\nL&#039;attribut beanName est utilisé pour instancier le bean à l&#039;aide de la méthode instanciate () de la classe Beans.</p>"},{"id":"text-234","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-235","type":"text","heading":"","plain_text":"Dans cet exemple, une instance de MonBean est créée une fois dans la session. Dans la même session, l&#39;appel de la balise  avec le même bean et la même portée ne renverra que l&#39;instance créée. Le haricot est donc accessible tout au long de la session.\nLe tag  recherche si une instance du bean existe avec le nom et la portée spécifiés. S&#39;il n&#39;existe pas, une instance est créée. S&#39;il y a instanciation du haricot, alors les balises  inclus dans la balise sont utilisés pour initialiser les propriétés du bean, sinon ils sont ignorés. Tags inclus entre les tags  et  ne sont exécutés que si le haricot est instancié.","html":"<p>Dans cet exemple, une instance de MonBean est créée une fois dans la session. Dans la même session, l&#039;appel de la balise  avec le même bean et la même portée ne renverra que l&#039;instance créée. Le haricot est donc accessible tout au long de la session.\nLe tag  recherche si une instance du bean existe avec le nom et la portée spécifiés. S&#039;il n&#039;existe pas, une instance est créée. S&#039;il y a instanciation du haricot, alors les balises  inclus dans la balise sont utilisés pour initialiser les propriétés du bean, sinon ils sont ignorés. Tags inclus entre les tags  et  ne sont exécutés que si le haricot est instancié.</p>"},{"id":"text-236","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-237","type":"text","heading":"","plain_text":"Cet exemple a le même effet que le précédent avec une initialisation des propriétés du bean lors de son instanciation.","html":"<p>Cet exemple a le même effet que le précédent avec une initialisation des propriétés du bean lors de son instanciation.</p>"},{"id":"text-238","type":"text","heading":"","plain_text":"Exemple complet: TestBean.jsp","html":"<p>Exemple complet: TestBean.jsp</p>"},{"id":"text-239","type":"text","heading":"","plain_text":"Test d&#39;instanciation d&#39;un haricot dans un JSP","html":"<p>Test d&#039;instanciation d&#039;un haricot dans un JSP</p>"},{"id":"text-240","type":"text","heading":"","plain_text":"Test d&#39;utilisation d&#39;un bean dans un JSP","html":"<p>Test d&#039;utilisation d&#039;un bean dans un JSP</p>"},{"id":"text-241","type":"text","heading":"","plain_text":"nom initial =","html":"<p>nom initial =</p>"},{"id":"text-242","type":"text","heading":"","plain_text":"nom mis à jour =","html":"<p>nom mis à jour =</p>"},{"id":"text-243","type":"text","heading":"","plain_text":"Exemple complet: Person.java","html":"<p>Exemple complet: Person.java</p>"},{"id":"text-244","type":"text","heading":"","plain_text":"paquet de test;\nClasse publique Personne \nnom de chaîne privé;\nprivate String prenom;","html":"<p>paquet de test;\nClasse publique Personne \nnom de chaîne privé;\nprivate String prenom;</p>"},{"id":"text-245","type":"text","heading":"","plain_text":"personne publique () \nthis.name = &quot;nom par défaut&quot;;\nthis.prenom = &quot;nom par défaut&quot;;","html":"<p>personne publique () \nthis.name = &quot;nom par défaut&quot;;\nthis.prenom = &quot;nom par défaut&quot;;</p>"},{"id":"text-246","type":"text","heading":"","plain_text":"public void setName (nom de chaîne) \nthis.name = name;","html":"<p>public void setName (nom de chaîne) \nthis.name = name;</p>"},{"id":"text-247","type":"text","heading":"","plain_text":"public String getName () \nreturn (this.name);","html":"<p>public String getName () \nreturn (this.name);</p>"},{"id":"text-248","type":"text","heading":"","plain_text":"public void setPenom (String name) \nthis.prenom = prénom;","html":"<p>public void setPenom (String name) \nthis.prenom = prénom;</p>"},{"id":"text-249","type":"text","heading":"","plain_text":"public String getPrenom () \nretour (this.prenom);","html":"<p>public String getPrenom () \nretour (this.prenom);</p>"},{"id":"text-250","type":"text","heading":"","plain_text":"Selon le moteur JSP utilisé, les fichiers bean doivent être placés dans un répertoire particulier pour être accessibles par JSP.\nPour tester cette JSP avec Tomcat, vous devez compiler le bean Person dans le répertoire c:  jakarta-tomcat  webapps  examples  web-inf  classes  test et placer le fichier TestBean.jsp dans le répertoire c:  jakarta-tomcat. répertoire  webapps  examples  jsp  test.","html":"<p>Selon le moteur JSP utilisé, les fichiers bean doivent être placés dans un répertoire particulier pour être accessibles par JSP.\nPour tester cette JSP avec Tomcat, vous devez compiler le bean Person dans le répertoire c:  jakarta-tomcat  webapps  examples  web-inf  classes  test et placer le fichier TestBean.jsp dans le répertoire c:  jakarta-tomcat. répertoire  webapps  examples  jsp  test.</p>"},{"id":"text-251","type":"text","heading":"","plain_text":"73.4.4.2. Le tag \nLe tag  vous permet de mettre à jour la valeur d&#39;un ou plusieurs attributs d&#39;un bean. La balise utilise la méthode setter (setXXX () où XXX est le nom de la propriété avec la première lettre en majuscule) pour mettre à jour la valeur. Le haricot doit exister via un appel à la balise .\nIl existe trois façons de mettre à jour les propriétés à partir des paramètres de la requête ou avec une valeur:","html":"<p>73.4.4.2. Le tag \nLe tag  vous permet de mettre à jour la valeur d&#039;un ou plusieurs attributs d&#039;un bean. La balise utilise la méthode setter (setXXX () où XXX est le nom de la propriété avec la première lettre en majuscule) pour mettre à jour la valeur. Le haricot doit exister via un appel à la balise .\nIl existe trois façons de mettre à jour les propriétés à partir des paramètres de la requête ou avec une valeur:</p>"},{"id":"text-252","type":"text","heading":"","plain_text":"alimente automatiquement toutes les propriétés avec les paramètres correspondants de la requête\nnourrir automatiquement une propriété avec le paramètre de requête\ncorrespondant\nfournir une propriété avec la valeur spécifiée","html":"<p>alimente automatiquement toutes les propriétés avec les paramètres correspondants de la requête\nnourrir automatiquement une propriété avec le paramètre de requête\ncorrespondant\nfournir une propriété avec la valeur spécifiée</p>"},{"id":"text-253","type":"text","heading":"","plain_text":"La syntaxe est la suivante:\n&lt;jsp: setProperty name = &quot;beanInstanceName&quot;\npropriété = &quot;nom de la propriété&quot;valeur =&quot;  &lt;% = expression%&gt; &quot;\n/&gt;\nL&#39;attribut name doit contenir le nom de la variable contenant la référence du bean. Cette valeur doit être identique à celle de l&#39;attribut id de la balise  utilisé pour instancier le haricot.\nL&#39;attribut property = &quot;*&quot; est utilisé pour alimenter automatiquement les propriétés du bean avec les paramètres correspondants contenus dans la requête. Le nom des propriétés et le nom des paramètres doivent être identiques.\nLes paramètres de la requête étant toujours fournis sous forme de chaîne, une conversion est effectuée à l&#39;aide de la méthode valueOf () du wrapper du type de propriété.","html":"<p>La syntaxe est la suivante:\n&lt;jsp: setProperty name = &quot;beanInstanceName&quot;\npropriété = &quot;nom de la propriété&quot;valeur =&quot;  &lt;% = expression%&gt; &quot;\n/&gt;\nL&#039;attribut name doit contenir le nom de la variable contenant la référence du bean. Cette valeur doit être identique à celle de l&#039;attribut id de la balise  utilisé pour instancier le haricot.\nL&#039;attribut property = &quot;*&quot; est utilisé pour alimenter automatiquement les propriétés du bean avec les paramètres correspondants contenus dans la requête. Le nom des propriétés et le nom des paramètres doivent être identiques.\nLes paramètres de la requête étant toujours fournis sous forme de chaîne, une conversion est effectuée à l&#039;aide de la méthode valueOf () du wrapper du type de propriété.</p>"},{"id":"text-254","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-255","type":"text","heading":"","plain_text":"La propriété d&#39;attribut = &quot;propertyName &quot;[param=&quot;[param=&quot;[param= »[param= »paramètreName &quot;]permet de mettre à jour un attribut du haricot. Par défaut, l&#39;alimentation est automatiquement effectuée avec le paramètre correspondant dans la requête. Si le nom de la propriété et le paramètre sont différents, il est nécessaire de spécifier la propriété d&#39;attribut et l&#39;attribut param contenant le nom du paramètre qui alimentera la propriété du bean.","html":"<p>La propriété d&#039;attribut = &quot;propertyName &quot;[param=&quot;[param=&quot;[param= »[param= »paramètreName &quot;]permet de mettre à jour un attribut du haricot. Par défaut, l&#039;alimentation est automatiquement effectuée avec le paramètre correspondant dans la requête. Si le nom de la propriété et le paramètre sont différents, il est nécessaire de spécifier la propriété d&#039;attribut et l&#039;attribut param contenant le nom du paramètre qui alimentera la propriété du bean.</p>"},{"id":"text-256","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-257","type":"text","heading":"","plain_text":"La propriété d&#39;attribut = &quot;propertyName &quot;valeur =&quot; chaîne  &quot;alimente la propriété du bean avec une valeur particulière.","html":"<p>La propriété d&#039;attribut = &quot;propertyName &quot;valeur =&quot; chaîne  &quot;alimente la propriété du bean avec une valeur particulière.</p>"},{"id":"text-258","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-259","type":"text","heading":"","plain_text":"Il n&#39;est pas possible d&#39;utiliser param et value dans la même balise.","html":"<p>Il n&#039;est pas possible d&#039;utiliser param et value dans la même balise.</p>"},{"id":"text-260","type":"text","heading":"","plain_text":"Exemple: Cet exemple est identique au précédent","html":"<p>Exemple: Cet exemple est identique au précédent</p>"},{"id":"text-261","type":"text","heading":"","plain_text":"Test d&#39;instanciation d&#39;un haricot dans un JSP","html":"<p>Test d&#039;instanciation d&#039;un haricot dans un JSP</p>"},{"id":"text-262","type":"text","heading":"","plain_text":"Test d&#39;utilisation d&#39;un bean dans un JSP","html":"<p>Test d&#039;utilisation d&#039;un bean dans un JSP</p>"},{"id":"text-263","type":"text","heading":"","plain_text":"nom initial =","html":"<p>nom initial =</p>"},{"id":"text-264","type":"text","heading":"","plain_text":"nom mis à jour =","html":"<p>nom mis à jour =</p>"},{"id":"text-265","type":"text","heading":"","plain_text":"Cette balise peut être utilisée entre les balises  et  initialiser les propriétés du haricot lors de son instanciation.","html":"<p>Cette balise peut être utilisée entre les balises  et  initialiser les propriétés du haricot lors de son instanciation.</p>"},{"id":"text-266","type":"text","heading":"","plain_text":"73.4.4.3. Le tag \nLe tag  Obtenir la valeur d&#39;un attribut d&#39;un haricot. La balise utilise la méthode getter (getXXX () où XXX est le nom de la propriété avec la première lettre en majuscule) pour obtenir la valeur et l&#39;insérer dans la page HTML générée. Le haricot doit exister via un appel à la balise .\nLa syntaxe est la suivante:\n&lt;jsp: getProperty name = &quot;beanInstanceName&quot;propriété =&quot; nom de la propriété« />\nL&#39;attribut name indique le nom du bean tel que déclaré dans la balise .\nL&#39;attribut de propriété indique le nom de la propriété dont nous voulons la valeur.","html":"<p>73.4.4.3. Le tag \nLe tag  Obtenir la valeur d&#039;un attribut d&#039;un haricot. La balise utilise la méthode getter (getXXX () où XXX est le nom de la propriété avec la première lettre en majuscule) pour obtenir la valeur et l&#039;insérer dans la page HTML générée. Le haricot doit exister via un appel à la balise .\nLa syntaxe est la suivante:\n&lt;jsp: getProperty name = &quot;beanInstanceName&quot;propriété =&quot; nom de la propriété« /&gt;\nL&#039;attribut name indique le nom du bean tel que déclaré dans la balise .\nL&#039;attribut de propriété indique le nom de la propriété dont nous voulons la valeur.</p>"},{"id":"text-267","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-268","type":"text","heading":"","plain_text":"Test d&#39;instanciation d&#39;un haricot dans un JSP","html":"<p>Test d&#039;instanciation d&#039;un haricot dans un JSP</p>"},{"id":"text-269","type":"text","heading":"","plain_text":"Test d&#39;utilisation d&#39;un bean dans un JSP","html":"<p>Test d&#039;utilisation d&#039;un bean dans un JSP</p>"},{"id":"text-270","type":"text","heading":"","plain_text":"nom initial =","html":"<p>nom initial =</p>"},{"id":"text-271","type":"text","heading":"","plain_text":"nom mis à jour =","html":"<p>nom mis à jour =</p>"},{"id":"text-272","type":"text","heading":"","plain_text":"Attention: cette balise n&#39;obtient pas la valeur d&#39;une propriété indexée\nni les valeurs d&#39;un attribut d&#39;un EJB.","html":"<p>Attention: cette balise n&#039;obtient pas la valeur d&#039;une propriété indexée\nni les valeurs d&#039;un attribut d&#039;un EJB.</p>"},{"id":"text-273","type":"text","heading":"","plain_text":"Note: avec Tomcat 3.1, utilisation de la balise  sur un attribut dont la valeur est null n&#39;affiche rien tandis que l&#39;utilisation d&#39;une balise d&#39;expression renvoie &quot;null&quot;.","html":"<p>Note: avec Tomcat 3.1, utilisation de la balise  sur un attribut dont la valeur est null n&#039;affiche rien tandis que l&#039;utilisation d&#039;une balise d&#039;expression renvoie &quot;null&quot;.</p>"},{"id":"text-274","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-275","type":"text","heading":"","plain_text":"Test d&#39;instanciation d&#39;un haricot dans un JSP","html":"<p>Test d&#039;instanciation d&#039;un haricot dans un JSP</p>"},{"id":"text-276","type":"text","heading":"","plain_text":"Test d&#39;utilisation d&#39;un bean dans un JSP","html":"<p>Test d&#039;utilisation d&#039;un bean dans un JSP</p>"},{"id":"text-277","type":"text","heading":"","plain_text":"nom initial =","html":"<p>nom initial =</p>"},{"id":"text-278","type":"text","heading":"","plain_text":"nom mis à jour = \nnom mis à jour =","html":"<p>nom mis à jour = \nnom mis à jour =</p>"},{"id":"text-279","type":"text","heading":"","plain_text":"73.4.4.4. La balise de redirection \nLe tag  Vous permet de rediriger la demande vers une autre URL pointant vers un fichier HTML, JSP ou un fichier de servlet.\nDès que le moteur JSP rencontre cette balise, il redirige la demande vers l&#39;URL spécifiée et ignore le reste de la JSP actuelle. Tout ce qui a été généré par le JSP est perdu.\nLa syntaxe est la suivante:\n&lt;jsp: forward page = &quot;RelativeURL  « />ou&lt;jsp: forward page = &quot; &lt;% = expression %&gt; &quot;&gt;&lt;jsp: param name = &quot;le nom du paramètre&quot;valeur =&quot;  &lt;% = expression  %&gt; « /> +\nL&#39;option de page doit contenir la valeur de l&#39;URL de la ressource vers laquelle la demande sera redirigée.\nCette URL est absolue si elle commence par un &amp; # 39; / &amp; # 39; sinon, il est relatif au JSP. Dans le cas d&#39;une URL absolue, le serveur Web détermine l&#39;emplacement de la ressource.\nIl est possible de passer un ou plusieurs paramètres à la ressource appelée grâce au tag .","html":"<p>73.4.4.4. La balise de redirection \nLe tag  Vous permet de rediriger la demande vers une autre URL pointant vers un fichier HTML, JSP ou un fichier de servlet.\nDès que le moteur JSP rencontre cette balise, il redirige la demande vers l&#039;URL spécifiée et ignore le reste de la JSP actuelle. Tout ce qui a été généré par le JSP est perdu.\nLa syntaxe est la suivante:\n&lt;jsp: forward page = &quot;RelativeURL  « /&gt;ou&lt;jsp: forward page = &quot; &lt;% = expression %&gt; &quot;&gt;&lt;jsp: param name = &quot;le nom du paramètre&quot;valeur =&quot;  &lt;% = expression  %&gt; « /&gt; +\nL&#039;option de page doit contenir la valeur de l&#039;URL de la ressource vers laquelle la demande sera redirigée.\nCette URL est absolue si elle commence par un &amp; # 39; / &amp; # 39; sinon, il est relatif au JSP. Dans le cas d&#039;une URL absolue, le serveur Web détermine l&#039;emplacement de la ressource.\nIl est possible de passer un ou plusieurs paramètres à la ressource appelée grâce au tag .</p>"},{"id":"text-280","type":"text","heading":"","plain_text":"Exemple: Test8.jsp","html":"<p>Exemple: Test8.jsp</p>"},{"id":"text-281","type":"text","heading":"","plain_text":"Page initiale appelée","html":"<p>Page initiale appelée</p>"},{"id":"text-282","type":"text","heading":"","plain_text":"Exemple: forward.htm","html":"<p>Exemple: forward.htm</p>"},{"id":"text-283","type":"text","heading":"","plain_text":"Page HTML","html":"<p>Page HTML</p>"},{"id":"text-284","type":"text","heading":"","plain_text":"Page HTML transférée","html":"<p>Page HTML transférée</p>"},{"id":"text-285","type":"text","heading":"","plain_text":"Dans l&#39;exemple, le fichier forward.htm doit se trouver dans le même répertoire que le fichier JSP. Lors de l&#39;appel de la JSP, la page HTML est affichée. Le contenu généré par la page JSP n&#39;est pas affiché.","html":"<p>Dans l&#039;exemple, le fichier forward.htm doit se trouver dans le même répertoire que le fichier JSP. Lors de l&#039;appel de la JSP, la page HTML est affichée. Le contenu généré par la page JSP n&#039;est pas affiché.</p>"},{"id":"text-286","type":"text","heading":"","plain_text":"73.4.4.5. Le tag \nCette balise inclut de manière dynamique le contenu généré par un JSP ou un servlet au moment de l’exécution du JSP. C&#39;est la différence avec la directive include pour laquelle le fichier est inséré dans le fichier JSP avant la génération du servlet.\nLa syntaxe est la suivante:\n&lt;jsp: include page = &quot;relativeURL &quot;flush =&quot; true &quot; /&gt;\nL&#39;attribut page vous permet de spécifier l&#39;URL relative de l&#39;élément à insérer.\nL&#39;attribut flush indique si le tampon doit être envoyé au client et vidé. Si la valeur de ce paramètre est true, il n&#39;est pas possible d&#39;utiliser certaines fonctionnalités du servlet ou du JSP appelé: il n&#39;est pas possible de modifier l&#39;en-tête de la réponse (en-tête, cookies) ni de le suivre sur une autre page.","html":"<p>73.4.4.5. Le tag \nCette balise inclut de manière dynamique le contenu généré par un JSP ou un servlet au moment de l’exécution du JSP. C&#039;est la différence avec la directive include pour laquelle le fichier est inséré dans le fichier JSP avant la génération du servlet.\nLa syntaxe est la suivante:\n&lt;jsp: include page = &quot;relativeURL &quot;flush =&quot; true &quot; /&gt;\nL&#039;attribut page vous permet de spécifier l&#039;URL relative de l&#039;élément à insérer.\nL&#039;attribut flush indique si le tampon doit être envoyé au client et vidé. Si la valeur de ce paramètre est true, il n&#039;est pas possible d&#039;utiliser certaines fonctionnalités du servlet ou du JSP appelé: il n&#039;est pas possible de modifier l&#039;en-tête de la réponse (en-tête, cookies) ni de le suivre sur une autre page.</p>"},{"id":"text-287","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-288","type":"text","heading":"","plain_text":"Bonjour","html":"<p>Bonjour</p>"},{"id":"text-289","type":"text","heading":"","plain_text":"Il est possible de fournir des paramètres au servlet ou au JSP appelé à l’aide de la balise .","html":"<p>Il est possible de fournir des paramètres au servlet ou au JSP appelé à l’aide de la balise .</p>"},{"id":"text-290","type":"text","heading":"","plain_text":"73.4.4.6. Le tag \nCette balise permet de générer le code HTML nécessaire pour exécuter une applet en fonction du navigateur: une balise HTML  ou  est généré en fonction de l&#39;attribut User-Agent de la requête.\nLe tag  a trois attributs requis:","html":"<p>73.4.4.6. Le tag \nCette balise permet de générer le code HTML nécessaire pour exécuter une applet en fonction du navigateur: une balise HTML  ou  est généré en fonction de l&#039;attribut User-Agent de la requête.\nLe tag  a trois attributs requis:</p>"},{"id":"text-291","type":"text","heading":"","plain_text":"Attribut\nRôle","html":"<p>Attribut\nRôle</p>"},{"id":"text-292","type":"text","heading":"","plain_text":"code\npermet de spécifier le nom de la classe","html":"<p>code\npermet de spécifier le nom de la classe</p>"},{"id":"text-293","type":"text","heading":"","plain_text":"base de code\ncontient une URL spécifiant le chemin absolu ou relatif du répertoire contenant la classe ou l&#39;archive","html":"<p>base de code\ncontient une URL spécifiant le chemin absolu ou relatif du répertoire contenant la classe ou l&#039;archive</p>"},{"id":"text-294","type":"text","heading":"","plain_text":"type\nles valeurs possibles sont applet ou bean","html":"<p>type\nles valeurs possibles sont applet ou bean</p>"},{"id":"text-295","type":"text","heading":"","plain_text":"Il possède également plusieurs autres attributs facultatifs, les plus utilisés étant:","html":"<p>Il possède également plusieurs autres attributs facultatifs, les plus utilisés étant:</p>"},{"id":"text-296","type":"text","heading":"","plain_text":"Attribut\nRôle","html":"<p>Attribut\nRôle</p>"},{"id":"text-297","type":"text","heading":"","plain_text":"aligner\npermet de spécifier l&#39;alignement de l&#39;applet: les valeurs possibles sont bas, milieu ou haut","html":"<p>aligner\npermet de spécifier l&#039;alignement de l&#039;applet: les valeurs possibles sont bas, milieu ou haut</p>"},{"id":"text-298","type":"text","heading":"","plain_text":"archiver\npermet de spécifier un ensemble de ressources (bibliothèques JAR, classes, &#8230;) à charger automatiquement. Le chemin de ces ressources prend en compte l&#39;attribut codebase","html":"<p>archiver\npermet de spécifier un ensemble de ressources (bibliothèques JAR, classes, &#8230;) à charger automatiquement. Le chemin de ces ressources prend en compte l&#039;attribut codebase</p>"},{"id":"text-299","type":"text","heading":"","plain_text":"la taille\nspécifie la hauteur de l&#39;applet en pixel ou en pourcentage","html":"<p>la taille\nspécifie la hauteur de l&#039;applet en pixel ou en pourcentage</p>"},{"id":"text-300","type":"text","heading":"","plain_text":"hspace\nspécifie le nombre de pixels insérés à gauche et à droite de l&#39;applet","html":"<p>hspace\nspécifie le nombre de pixels insérés à gauche et à droite de l&#039;applet</p>"},{"id":"text-301","type":"text","heading":"","plain_text":"reconversion\nspécifie la version minimale du jer à utiliser pour exécuter l&#39;applet","html":"<p>reconversion\nspécifie la version minimale du jer à utiliser pour exécuter l&#039;applet</p>"},{"id":"text-302","type":"text","heading":"","plain_text":"prénom\nspécifier le nom de l&#39;applet","html":"<p>prénom\nspécifier le nom de l&#039;applet</p>"},{"id":"text-303","type":"text","heading":"","plain_text":"vspace\nspécifie le nombre de pixels insérés en haut et en bas de l&#39;applet","html":"<p>vspace\nspécifie le nombre de pixels insérés en haut et en bas de l&#039;applet</p>"},{"id":"text-304","type":"text","heading":"","plain_text":"largeur\nspécifie la longueur de l&#39;applet en pixel ou en pourcentage","html":"<p>largeur\nspécifie la longueur de l&#039;applet en pixel ou en pourcentage</p>"},{"id":"text-305","type":"text","heading":"","plain_text":"To be a try out of the setting of tag, it faut utiliser in the body of tag  le tag . Chaque paramètre sera alors défini dans un tag .","html":"<p>To be a try out of the setting of tag, it faut utiliser in the body of tag  le tag . Chaque paramètre sera alors défini dans un tag .</p>"},{"id":"text-306","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-307","type":"text","heading":"","plain_text":"Le tag  dans le corps du tag  permet de préciser un message qui sera affiché dans les navigateurs ne supportant pas le tag HTML  ou .","html":"<p>Le tag  dans le corps du tag  permet de préciser un message qui sera affiché dans les navigateurs ne supportant pas le tag HTML  ou .</p>"},{"id":"text-308","type":"text","heading":"","plain_text":"L&#39;exemple de cette section est composé de deux pages.\nLa première page est une page HTML qui demande à être son nom et invoquant une url vers une JSP.","html":"<p>L&#039;exemple de cette section est composé de deux pages.\nLa première page est une page HTML qui demande à être son nom et invoquant une url vers une JSP.</p>"},{"id":"text-309","type":"text","heading":"","plain_text":"Exemple: TestJSPIdent.html","html":"<p>Exemple: TestJSPIdent.html</p>"},{"id":"text-310","type":"text","heading":"","plain_text":"Identification","html":"<p>Identification</p>"},{"id":"text-311","type":"text","heading":"","plain_text":"Entrez votre nom:","html":"<p>Entrez votre nom:</p>"},{"id":"text-312","type":"text","heading":"","plain_text":"La page JSP salue l&#39;utilisateur en récupérant son nom.","html":"<p>La page JSP salue l&#039;utilisateur en récupérant son nom.</p>"},{"id":"text-313","type":"text","heading":"","plain_text":"Exemple: TestJSPAccueil.jsp","html":"<p>Exemple: TestJSPAccueil.jsp</p>"},{"id":"text-314","type":"text","heading":"","plain_text":"Accueil\n \n \n \nBonjour","html":"<p>Accueil\n \n \n \nBonjour</p>"},{"id":"text-315","type":"text","heading":"","plain_text":"Lors de l&#39;exécution d&#39;une page JSP, des erreurs peuvent survenir. Chaque erreur est traduite par la levée d&#39;une exception. Si cette exception est capturée dans un bloc try / catch of the JSP, celle-ci est traitée. Si l’exception n’est pas capturée dans la page, il ya deux possibilités selon qu’une page d’erreur soit associée à la page JSP ou non:","html":"<p>Lors de l&#039;exécution d&#039;une page JSP, des erreurs peuvent survenir. Chaque erreur est traduite par la levée d&#039;une exception. Si cette exception est capturée dans un bloc try / catch of the JSP, celle-ci est traitée. Si l’exception n’est pas capturée dans la page, il ya deux possibilités selon qu’une page d’erreur soit associée à la page JSP ou non:</p>"},{"id":"text-316","type":"text","heading":"","plain_text":"sans page d&#39;erreur associée, la pile d&#39;exécution de l&#39;exception est affichée\navec une page d&#39;erreur associée, une redirection est effectuée vers ce JSP","html":"<p>sans page d&#039;erreur associée, la pile d&#039;exécution de l&#039;exception est affichée\navec une page d&#039;erreur associée, une redirection est effectuée vers ce JSP</p>"},{"id":"text-317","type":"text","heading":"","plain_text":"La définition d&#39;une page d&#39;erreur permet de préciser dans l&#39;attribut errorPage de la page de directive des autres JSP de l&#39;application. Si une exception est levée dans les traitements d&#39;une de ces pages, le JSP va automatiquement rediriger l&#39;utilisateur vers la page d&#39;erreur précisée.\nLa valeur de l&#39;attribut page d&#39;erreur de la directive doit contenir l&#39;adresse URL de la page d&#39;erreur. Le plus simple est de définir cette page à la racine de l&#39;application web et de faire précéder le nom de la page par un caractère &amp; # 39; / # 39; / # 39; dans l&#39;URL.","html":"<p>La définition d&#039;une page d&#039;erreur permet de préciser dans l&#039;attribut errorPage de la page de directive des autres JSP de l&#039;application. Si une exception est levée dans les traitements d&#039;une de ces pages, le JSP va automatiquement rediriger l&#039;utilisateur vers la page d&#039;erreur précisée.\nLa valeur de l&#039;attribut page d&#039;erreur de la directive doit contenir l&#039;adresse URL de la page d&#039;erreur. Le plus simple est de définir cette page à la racine de l&#039;application web et de faire précéder le nom de la page par un caractère &amp; # 39; / # 39; / # 39; dans l&#039;URL.</p>"},{"id":"text-318","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-319","type":"text","heading":"","plain_text":"73.6.1. La définition d&#39;une page d&#39;erreur\nUne page d&#39;erreur est une JSP sans l&#39;attribut isErrorPage est égal à true dans la page de directive. Une telle page dispose d&#39;un accès à la variable implicite nommée exception de type Jetable qui encapsule l&#39;exception qui a été levée.\nIl est possible dans une telle page d&#39;afficher un message d&#39;erreur personnalisée mais aussi de traiter de manière liée à la gestion de l&#39;exception: ajouter l&#39;exception dans un journal, envoyer un mail pour son traitement, &#8230;","html":"<p>73.6.1. La définition d&#039;une page d&#039;erreur\nUne page d&#039;erreur est une JSP sans l&#039;attribut isErrorPage est égal à true dans la page de directive. Une telle page dispose d&#039;un accès à la variable implicite nommée exception de type Jetable qui encapsule l&#039;exception qui a été levée.\nIl est possible dans une telle page d&#039;afficher un message d&#039;erreur personnalisée mais aussi de traiter de manière liée à la gestion de l&#039;exception: ajouter l&#039;exception dans un journal, envoyer un mail pour son traitement, &#8230;</p>"},{"id":"text-320","type":"text","heading":"","plain_text":"Exemple:","html":"<p>Exemple:</p>"},{"id":"text-321","type":"text","heading":"","plain_text":"% @ page isErrorPage = &quot;true&quot;%&gt;","html":"<p>% @ page isErrorPage = &quot;true&quot;%&gt;</p>"},{"id":"text-322","type":"text","heading":"","plain_text":"Une erreur est survenue lors des traitements","html":"<p>Une erreur est survenue lors des traitements</p>"},{"id":"text-323","type":"text","heading":"","plain_text":"Les bibliothèques de tags (taglibs) ou les tags personnalisés (tags personnalisés) permettent de définir leurs propres balises XML, de regrouper dans une bibliothèque et de réutiliser dans des fichiers JSP. C’est une extension de la technologie JSP à partir de la version 1.1 des spécifications du JSP.","html":"<p>Les bibliothèques de tags (taglibs) ou les tags personnalisés (tags personnalisés) permettent de définir leurs propres balises XML, de regrouper dans une bibliothèque et de réutiliser dans des fichiers JSP. C’est une extension de la technologie JSP à partir de la version 1.1 des spécifications du JSP.</p>"},{"id":"text-324","type":"text","heading":"","plain_text":"73.7.1. La présentation des tags personnalisés\nUn élément personnalisé du langage JSP a été personnalisé avec JSP. Ces dernières dernières permettent de définir ses propres tags qui ont été réalisées pour générer la réponse.\nLe principal, mais est de préférer la séparation des rôles entre le développeur Java et le concepteur de pages web. L&#39;idée maîtresse est de déformer le code Java contenu dans les scriplets de la classe JSP dans les classes dédiées et l&#39;appelant dans le code source de la classe JSP.\nCe concept peut sembler proche de celui des javabeans. Les javabeans sont particulièrement adaptés pour stocker et échanger des données entre les composants de l&amp;#39;application web en passant par la session.\nLes tags personnalisés sont adaptés pour enlever du code Java inclus dans les JSP et le déporter dans une classe dédiée. Cette classe est physiquement un javabean qui implémente une interface particulière.\nLa principale différence entre un javabean et un tag personnalisé est que ce dernier tient compte de l&amp;#39;environnement dans lequel il s&amp;#39;exécute (notamment la JSP et le contexte de l&amp;#39;application web ) et interagit avec lui.\nPour de plus amples informations sur les bibliothèques de tags personnalisés, il suffit de consulter le site qui leur est consacré : http://www.oracle.com/technetwork/java/index-jsp-135995.html.\nLes tags personnalisés possèdent des fonctionnalités intéressantes :","html":"<p>73.7.1. La présentation des tags personnalisés\nUn élément personnalisé du langage JSP a été personnalisé avec JSP. Ces dernières dernières permettent de définir ses propres tags qui ont été réalisées pour générer la réponse.\nLe principal, mais est de préférer la séparation des rôles entre le développeur Java et le concepteur de pages web. L&#039;idée maîtresse est de déformer le code Java contenu dans les scriplets de la classe JSP dans les classes dédiées et l&#039;appelant dans le code source de la classe JSP.\nCe concept peut sembler proche de celui des javabeans. Les javabeans sont particulièrement adaptés pour stocker et échanger des données entre les composants de l&amp;#39;application web en passant par la session.\nLes tags personnalisés sont adaptés pour enlever du code Java inclus dans les JSP et le déporter dans une classe dédiée. Cette classe est physiquement un javabean qui implémente une interface particulière.\nLa principale différence entre un javabean et un tag personnalisé est que ce dernier tient compte de l&amp;#39;environnement dans lequel il s&amp;#39;exécute (notamment la JSP et le contexte de l&amp;#39;application web ) et interagit avec lui.\nPour de plus amples informations sur les bibliothèques de tags personnalisés, il suffit de consulter le site qui leur est consacré : http://www.oracle.com/technetwork/java/index-jsp-135995.html.\nLes tags personnalisés possèdent des fonctionnalités intéressantes :</p>"},{"id":"text-325","type":"text","heading":"","plain_text":"ils ont un accès aux objets de la JSP notamment l&amp;#39;objet de type HttpResponse. Ils peuvent donc modifier le contenu de la réponse générée par la JSP\nils peuvent recevoir des paramètres envoyés à partir de la JSP qui les appelle\nils peuvent avoir un corps qu&amp;#39;ils peuvent manipuler. Par extension de cette fonctionnalité, il est possible d&amp;#39;imbriquer un tag personnalisé dans un autre avec un nombre d&amp;#39;imbrications illimité","html":"<p>ils ont un accès aux objets de la JSP notamment l&amp;#39;objet de type HttpResponse. Ils peuvent donc modifier le contenu de la réponse générée par la JSP\nils peuvent recevoir des paramètres envoyés à partir de la JSP qui les appelle\nils peuvent avoir un corps qu&amp;#39;ils peuvent manipuler. Par extension de cette fonctionnalité, il est possible d&amp;#39;imbriquer un tag personnalisé dans un autre avec un nombre d&amp;#39;imbrications illimité</p>"},{"id":"text-326","type":"text","heading":"","plain_text":"Les avantages des bibliothèques de tags personnalisés sont :","html":"<p>Les avantages des bibliothèques de tags personnalisés sont :</p>"},{"id":"text-327","type":"text","heading":"","plain_text":"une suppression du code Java dans la JSP remplacé par un tag XML facilement compréhensible ce qui simplifie grandement la JSP\nune API facile à mettre en oeuvre\nune forte et facile réutilisabilité des tags développés\nune maintenance des JSP facilitée","html":"<p>une suppression du code Java dans la JSP remplacé par un tag XML facilement compréhensible ce qui simplifie grandement la JSP\nune API facile à mettre en oeuvre\nune forte et facile réutilisabilité des tags développés\nune maintenance des JSP facilitée</p>"},{"id":"text-328","type":"text","heading":"","plain_text":"La définition d&amp;#39;une bibliothèque de tags comprend plusieurs entités :","html":"<p>La définition d&amp;#39;une bibliothèque de tags comprend plusieurs entités :</p>"},{"id":"text-329","type":"text","heading":"","plain_text":"une classe dite &quot;handler&quot; pour chaque tag qui compose la bibliothèque\nun fichier de description de la bibliothèque","html":"<p>une classe dite &quot;handler&quot; pour chaque tag qui compose la bibliothèque\nun fichier de description de la bibliothèque</p>"},{"id":"text-330","type":"text","heading":"","plain_text":"73.7.2. Les handlers de tags\nChaque tag est associé à une classe qui va contenir les traitements à exécuter lors de l&amp;#39;utilisation du tag. Une telle classe est nommée &quot;handler de tag&quot; (tag handler). Pour permettre son appel, une telle classe doit obligatoirement implémenter directement ou indirectement l&amp;#39;interface javax.servlet.jsp.tagext.Tag\nL&amp;#39;interface Tag possède une interface fille BodyTag qui doit être utilisée dans le cas où le corps du tag est utilisé.\nPour plus de facilité, l&amp;#39;API JSP propose les classes TagSupport et BodyTagSupport qui implémentent respectivement l&amp;#39;interface Tag et BodyTag. Ces deux classes, contenues dans le package javax.servlet.jsp.tagext, proposent des implémentations par défaut des méthodes de l&amp;#39;interface. Ces deux classes proposent un traitement standard par défaut pour chacune des méthodes de l&amp;#39;interface qu&amp;#39;elles implémentent. Pour définir un handler de tag, il suffit d&amp;#39;hériter de l&amp;#39;une ou l&amp;#39;autre de ces deux classes.\nLes méthodes définies dans les interfaces Tag et BodyTag sont appelées, par la servlet issue de la compilation de la JSP, au cours de l&amp;#39;utilisation du tag.\nLe cycle de vie général d&amp;#39;un tag est le suivant :","html":"<p>73.7.2. Les handlers de tags\nChaque tag est associé à une classe qui va contenir les traitements à exécuter lors de l&amp;#39;utilisation du tag. Une telle classe est nommée &quot;handler de tag&quot; (tag handler). Pour permettre son appel, une telle classe doit obligatoirement implémenter directement ou indirectement l&amp;#39;interface javax.servlet.jsp.tagext.Tag\nL&amp;#39;interface Tag possède une interface fille BodyTag qui doit être utilisée dans le cas où le corps du tag est utilisé.\nPour plus de facilité, l&amp;#39;API JSP propose les classes TagSupport et BodyTagSupport qui implémentent respectivement l&amp;#39;interface Tag et BodyTag. Ces deux classes, contenues dans le package javax.servlet.jsp.tagext, proposent des implémentations par défaut des méthodes de l&amp;#39;interface. Ces deux classes proposent un traitement standard par défaut pour chacune des méthodes de l&amp;#39;interface qu&amp;#39;elles implémentent. Pour définir un handler de tag, il suffit d&amp;#39;hériter de l&amp;#39;une ou l&amp;#39;autre de ces deux classes.\nLes méthodes définies dans les interfaces Tag et BodyTag sont appelées, par la servlet issue de la compilation de la JSP, au cours de l&amp;#39;utilisation du tag.\nLe cycle de vie général d&amp;#39;un tag est le suivant :</p>"},{"id":"text-331","type":"text","heading":"","plain_text":"lors de la rencontre du début du tag, un objet du type du handler est instancié\nplusieurs propriétés sont initialisées (pageContext, parent, &#8230;) en utilisant les setters correspondants\nsi le tag contient des attributs, les setters correspondants sont appelés pour alimenter leurs valeurs\nla méthode doStartTag() est appelée\nsi la méthode doStartTag() renvoie la valeur EVAL_BODYINCLUDE alors le contenu du corps du tag est évalué\nlors de la rencontre de la fin du tag, appel de la méthode doEndTag()\nsi la méthode doEndTag() renvoie la valeur EVAL_PAGE alors l&amp;#39;évaluation de la page se poursuit, si elle renvoie la valeur SKIP_PAGE elle ne se poursuit pas","html":"<p>lors de la rencontre du début du tag, un objet du type du handler est instancié\nplusieurs propriétés sont initialisées (pageContext, parent, &#8230;) en utilisant les setters correspondants\nsi le tag contient des attributs, les setters correspondants sont appelés pour alimenter leurs valeurs\nla méthode doStartTag() est appelée\nsi la méthode doStartTag() renvoie la valeur EVAL_BODYINCLUDE alors le contenu du corps du tag est évalué\nlors de la rencontre de la fin du tag, appel de la méthode doEndTag()\nsi la méthode doEndTag() renvoie la valeur EVAL_PAGE alors l&amp;#39;évaluation de la page se poursuit, si elle renvoie la valeur SKIP_PAGE elle ne se poursuit pas</p>"},{"id":"text-332","type":"text","heading":"","plain_text":"Toutes ces opérations sont réalisées par le code généré lors de la compilation de la JSP.\nUn handler de tag possède un objet qui permet d&amp;#39;avoir un accès aux objets implicites de la JSP. Cet objet est du type javax.servlet.jsp.PageContext\nComme le code contenu dans la classe du tag ne peut être utilisé que dans le contexte particulier du tag, il peut être intéressant de sortir une partie de ce code dans une ou plusieurs classes dédiées qui peuvent être éventuellement des beans.\nPour compiler ces classes, il faut obligatoirement que le jar de l&amp;#39;API servlets (servlets.jar) soit inclus dans la variable CLASSPATH.","html":"<p>Toutes ces opérations sont réalisées par le code généré lors de la compilation de la JSP.\nUn handler de tag possède un objet qui permet d&amp;#39;avoir un accès aux objets implicites de la JSP. Cet objet est du type javax.servlet.jsp.PageContext\nComme le code contenu dans la classe du tag ne peut être utilisé que dans le contexte particulier du tag, il peut être intéressant de sortir une partie de ce code dans une ou plusieurs classes dédiées qui peuvent être éventuellement des beans.\nPour compiler ces classes, il faut obligatoirement que le jar de l&amp;#39;API servlets (servlets.jar) soit inclus dans la variable CLASSPATH.</p>"},{"id":"text-333","type":"text","heading":"","plain_text":"73.7.3. L&amp;#39;interface Tag\nCette interface définit les méthodes principales pour la gestion du cycle de vie d&amp;#39;un tag personnalisé qui ne doit pas manipuler le contenu de son corps.\nElle définit plusieurs constantes :","html":"<p>73.7.3. L&amp;#39;interface Tag\nCette interface définit les méthodes principales pour la gestion du cycle de vie d&amp;#39;un tag personnalisé qui ne doit pas manipuler le contenu de son corps.\nElle définit plusieurs constantes :</p>"},{"id":"text-334","type":"text","heading":"","plain_text":"Constante\nRôle","html":"<p>Constante\nRôle</p>"},{"id":"text-335","type":"text","heading":"","plain_text":"EVAL_BODY_INCLUDE\nContinuer avec l&amp;#39;évaluation du corps du tag","html":"<p>EVAL_BODY_INCLUDE\nContinuer avec l&amp;#39;évaluation du corps du tag</p>"},{"id":"text-336","type":"text","heading":"","plain_text":"EVAL_PAGE\nContinuer l&amp;#39;évaluation de la page","html":"<p>EVAL_PAGE\nContinuer l&amp;#39;évaluation de la page</p>"},{"id":"text-337","type":"text","heading":"","plain_text":"SKIP_BODY\nEmpêcher l&amp;#39;évaluation du corps du tag","html":"<p>SKIP_BODY\nEmpêcher l&amp;#39;évaluation du corps du tag</p>"},{"id":"text-338","type":"text","heading":"","plain_text":"SKIP_PAGE\nEmpêcher l&amp;#39;évaluation du reste de la page","html":"<p>SKIP_PAGE\nEmpêcher l&amp;#39;évaluation du reste de la page</p>"},{"id":"text-339","type":"text","heading":"","plain_text":"Elle définit aussi plusieurs méthodes :","html":"<p>Elle définit aussi plusieurs méthodes :</p>"},{"id":"text-340","type":"text","heading":"","plain_text":"Méthode\nRôle","html":"<p>Méthode\nRôle</p>"},{"id":"text-341","type":"text","heading":"","plain_text":"int doEndTag()\nTraitements à la rencontre du tag de fin","html":"<p>int doEndTag()\nTraitements à la rencontre du tag de fin</p>"},{"id":"text-342","type":"text","heading":"","plain_text":"int doStartTag()\nTraitements à la rencontre du tag de début","html":"<p>int doStartTag()\nTraitements à la rencontre du tag de début</p>"},{"id":"text-343","type":"text","heading":"","plain_text":"setPageContext(Context)\nSauvegarde du contexte de la page","html":"<p>setPageContext(Context)\nSauvegarde du contexte de la page</p>"},{"id":"text-344","type":"text","heading":"","plain_text":"La méthode doStartTag() est appelée lors de la rencontre du tag d&amp;#39;ouverture et contient les traitements à effectuer dans ce cas. Elle doit renvoyer un entier prédéfini qui indique comment va se poursuivre le traitement du tag :","html":"<p>La méthode doStartTag() est appelée lors de la rencontre du tag d&amp;#39;ouverture et contient les traitements à effectuer dans ce cas. Elle doit renvoyer un entier prédéfini qui indique comment va se poursuivre le traitement du tag :</p>"},{"id":"text-345","type":"text","heading":"","plain_text":"EVAL_BODY_INCLUDE : poursuite du traitement avec évaluation du corps du tag\nSKIP_BODY : poursuite du traitement sans évaluation du corps du tag","html":"<p>EVAL_BODY_INCLUDE : poursuite du traitement avec évaluation du corps du tag\nSKIP_BODY : poursuite du traitement sans évaluation du corps du tag</p>"},{"id":"text-346","type":"text","heading":"","plain_text":"La méthode doEndTag() est appelée lors de la rencontre du tag de fermeture et contient les traitements à effectuer dans ce cas. Elle doit renvoyer un entier prédéfini qui indique comment va se poursuivre le traitement de la JSP.","html":"<p>La méthode doEndTag() est appelée lors de la rencontre du tag de fermeture et contient les traitements à effectuer dans ce cas. Elle doit renvoyer un entier prédéfini qui indique comment va se poursuivre le traitement de la JSP.</p>"},{"id":"text-347","type":"text","heading":"","plain_text":"EVAL_PAGE : poursuite du traitement de la JSP\nSKIP_PAGE : ne pas poursuivre le traitement du reste de la JSP","html":"<p>EVAL_PAGE : poursuite du traitement de la JSP\nSKIP_PAGE : ne pas poursuivre le traitement du reste de la JSP</p>"},{"id":"text-348","type":"text","heading":"","plain_text":"73.7.4. L&amp;#39;accès aux variables implicites de la JSP\nLes tags ont accès aux variables implicites de la JSP dans laquelle ils s&amp;#39;exécutent grâce à un objet de type PageContext. La variable pageContext est un objet de ce type qui est initialisé juste après l&amp;#39;instanciation du handler.\nLe classe PageContext est une classe abstraite dont l&amp;#39;implémentation des spécifications doit fournir une adaptation concrète.\nCette classe définit plusieurs méthodes :","html":"<p>73.7.4. L&amp;#39;accès aux variables implicites de la JSP\nLes tags ont accès aux variables implicites de la JSP dans laquelle ils s&amp;#39;exécutent grâce à un objet de type PageContext. La variable pageContext est un objet de ce type qui est initialisé juste après l&amp;#39;instanciation du handler.\nLe classe PageContext est une classe abstraite dont l&amp;#39;implémentation des spécifications doit fournir une adaptation concrète.\nCette classe définit plusieurs méthodes :</p>"},{"id":"text-349","type":"text","heading":"","plain_text":"Méthodes\nRôles","html":"<p>Méthodes\nRôles</p>"},{"id":"text-350","type":"text","heading":"","plain_text":"JspWriter getOut()\nPermet un accès à la variable out de la JSP","html":"<p>JspWriter getOut()\nPermet un accès à la variable out de la JSP</p>"},{"id":"text-351","type":"text","heading":"","plain_text":"Exception getException()\nPermet un accès à la variable exception de la JSP","html":"<p>Exception getException()\nPermet un accès à la variable exception de la JSP</p>"},{"id":"text-352","type":"text","heading":"","plain_text":"Object getPage()\nPermet un accès à la variable page de la JSP","html":"<p>Object getPage()\nPermet un accès à la variable page de la JSP</p>"},{"id":"text-353","type":"text","heading":"","plain_text":"ServletRequest getRequest()\nPermet un accès à la variable request de la JSP","html":"<p>ServletRequest getRequest()\nPermet un accès à la variable request de la JSP</p>"},{"id":"text-354","type":"text","heading":"","plain_text":"ServletResponse getResponse()\nPermet un accès à la variable response de la JSP","html":"<p>ServletResponse getResponse()\nPermet un accès à la variable response de la JSP</p>"},{"id":"text-355","type":"text","heading":"","plain_text":"ServletConfig getServletConfig()\nPermet un accès à l&amp;#39;instance de la variable de type ServletConfig","html":"<p>ServletConfig getServletConfig()\nPermet un accès à l&amp;#39;instance de la variable de type ServletConfig</p>"},{"id":"text-356","type":"text","heading":"","plain_text":"ServletContext getServletContext()\nPermet un accès à l&amp;#39;instance de la variable de type ServletContext","html":"<p>ServletContext getServletContext()\nPermet un accès à l&amp;#39;instance de la variable de type ServletContext</p>"},{"id":"text-357","type":"text","heading":"","plain_text":"HttpSession getSession()\nPermet un accès à la session","html":"<p>HttpSession getSession()\nPermet un accès à la session</p>"},{"id":"text-358","type":"text","heading":"","plain_text":"Object getAttribute(String)\nRenvoie l&amp;#39;objet associé au nom fourni en paramètre dans la portée de la page","html":"<p>Object getAttribute(String)\nRenvoie l&amp;#39;objet associé au nom fourni en paramètre dans la portée de la page</p>"},{"id":"text-359","type":"text","heading":"","plain_text":"setAttribute(String, Object)\nPermet de placer dans la portée de la page un objet dont le nom est fourni en paramètre","html":"<p>setAttribute(String, Object)\nPermet de placer dans la portée de la page un objet dont le nom est fourni en paramètre</p>"},{"id":"text-360","type":"text","heading":"","plain_text":"73.7.5. Les deux types de handlers\nIl existe deux types de handlers :","html":"<p>73.7.5. Les deux types de handlers\nIl existe deux types de handlers :</p>"},{"id":"text-361","type":"text","heading":"","plain_text":"les handlers de tags sans corps\nles handlers de tags avec corps","html":"<p>les handlers de tags sans corps\nles handlers de tags avec corps</p>"},{"id":"text-362","type":"text","heading":"","plain_text":"73.7.5.1. Les handlers de tags sans corps\nPour définir le handler d&amp;#39;un tag personnalisé sans corps, il suffit de définir une classe qui implémente l&amp;#39;interface Tag ou qui héritent de la classe TagSupport. Il faut définir ou redéfinir les méthodes doStartTag() et endStartTag().\nLa méthode doStartTag() est appelée à la rencontre du début du tag. Cette méthode doit contenir le code à exécuter dans ce cas et renvoyer la constante SKIP_BODY puisque le tag ne contient pas de corps.","html":"<p>73.7.5.1. Les handlers de tags sans corps\nPour définir le handler d&amp;#39;un tag personnalisé sans corps, il suffit de définir une classe qui implémente l&amp;#39;interface Tag ou qui héritent de la classe TagSupport. Il faut définir ou redéfinir les méthodes doStartTag() et endStartTag().\nLa méthode doStartTag() est appelée à la rencontre du début du tag. Cette méthode doit contenir le code à exécuter dans ce cas et renvoyer la constante SKIP_BODY puisque le tag ne contient pas de corps.</p>"},{"id":"text-363","type":"text","heading":"","plain_text":"73.7.5.2. Les handlers de tags avec corps\nLe cycle de vie d&amp;#39;un tel tag inclut le traitement du corps si la méthode doStartTag() renvoie la valeur EVAL_BODY_TAG.\nDans ce cas, les opérations suivantes sont réalisées :","html":"<p>73.7.5.2. Les handlers de tags avec corps\nLe cycle de vie d&amp;#39;un tel tag inclut le traitement du corps si la méthode doStartTag() renvoie la valeur EVAL_BODY_TAG.\nDans ce cas, les opérations suivantes sont réalisées :</p>"},{"id":"text-364","type":"text","heading":"","plain_text":"la méthode setBodyContent() est appelée\nle contenu du corps est traité\nla méthode doAfterBody() est appelée. Si elle renvoie la valeur EVAL_BODY_TAG, le contenu du corps est de nouveau traité","html":"<p>la méthode setBodyContent() est appelée\nle contenu du corps est traité\nla méthode doAfterBody() est appelée. Si elle renvoie la valeur EVAL_BODY_TAG, le contenu du corps est de nouveau traité</p>"},{"id":"text-365","type":"text","heading":"","plain_text":"73.7.6. Les paramètres d&amp;#39;un tag\nUn tag peut avoir un ou plusieurs paramètres qui seront transmis à la classe par des attributs. Pour chacun des paramètres, il faut définir des getters et des setters en respectant les règles et conventions des Java beans. Il est impératif de définir un champ, un setter et éventuellement un accesseur pour chaque attribut.\nLa JSP utilisera le setter pour fournir à l&amp;#39;objet la valeur de l&amp;#39;attribut.\nAu moment de la génération de la servlet par le moteur de JSP, celui-ci vérifie par introspection la présence d&amp;#39;un setter pour l&amp;#39;attribut concerné.","html":"<p>73.7.6. Les paramètres d&amp;#39;un tag\nUn tag peut avoir un ou plusieurs paramètres qui seront transmis à la classe par des attributs. Pour chacun des paramètres, il faut définir des getters et des setters en respectant les règles et conventions des Java beans. Il est impératif de définir un champ, un setter et éventuellement un accesseur pour chaque attribut.\nLa JSP utilisera le setter pour fournir à l&amp;#39;objet la valeur de l&amp;#39;attribut.\nAu moment de la génération de la servlet par le moteur de JSP, celui-ci vérifie par introspection la présence d&amp;#39;un setter pour l&amp;#39;attribut concerné.</p>"},{"id":"text-366","type":"text","heading":"","plain_text":"73.7.7. La définition du fichier de description de la bibliothèque de tags (TLD)\nLe fichier de description de la bibliothèque de tags (tag library descriptor file) est un fichier au format XML qui décrit une bibliothèque de tags. Les informations qu&amp;#39;il contient concernent la bibliothèque de tags elle-même et aussi chacun des tags qui la compose.\nCe fichier est utilisé par le conteneur Web lors de la compilation de la JSP pour remplacer le tag par du code Java.\nCe fichier doit toujours avoir pour extension .tld. Il doit être placé dans le répertoire web-inf du fichier war ou dans un de ses sous-répertoires. Le plus pratique est de tous les regrouper dans un répertoire nommé par exemple tags ou tld.\nComme tout bon fichier XML, le fichier TLD commence par un prologue :","html":"<p>73.7.7. La définition du fichier de description de la bibliothèque de tags (TLD)\nLe fichier de description de la bibliothèque de tags (tag library descriptor file) est un fichier au format XML qui décrit une bibliothèque de tags. Les informations qu&amp;#39;il contient concernent la bibliothèque de tags elle-même et aussi chacun des tags qui la compose.\nCe fichier est utilisé par le conteneur Web lors de la compilation de la JSP pour remplacer le tag par du code Java.\nCe fichier doit toujours avoir pour extension .tld. Il doit être placé dans le répertoire web-inf du fichier war ou dans un de ses sous-répertoires. Le plus pratique est de tous les regrouper dans un répertoire nommé par exemple tags ou tld.\nComme tout bon fichier XML, le fichier TLD commence par un prologue :</p>"},{"id":"text-367","type":"text","heading":"","plain_text":"Exemple :","html":"<p>Exemple :</p>"},{"id":"text-368","type":"text","heading":"","plain_text":"La DTD précisée doit correspondre à la version de l&amp;#39;API JSP utilisée. L&amp;#39;exemple précédent concernait la version 1.1, l&amp;#39;exemple suivant concerne la version 1.2","html":"<p>La DTD précisée doit correspondre à la version de l&amp;#39;API JSP utilisée. L&amp;#39;exemple précédent concernait la version 1.1, l&amp;#39;exemple suivant concerne la version 1.2</p>"},{"id":"text-369","type":"text","heading":"","plain_text":"Exemple :","html":"<p>Exemple :</p>"},{"id":"text-370","type":"text","heading":"","plain_text":"Le tag racine du document XML est le tag .\nCe tag peut contenir plusieurs tags qui définissent les caractéristiques générales de la bibliothèque. Les tags suivants  sont définis dans les spécifications 1.2 :","html":"<p>Le tag racine du document XML est le tag .\nCe tag peut contenir plusieurs tags qui définissent les caractéristiques générales de la bibliothèque. Les tags suivants  sont définis dans les spécifications 1.2 :</p>"},{"id":"text-371","type":"text","heading":"","plain_text":"prénom\nRôle","html":"<p>prénom\nRôle</p>"},{"id":"text-372","type":"text","heading":"","plain_text":"tlib-version\nversion de la bibliothèque","html":"<p>tlib-version\nversion de la bibliothèque</p>"},{"id":"text-373","type":"text","heading":"","plain_text":"jsp-version\nversion des spécifications JSP utilisées","html":"<p>jsp-version\nversion des spécifications JSP utilisées</p>"},{"id":"text-374","type":"text","heading":"","plain_text":"short-name\nnom court de la bibliothèque (optionnel)","html":"<p>short-name\nnom court de la bibliothèque (optionnel)</p>"},{"id":"text-375","type":"text","heading":"","plain_text":"uri\nURI qui identifie de façon unique la bibliothèque : cette URI n&amp;#39;a pas besoin d&amp;#39;exister réellement","html":"<p>uri\nURI qui identifie de façon unique la bibliothèque : cette URI n&amp;#39;a pas besoin d&amp;#39;exister réellement</p>"},{"id":"text-376","type":"text","heading":"","plain_text":"display-name\nnom de la bibliothèque","html":"<p>display-name\nnom de la bibliothèque</p>"},{"id":"text-377","type":"text","heading":"","plain_text":"small-icon\n(optionnel)","html":"<p>small-icon\n(optionnel)</p>"},{"id":"text-378","type":"text","heading":"","plain_text":"large-icon\n(optionnel)","html":"<p>large-icon\n(optionnel)</p>"},{"id":"text-379","type":"text","heading":"","plain_text":"la description\ndescription de la bibliothèque","html":"<p>la description\ndescription de la bibliothèque</p>"},{"id":"text-380","type":"text","heading":"","plain_text":"validateur\n(optionnel)","html":"<p>validateur\n(optionnel)</p>"},{"id":"text-381","type":"text","heading":"","plain_text":"auditeur\n(optionnel)","html":"<p>auditeur\n(optionnel)</p>"},{"id":"text-382","type":"text","heading":"","plain_text":"étiquette\nil en faut autant que de tags qui composent la bibliothèque","html":"<p>étiquette\nil en faut autant que de tags qui composent la bibliothèque</p>"},{"id":"text-383","type":"text","heading":"","plain_text":"Pour chaque tag personnalisé défini dans la bibliothèque, il faut un tag . Ce tag permet de définir les caractéristiques d&amp;#39;un tag de la bibliothèque.\nCe tag peut contenir les tags suivants :","html":"<p>Pour chaque tag personnalisé défini dans la bibliothèque, il faut un tag . Ce tag permet de définir les caractéristiques d&amp;#39;un tag de la bibliothèque.\nCe tag peut contenir les tags suivants :</p>"},{"id":"text-384","type":"text","heading":"","plain_text":"prénom\nRôle","html":"<p>prénom\nRôle</p>"},{"id":"text-385","type":"text","heading":"","plain_text":"prénom\nnom du tag : il doit être unique dans la bibliothèque","html":"<p>prénom\nnom du tag : il doit être unique dans la bibliothèque</p>"},{"id":"text-386","type":"text","heading":"","plain_text":"tag-class\nnom entièrement qualifié de la classe qui contient le handler du tag","html":"<p>tag-class\nnom entièrement qualifié de la classe qui contient le handler du tag</p>"},{"id":"text-387","type":"text","heading":"","plain_text":"tei-class\nnom qualifié d&amp;#39;une classe fille de la classe javax.servlet.jsp.tagext.TagExtraInfo (optionnel)","html":"<p>tei-class\nnom qualifié d&amp;#39;une classe fille de la classe javax.servlet.jsp.tagext.TagExtraInfo (optionnel)</p>"},{"id":"text-388","type":"text","heading":"","plain_text":"body-content\ntype du corps du tag. Les valeurs possibles sont :","html":"<p>body-content\ntype du corps du tag. Les valeurs possibles sont :</p>"},{"id":"text-389","type":"text","heading":"","plain_text":"JSP : le corps du tag contient des tags JSP qui doivent être interprétés\ntagdependent : l&amp;#39;interprétation du contenu du corps est faite par le tag\nempty : le corps doit obligatoirement être vide","html":"<p>JSP : le corps du tag contient des tags JSP qui doivent être interprétés\ntagdependent : l&amp;#39;interprétation du contenu du corps est faite par le tag\nempty : le corps doit obligatoirement être vide</p>"},{"id":"text-390","type":"text","heading":"","plain_text":"La valeur par défaut est JSP","html":"<p>La valeur par défaut est JSP</p>"},{"id":"text-391","type":"text","heading":"","plain_text":"display-name\nnom court du tag","html":"<p>display-name\nnom court du tag</p>"},{"id":"text-392","type":"text","heading":"","plain_text":"small-icon\nnom relatif à la bibliothèque d&amp;#39;un fichier gif ou jpeg contenant une icône. (optionnel)","html":"<p>small-icon\nnom relatif à la bibliothèque d&amp;#39;un fichier gif ou jpeg contenant une icône. (optionnel)</p>"},{"id":"text-393","type":"text","heading":"","plain_text":"large-icon\nnom relatif à la bibliothèque d&amp;#39;un fichier gif ou jpeg contenant une icône. (optionnel)","html":"<p>large-icon\nnom relatif à la bibliothèque d&amp;#39;un fichier gif ou jpeg contenant une icône. (optionnel)</p>"},{"id":"text-394","type":"text","heading":"","plain_text":"la description\ndescription du tag (optionnel)","html":"<p>la description\ndescription du tag (optionnel)</p>"},{"id":"text-395","type":"text","heading":"","plain_text":"variable\n(optionnel)","html":"<p>variable\n(optionnel)</p>"},{"id":"text-396","type":"text","heading":"","plain_text":"attribut\nil en faut autant que d&amp;#39;attributs possédés par le tag (optionnel)","html":"<p>attribut\nil en faut autant que d&amp;#39;attributs possédés par le tag (optionnel)</p>"},{"id":"text-397","type":"text","heading":"","plain_text":"Exemple\nun exemple de l&amp;#39;utilisation du tag (optionnel)","html":"<p>Exemple\nun exemple de l&amp;#39;utilisation du tag (optionnel)</p>"},{"id":"text-398","type":"text","heading":"","plain_text":"Pour chaque attribut du tag personnalisé, il faut utiliser un tag . Ce tag décrit un attribut d&amp;#39;un tag et peut contenir les tags suivants :","html":"<p>Pour chaque attribut du tag personnalisé, il faut utiliser un tag . Ce tag décrit un attribut d&amp;#39;un tag et peut contenir les tags suivants :</p>"},{"id":"text-399","type":"text","heading":"","plain_text":"prénom\nLa description","html":"<p>prénom\nLa description</p>"},{"id":"text-400","type":"text","heading":"","plain_text":"prénom\nnom de l&amp;#39;attribut","html":"<p>prénom\nnom de l&amp;#39;attribut</p>"},{"id":"text-401","type":"text","heading":"","plain_text":"Champs obligatoires\nbooléen qui indique la présence obligatoire de l&amp;#39;attribut","html":"<p>Champs obligatoires\nbooléen qui indique la présence obligatoire de l&amp;#39;attribut</p>"},{"id":"text-402","type":"text","heading":"","plain_text":"rtexprvalue\nbooléen qui indique si la page doit évaluer l&amp;#39;expression lors de l&amp;#39;exécution. Il faut donc mettre la valeur true si la valeur de l&amp;#39;attribut est fournie avec un tag JSP d&amp;#39;expression","html":"<p>rtexprvalue\nbooléen qui indique si la page doit évaluer l&amp;#39;expression lors de l&amp;#39;exécution. Il faut donc mettre la valeur true si la valeur de l&amp;#39;attribut est fournie avec un tag JSP d&amp;#39;expression</p>"},{"id":"text-403","type":"text","heading":"","plain_text":"Le tag  contient les tags suivants :","html":"<p>Le tag  contient les tags suivants :</p>"},{"id":"text-404","type":"text","heading":"","plain_text":"prénom\nRôle","html":"<p>prénom\nRôle</p>"},{"id":"text-405","type":"text","heading":"","plain_text":"name-given","html":"<p>name-given</p>"},{"id":"text-406","type":"text","heading":"","plain_text":"name-from-attribut","html":"<p>name-from-attribut</p>"},{"id":"text-407","type":"text","heading":"","plain_text":"variable-class\nnom de la classe de la valeur de l&amp;#39;attribut. Par défaut java.lang.String","html":"<p>variable-class\nnom de la classe de la valeur de l&amp;#39;attribut. Par défaut java.lang.String</p>"},{"id":"text-408","type":"text","heading":"","plain_text":"déclarer\npar défaut : True","html":"<p>déclarer\npar défaut : True</p>"},{"id":"text-409","type":"text","heading":"","plain_text":"portée\nvisibilité de l&amp;#39;attribut. Les valeurs possibles sont :\n      Par défaut : NESTED (optionnel)","html":"<p>portée\nvisibilité de l&amp;#39;attribut. Les valeurs possibles sont :\n      Par défaut : NESTED (optionnel)</p>"},{"id":"text-410","type":"text","heading":"","plain_text":"la description\ndescription de l&amp;#39;attribut (optionnel)","html":"<p>la description\ndescription de l&amp;#39;attribut (optionnel)</p>"},{"id":"text-411","type":"text","heading":"","plain_text":"Chaque bibliothèque doit être définie avec un fichier de description au format xml possédant une extension .tld. Le contenu de ce fichier doit pouvoir être validé avec une DTD fournie par Sun.\nCe fichier est habituellement stocké dans le répertoire web-inf de l&amp;#39;application web ou un de ses sous-répertoires.","html":"<p>Chaque bibliothèque doit être définie avec un fichier de description au format xml possédant une extension .tld. Le contenu de ce fichier doit pouvoir être validé avec une DTD fournie par Sun.\nCe fichier est habituellement stocké dans le répertoire web-inf de l&amp;#39;application web ou un de ses sous-répertoires.</p>"},{"id":"text-412","type":"text","heading":"","plain_text":"Exemple :","html":"<p>Exemple :</p>"},{"id":"text-413","type":"text","heading":"","plain_text":"1,0\n  1.1\n  testtaglib\n  http://perso.jmd.test.taglib\n  Bibliotheque de test des taglibs","html":"<p>1,0\n  1.1\n  testtaglib\n  http://perso.jmd.test.taglib\n  Bibliotheque de test des taglibs</p>"},{"id":"text-414","type":"text","heading":"","plain_text":"testtaglib1\n  perso.jmd.test.taglib.TestTaglib1\n  Tag qui affiche bonjour","html":"<p>testtaglib1\n  perso.jmd.test.taglib.TestTaglib1\n  Tag qui affiche bonjour</p>"},{"id":"text-415","type":"text","heading":"","plain_text":"73.7.8. L&amp;#39;utilisation d&amp;#39;une bibliothèque de tags\nPour utiliser une bibliothèque de tags, il y a des actions à réaliser au niveau du code source de la JSP et au niveau de conteneur d&amp;#39;applications web pour la déployer.","html":"<p>73.7.8. L&amp;#39;utilisation d&amp;#39;une bibliothèque de tags\nPour utiliser une bibliothèque de tags, il y a des actions à réaliser au niveau du code source de la JSP et au niveau de conteneur d&amp;#39;applications web pour la déployer.</p>"},{"id":"text-416","type":"text","heading":"","plain_text":"73.7.8.1. L&amp;#39;utilisation dans le code source d&amp;#39;une JSP\nChaque bibliothèque utilisée dans une JSP doit être déclarée avant son utilisation en utilisant la directive taglib. Le plus simple est d&amp;#39;effectuer ces déclarations tout au début du code de la JSP.\nCette directive possède deux attributs :\nDans ce dernier cas, il faut ajouter pour chaque bibliothèque un tag  dans le fichier de description de déploiement de l&amp;#39;application/WEB-INF/web.xml","html":"<p>73.7.8.1. L&amp;#39;utilisation dans le code source d&amp;#39;une JSP\nChaque bibliothèque utilisée dans une JSP doit être déclarée avant son utilisation en utilisant la directive taglib. Le plus simple est d&amp;#39;effectuer ces déclarations tout au début du code de la JSP.\nCette directive possède deux attributs :\nDans ce dernier cas, il faut ajouter pour chaque bibliothèque un tag  dans le fichier de description de déploiement de l&amp;#39;application/WEB-INF/web.xml</p>"},{"id":"text-417","type":"text","heading":"","plain_text":"Exemple :","html":"<p>Exemple :</p>"},{"id":"text-418","type":"text","heading":"","plain_text":"/maTagLibTest\n    /WEB-INF/tld/testtaglib.tld","html":"<p>/maTagLibTest\n    /WEB-INF/tld/testtaglib.tld</p>"},{"id":"text-419","type":"text","heading":"","plain_text":"L&amp;#39;appel d&amp;#39;un tag se fait en utilisant un tag dont le nom a la forme suivante : prefix:tag\nLe préfix est celui défini dans la directive taglib.","html":"<p>L&amp;#39;appel d&amp;#39;un tag se fait en utilisant un tag dont le nom a la forme suivante : prefix:tag\nLe préfix est celui défini dans la directive taglib.</p>"},{"id":"text-420","type":"text","heading":"","plain_text":"Exemple : un tag sans corps","html":"<p>Exemple : un tag sans corps</p>"},{"id":"text-421","type":"text","heading":"","plain_text":"Exemple : un tag avec corps","html":"<p>Exemple : un tag avec corps</p>"},{"id":"text-422","type":"text","heading":"","plain_text":"...","html":"<p>...</p>"},{"id":"text-423","type":"text","heading":"","plain_text":"Le corps peut contenir du code HTML, du code JSP ou d&amp;#39;autre tag personnalisé.\nLe tag peut avoir des attributs si ceux-ci ont été définis. La syntaxe pour les utiliser respecte la norme XML.","html":"<p>Le corps peut contenir du code HTML, du code JSP ou d&amp;#39;autre tag personnalisé.\nLe tag peut avoir des attributs si ceux-ci ont été définis. La syntaxe pour les utiliser respecte la norme XML.</p>"},{"id":"text-424","type":"text","heading":"","plain_text":"Exemple : un tag avec un paramètre constant","html":"<p>Exemple : un tag avec un paramètre constant</p>"},{"id":"text-425","type":"text","heading":"","plain_text":"La valeur de cet attribut peut être une donnée dynamiquement évaluée lors de l&amp;#39;exécution :","html":"<p>La valeur de cet attribut peut être une donnée dynamiquement évaluée lors de l&amp;#39;exécution :</p>"},{"id":"text-426","type":"text","heading":"","plain_text":"Exemple : un tag avec un paramètre","html":"<p>Exemple : un tag avec un paramètre</p>"},{"id":"text-427","type":"text","heading":"","plain_text":"&lt;prefix:tag attribut=&quot;\"/>","html":"<p>&lt;prefix:tag attribut=&quot;&quot;/&gt;</p>"},{"id":"text-428","type":"text","heading":"","plain_text":"73.7.8.2. Le déploiement d&amp;#39;une bibliothèque\nAu moment de la compilation de la JSP en servlet, le conteneur transforme chaque tag en un appel à un objet du type de la classe associée au tag.\nIl y a deux types d&amp;#39;éléments auxquels le conteneur d&amp;#39;applications web doit pouvoir accéder :","html":"<p>73.7.8.2. Le déploiement d&amp;#39;une bibliothèque\nAu moment de la compilation de la JSP en servlet, le conteneur transforme chaque tag en un appel à un objet du type de la classe associée au tag.\nIl y a deux types d&amp;#39;éléments auxquels le conteneur d&amp;#39;applications web doit pouvoir accéder :</p>"},{"id":"text-429","type":"text","heading":"","plain_text":"le fichier de description de la bibliothèque\nles classes des handlers de tags","html":"<p>le fichier de description de la bibliothèque\nles classes des handlers de tags</p>"},{"id":"text-430","type":"text","heading":"","plain_text":"Les classes des handlers de tags peuvent être stockées à deux endroits dans le fichier war selon leur format :","html":"<p>Les classes des handlers de tags peuvent être stockées à deux endroits dans le fichier war selon leur format :</p>"},{"id":"text-431","type":"text","heading":"","plain_text":"s&amp;#39;ils sont packagés sous forme de fichiers jar alors ils doivent être placés dans le répertoire /WEB-INF/lib\ns&amp;#39;ils ne sont pas packagés alors ils doivent être placés dans le répertoire /WEB-INF/classes","html":"<p>s&amp;#39;ils sont packagés sous forme de fichiers jar alors ils doivent être placés dans le répertoire /WEB-INF/lib\ns&amp;#39;ils ne sont pas packagés alors ils doivent être placés dans le répertoire /WEB-INF/classes</p>"},{"id":"text-432","type":"text","heading":"","plain_text":"73.7.9. Le déploiement et les tests dans Tomcat\nTomcat étant l&amp;#39;implémentation de référence pour les technologies servlets et JSP, il est pratique d&amp;#39;effectuer des tests avec cet outil.\nLa version de Tomcat utilisée dans cette section est la 3.2.1.\nLe déploiement se fait en deux étapes :","html":"<p>73.7.9. Le déploiement et les tests dans Tomcat\nTomcat étant l&amp;#39;implémentation de référence pour les technologies servlets et JSP, il est pratique d&amp;#39;effectuer des tests avec cet outil.\nLa version de Tomcat utilisée dans cette section est la 3.2.1.\nLe déploiement se fait en deux étapes :</p>"},{"id":"text-433","type":"text","heading":"","plain_text":"la copie des fichiers\nl&amp;#39;enregistrement de la bibliothèque","html":"<p>la copie des fichiers\nl&amp;#39;enregistrement de la bibliothèque</p>"},{"id":"text-434","type":"text","heading":"","plain_text":"Les classes compilées doivent être copiées dans le répertoire WEB-INF/classes de la webapp si elles ne sont pas packagées dans une archive jar, sinon le ou les fichiers .jar doivent être copiés dans le répertoire WEB-INF/lib.\nLe fichier .tld doit être copié dans le répertoire WEB-INF ou dans un de ses sous-répertoires.\nIl faut ensuite enregistrer la bibliothèque dans le fichier de configuration web.xml contenu dans le répertoire web-inf du répertoire de l&amp;#39;application web.\nIl faut ajouter dans ce fichier, un tag  pour chaque bibliothèque utilisée par l&amp;#39;application web. Ce tag contient deux informations :","html":"<p>Les classes compilées doivent être copiées dans le répertoire WEB-INF/classes de la webapp si elles ne sont pas packagées dans une archive jar, sinon le ou les fichiers .jar doivent être copiés dans le répertoire WEB-INF/lib.\nLe fichier .tld doit être copié dans le répertoire WEB-INF ou dans un de ses sous-répertoires.\nIl faut ensuite enregistrer la bibliothèque dans le fichier de configuration web.xml contenu dans le répertoire web-inf du répertoire de l&amp;#39;application web.\nIl faut ajouter dans ce fichier, un tag  pour chaque bibliothèque utilisée par l&amp;#39;application web. Ce tag contient deux informations :</p>"},{"id":"text-435","type":"text","heading":"","plain_text":"l&amp;#39;URI de la bibliothèque contenue dans le tag taglib-uri. Cette URI doit être identique à celle définie dans le fichier de description de la bibliothèque\nla localisation du fichier de description","html":"<p>l&amp;#39;URI de la bibliothèque contenue dans le tag taglib-uri. Cette URI doit être identique à celle définie dans le fichier de description de la bibliothèque\nla localisation du fichier de description</p>"},{"id":"text-436","type":"text","heading":"","plain_text":"Exemple :","html":"<p>Exemple :</p>"},{"id":"text-437","type":"text","heading":"","plain_text":"index.htm\n    index.jsp\n  \n\t\n  \n    /maTagLibTest\n    /WEB-INF/tld/testtaglib.tld","html":"<p>index.htm\n    index.jsp\n  \n\t\n  \n    /maTagLibTest\n    /WEB-INF/tld/testtaglib.tld</p>"},{"id":"text-438","type":"text","heading":"","plain_text":"Il ne reste plus qu&amp;#39;à lancer Tomcat si ce n&amp;#39;est pas encore fait et à saisir l&amp;#39;url de la page contenant l&amp;#39;appel au tag personnalisé.","html":"<p>Il ne reste plus qu&amp;#39;à lancer Tomcat si ce n&amp;#39;est pas encore fait et à saisir l&amp;#39;url de la page contenant l&amp;#39;appel au tag personnalisé.</p>"},{"id":"text-439","type":"text","heading":"","plain_text":"73.7.10. Les bibliothèques de tags existantes\nIl existe de nombreuses bibliothèques de tags libres ou commerciales disponibles sur le marché. Cette section va tenter de présenter quelques-unes des plus connues et des plus utilisées du monde libre. Cette liste n&amp;#39;est pas exhaustive.","html":"<p>73.7.10. Les bibliothèques de tags existantes\nIl existe de nombreuses bibliothèques de tags libres ou commerciales disponibles sur le marché. Cette section va tenter de présenter quelques-unes des plus connues et des plus utilisées du monde libre. Cette liste n&amp;#39;est pas exhaustive.</p>"},{"id":"text-440","type":"text","heading":"","plain_text":"73.7.10.1. Struts\nStruts est un framework pour la réalisation d&amp;#39;applications web reposant sur le modèle MVC 2.\nPour la partie vue, Struts utilise les JSP et propose en plus plusieurs bibliothèques de tags pour faciliter le développement de cette partie présentation. Struts possède quatre grandes bibliothèques :","html":"<p>73.7.10.1. Struts\nStruts est un framework pour la réalisation d&amp;#39;applications web reposant sur le modèle MVC 2.\nPour la partie vue, Struts utilise les JSP et propose en plus plusieurs bibliothèques de tags pour faciliter le développement de cette partie présentation. Struts possède quatre grandes bibliothèques :</p>"},{"id":"text-441","type":"text","heading":"","plain_text":"formulaire HMTL\nmodèles (templates)\nJavabeans (bean)\ntraitements logiques (logic)","html":"<p>formulaire HMTL\nmodèles (templates)\nJavabeans (bean)\ntraitements logiques (logic)</p>"},{"id":"text-442","type":"text","heading":"","plain_text":"Le site web de Struts se trouve à l&amp;#39;url : http://struts.apache.org/index.html.\nCe framework est détaillée dans le chapitre «Struts».","html":"<p>Le site web de Struts se trouve à l&amp;#39;url : http://struts.apache.org/index.html.\nCe framework est détaillée dans le chapitre «Struts».</p>"},{"id":"text-443","type":"text","heading":"","plain_text":"73.7.10.2. JSP Standard Tag Library (JSTL)\nJSP Standard Tag Library (JSTL) est une spécification issue du travail du JCP sous la JSR numéro 52. Le chapitre «JSTL (Java server page Standard Tag Library)» fournit plus de détails sur cette spécification.","html":"<p>73.7.10.2. JSP Standard Tag Library (JSTL)\nJSP Standard Tag Library (JSTL) est une spécification issue du travail du JCP sous la JSR numéro 52. Le chapitre «JSTL (Java server page Standard Tag Library)» fournit plus de détails sur cette spécification.</p>"},{"id":"text-444","type":"text","heading":"","plain_text":"73.7.10.3. Apache Taglibs (Jakarta Taglibs)\nApache Taglibs est un ensemble de taglibs : la plupart a été déclarée deprecated notamment à cause de la standardisation de la JSTL.\nIl propose en particulier, la bibliothèque Apache Standard Tag Library qui est une implémentation des versions 1.0, 1.1 et 1.2 de la spécification JSTL.\nLe site officiel est à l&amp;#39;url : http://tomcat.apache.org/taglibs/","html":"<p>73.7.10.3. Apache Taglibs (Jakarta Taglibs)\nApache Taglibs est un ensemble de taglibs : la plupart a été déclarée deprecated notamment à cause de la standardisation de la JSTL.\nIl propose en particulier, la bibliothèque Apache Standard Tag Library qui est une implémentation des versions 1.0, 1.1 et 1.2 de la spécification JSTL.\nLe site officiel est à l&amp;#39;url : http://tomcat.apache.org/taglibs/</p>"},{"id":"text-445","type":"text","heading":"","plain_text":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]","html":"<p>Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]</p>"}],"sections":[{"id":"text-1","heading":"Text","content":"Niveau:\n  Supérieur"},{"id":"text-2","heading":"Text","content":"Les pages de serveur Java (JSP) sont une technologie Java permettant de générer des pages Web dynamiques.\nLa technologie JSP est utilisée pour séparer la présentation en code HTML et les processus écrits en Java en tant que JavaBeans ou servlets. Cela est d&#39;autant plus facile que les JSP définissent une syntaxe particulière pour l&#39;appel d&#39;un bean et l&#39;insertion dynamique du résultat de son traitement dans la page HTML.\nLes informations de ce chapitre concernent les spécifications JSP 1.0 et ultérieures.\nCe chapitre contient plusieurs sections:\n  \n  \nLes JSP vous permettent d&#39;introduire du code Java dans des balises prédéfinies d&#39;une page HTML. La technologie JSP allie la puissance Java côté serveur à la facilité de disposition HTML du côté client.\nLa page officielle de cette technologie est à l&#39;adresse suivante: http://www.oracle.com/technetwork/java/javaee/jsp/index.html.\nUn JSP est généralement composé de:"},{"id":"text-3","heading":"Text","content":"balises de données et HTML\nBalises JSP\nscriptlets (code Java intégré dans le JSP)"},{"id":"text-4","heading":"Text","content":"Les fichiers JSP ont l&#39;extension .jsp par convention.\nConcrètement, les JSP sont basés sur des servlets. Lors du premier appel de la page JSP, le moteur JSP génère et compile automatiquement le servlet qui permet la génération de la page Web. Le code HTML est entièrement inclus dans le servlet. Le code Java est inséré dans le servlet.\nLe servlet généré est compilé, enregistré et exécuté. Les appels suivants depuis le JSP sont beaucoup plus rapides car la servlet, conservée par le serveur, est exécutée directement.\nIl existe plusieurs façons de combiner les technologies JSP, les EJB et les servlets pour développer des applications Web.\nÉtant donné que le code de servlet est généré de manière dynamique, les JSP sont relativement difficiles à déboguer.\nCette approche présente toutefois plusieurs avantages:"},{"id":"text-5","heading":"Text","content":"l&#39;utilisation de Java par le JSP permet l&#39;indépendance de la plate-forme\nexécution mais aussi le serveur Web utilisé.\nséparation des traitements et présentation: la page Web peut être\nécrit par un concepteur et les balises Java peuvent être ajoutés plus tard par le\ndéveloppeur. Les traitements peuvent être faits avec des composants réutilisables\n(Haricots Java).\nLes JSP sont basés sur des servlets: tout ce qui est fait par un servlet\npour la génération de pages dynamiques peut être fait avec un JSP."},{"id":"text-6","heading":"Text","content":"Il existe plusieurs versions des spécifications JSP:"},{"id":"text-7","heading":"Text","content":"Version"},{"id":"text-8","heading":"Text","content":"0,91\nPremière sortie"},{"id":"text-9","heading":"Text","content":"1,0"},{"id":"text-10","heading":"Text","content":"Juin 1999: première version finale\n    lié à l&#39;API servlet 2.1"},{"id":"text-11","heading":"Text","content":"1.1\nDécembre 1999lié à l&#39;API servlet 2.2"},{"id":"text-12","heading":"Text","content":"1.2\nOctobre 2000, JSR 053lié à l&#39;API servlet 2.3"},{"id":"text-13","heading":"Text","content":"2.0\nNovembre 2003, JSR 152lié à l&#39;API servlet 2.4"},{"id":"text-14","heading":"Text","content":"2.1\nMai 2006, JSR 245lié à l&#39;API servlet 2.5"},{"id":"text-15","heading":"Text","content":"2.2\nDécembre 2009, version de maintenance de la JSR 245lié à l&#39;API servlet 3.0"},{"id":"text-16","heading":"Text","content":"2.3\nJuin 2013, version de maintenance de la JSR 245lié à l&#39;API servlet 3.1"},{"id":"text-17","heading":"Text","content":"73.1.1. Le choix entre JSP et Servlets\nLes servlets et les JSP ont beaucoup de choses en commun puisqu&#39;un JSP est finalement converti en un servlet. Le choix d&#39;utiliser l&#39;une ou l&#39;autre de ces technologies ou les deux doit être fait pour tirer le meilleur parti de leurs avantages.\nDans une servlet, les traitements et la présentation sont regroupés. L’aspect présentation est dans ce cas difficile à développer et à maintenir en raison de l’utilisation répétée de méthodes pour insérer le code HTML dans le flux de sortie. De plus, une simple modification du code HTML nécessite la recompilation du servlet. Avec un JSP, la séparation des traitements et de la présentation rend cela très simple et automatique.\nIl est préférable d’utiliser les JSP pour générer des pages Web dynamiques.\nL&#39;utilisation des servlets est obligatoire si elles doivent communiquer directement avec une applet ou une application et non plus avec un serveur Web."},{"id":"text-18","heading":"Text","content":"73.1.2. JSP et technologies concurrentes\nIl existe plusieurs technologies dont le but est similaire aux JSP, notamment ASP, PHP et ASP.Net. Chacune de ces technologies présente des avantages et des inconvénients, dont voici une liste non exhaustive."},{"id":"text-19","heading":"Text","content":"JSP"},{"id":"text-20","heading":"Text","content":"PHP"},{"id":"text-21","heading":"Text","content":"ASPIC"},{"id":"text-22","heading":"Text","content":"ASP.Net"},{"id":"text-23","heading":"Text","content":"la langue"},{"id":"text-24","heading":"Text","content":"Java"},{"id":"text-25","heading":"Text","content":"PHP"},{"id":"text-26","heading":"Text","content":"VBScript ou JScript"},{"id":"text-27","heading":"Text","content":"Toutes les langues supportées par .Net (C #, VB.Net, Delphi, &#8230;)"},{"id":"text-28","heading":"Text","content":"mode d&#39;exécution"},{"id":"text-29","heading":"Text","content":"Compilé en pseudo-code (bytecode)"},{"id":"text-30","heading":"Text","content":"Interprète"},{"id":"text-31","heading":"Text","content":"Interprète"},{"id":"text-32","heading":"Text","content":"Compilé en pseudo-code (MSIL)"},{"id":"text-33","heading":"Text","content":"Principaux avantages\nReposez-vous sur la plate-forme Java dont il hérite des avantages\nOpen source \n      Nombreuses bibliothèques et sources d&#39;applications gratuites disponibles\n      Facile à mettre en œuvre\nFacile à mettre en œuvre\nReposez-vous sur la plate-forme .Net dont il hérite des avantages \n      Wysiwyg et les événements\n      Code derrière pour la séparation affichage / traitement"},{"id":"text-34","heading":"Text","content":"principaux inconvénients\nDébogage plutôt fastidieux\n      Beaucoup de code à écrire\nDébogage plutôt fastidieux\n      Beaucoup de code à écrire \n      support partiel de la programmation orientée objet en attente de la version 5\nDébogage plutôt fastidieux\n      Beaucoup de code à écrire \n      Fonctionne principalement sur les plateformes Windows\n      Pas de POO, objets métier encapsulés dans des objets COM lourds à implémenter\nFonctionne principalement sur les plates-formes Windows. (Voir le projet Mono pour le support d&#39;autres plateformes)"},{"id":"text-35","heading":"Text","content":"Dans un premier temps, Sun a fourni un kit de développement pour les JSP: le kit de développement Web du serveur Java (JSWDK). Ensuite, Sun a confié au projet Apache le développement de l’implémentation de référence du moteur JSP: le projet Tomcat. Depuis la version 2.2, l&#39;implémentation de référence est le projet Glassfish.\nSelon la version de l&#39;API utilisée, vous devez choisir un produit différent. Le tableau ci-dessous récapitule les implémentations de référence basées sur la version de l&#39;API implémentée."},{"id":"text-36","heading":"Text","content":"Produit"},{"id":"text-37","heading":"Text","content":"Version"},{"id":"text-38","heading":"Text","content":"Version de l&#39;API Servlet implémentée"},{"id":"text-39","heading":"Text","content":"Version de l&#39;API JSP implémentée"},{"id":"text-40","heading":"Text","content":"JSWDK"},{"id":"text-41","heading":"Text","content":"1.0.1"},{"id":"text-42","heading":"Text","content":"2.1"},{"id":"text-43","heading":"Text","content":"1,0"},{"id":"text-44","heading":"Text","content":"Matou"},{"id":"text-45","heading":"Text","content":"3.2"},{"id":"text-46","heading":"Text","content":"2.2"},{"id":"text-47","heading":"Text","content":"1.1"},{"id":"text-48","heading":"Text","content":"Matou"},{"id":"text-49","heading":"Text","content":"4.0"},{"id":"text-50","heading":"Text","content":"2.3"},{"id":"text-51","heading":"Text","content":"1.2"},{"id":"text-52","heading":"Text","content":"Matou"},{"id":"text-53","heading":"Text","content":"5.0"},{"id":"text-54","heading":"Text","content":"2.4"},{"id":"text-55","heading":"Text","content":"2.0"},{"id":"text-56","heading":"Text","content":"Matou"},{"id":"text-57","heading":"Text","content":"6.0"},{"id":"text-58","heading":"Text","content":"2,5"},{"id":"text-59","heading":"Text","content":"2.1"},{"id":"text-60","heading":"Text","content":"Glassfish"},{"id":"text-61","heading":"Text","content":"3.0"},{"id":"text-62","heading":"Text","content":"3.0"},{"id":"text-63","heading":"Text","content":"2.2"},{"id":"text-64","heading":"Text","content":"Glassfish"},{"id":"text-65","heading":"Text","content":"4.0"},{"id":"text-66","heading":"Text","content":"3.1"},{"id":"text-67","heading":"Text","content":"2.3"},{"id":"text-68","heading":"Text","content":"Il est également possible d&#39;utiliser tout conteneur Web compatible avec les spécifications de la plate-forme J2EE / Java EE. Une liste non exhaustive est fournie dans le chapitre &quot;Outils gratuits et commerciaux&quot;."},{"id":"text-69","heading":"Text","content":"73.2.1. Le kit de développement Web JavaServer (JSWDK) sous Windows\nLe fichier JSWDK est proposé sous forme de fichier zip nommé jswdk_1_0_1-win.zip.\nPour l&#39;installer, décompressez simplement l&#39;archive dans un répertoire du système. Le serveur commence à exécuter le fichier startserver.bat."},{"id":"text-70","heading":"Text","content":"Pour lancer le serveur:"},{"id":"text-71","heading":"Text","content":"C:  jswdk-1.0.1&gt; startserver.bat"},{"id":"text-72","heading":"Text","content":"Utiliser classpath :.  Des classes;.  Webserver.jar ;.  Lib  jakarta.jar ;.  Lib  servlet.jar;.\n Lib  jsp.jar ;.  Lib  jspengine.jar ;.  Exemples  WEB-INF  jsp  beans ;.  Pages Web  WEB-INF\n Servlets ;.  Webpages  WEB-INF  jsp  beans ;.  Lib  xml.jar ;.  Lib  moo.jar  lib  tools.ja\nDr. C:  jdk1.3  lib  tools.jar;\nC:  jswdk-1.0.1&gt;"},{"id":"text-73","heading":"Text","content":"Le serveur s&#39;exécute dans une console en arrière-plan. Cette console permet de voir les messages envoyés par le serveur."},{"id":"text-74","heading":"Text","content":"Exemple: au démarrage"},{"id":"text-75","heading":"Text","content":"JSWDK WebServer Version 1.0.1\nConfiguration chargée à partir de: fichier: C:  jswdk-1.0.1  webserver.xml\nnoeud final créé: localhost / 127.0.0.1: 8080"},{"id":"text-76","heading":"Text","content":"Si la JSP contient une erreur, le serveur envoie une page d&#39;erreur:"},{"id":"text-77","heading":"Text","content":"Une exception est levée et est affichée dans la fenêtre où le serveur est en cours d&#39;exécution:"},{"id":"text-78","heading":"Text","content":"Exemple:"},{"id":"text-79","heading":"Text","content":"- Commentaires de la page JSP -\n^\n1 erreur\nà l&#39;adresse com.sun.jsp.compiler.Main.compile (Main.java:347)\nà l&#39;adresse com.sun.jsp.runtime.JspLoader.loadJSP (JspLoader.java:135)\nà l&#39;adresse com.sun.jsp.runtime.JspServlet $ JspServletWrapper.loadIfNecessary (JspS\nervlet.java:77)\nà l&#39;adresse com.sun.jsp.runtime.JspServlet $ JspServletWrapper.service (JspServlet.j\nava: 87)\nà l&#39;adresse com.sun.jsp.runtime.JspServlet.serviceJspFile (JspServlet.java:218)\nà l&#39;adresse com.sun.jsp.runtime.JspServlet.service (JspServlet.java:294)\nà l&#39;adresse javax.servlet.http.HttpServlet.service (HttpServlet.java:840)\nà l&#39;adresse com.sun.web.core.ServletWrapper.handleRequest (ServletWrapper.java:155\n)\nà l&#39;adresse com.sun.web.core.Context.handleRequest (Context.java:414)\nà l&#39;adresse com.sun.web.server.ConnectionHandler.run (ConnectionHandler.java:139)\nPROBLEME DE FIL SUIVANT: java.io.IOException: socket fermé\njava.io.IOException: socket fermé\nsur java.net.PlainSocketImpl.getInputStream (Source inconnue)\nat java.net.Socket $ 1.run (Source inconnue)\nat java.security.AccessController.doPrivileged (Native Method)\nat java.net.Socket.getInputStream (Source inconnue)\nà l&#39;adresse com.sun.web.server.ConnectionHandler.run (ConnectionHandler.java:161)"},{"id":"text-80","heading":"Text","content":"Le répertoire de travail contient le code et le bytecode des servlets générés à partir des JSP.\nPour arrêter le serveur, exécutez simplement le script stopserver.bat.\nLorsque le serveur s&#39;arrête, le répertoire de travail contenant les servlets générés à partir des fichiers JSP est supprimé."},{"id":"text-81","heading":"Text","content":"73.2.2. Le serveur Tomcat\nLa mise en oeuvre et l’utilisation de Tomcat sont détaillées dans une section du chapitre. &quot;Servlets&quot;."},{"id":"text-82","heading":"Text","content":"Une grande partie du contenu d&#39;une JSP est constituée de code HTML. De plus, la méthode la plus simple pour écrire un fichier JSP consiste à écrire le fichier HTML avec un outil dédié, puis à ajouter les balises JSP pour les pièces dynamiques.\nLa seule restriction sur HTML est l&#39;utilisation de fragments &quot;  Dans ce cas, le moyen le plus simple consiste à utiliser les caractères spéciaux HTML &amp; lt; et &amp; gt; sinon, l&#39;analyseur de moteur JSP considère qu&#39;il s&#39;agit de balises JSP et renvoie une erreur."},{"id":"text-83","heading":"Text","content":"Exemple:"},{"id":"text-84","heading":"Text","content":"Tester"},{"id":"text-85","heading":"Text","content":"Plusieurs balises JSP commencent par &lt;% et se terminent par% &amp; gt;"},{"id":"text-86","heading":"Text","content":"Il existe trois types de tags:"},{"id":"text-87","heading":"Text","content":"balises directive: elles permettent de contrôler la structure du servlet\ngénéré\nbalises de script: elles permettent d&#39;insérer du code Java dans le servlet\nbalises d&#39;action: elles facilitent l&#39;utilisation de composants"},{"id":"text-88","heading":"Text","content":"Avertissement: Les noms de balises sont sensibles à la casse."},{"id":"text-89","heading":"Text","content":"73.4.1. Les balises directives \nLes directives vous permettent de spécifier des informations globales sur la page JSP. Les spécifications JSP définissent trois directives:"},{"id":"text-90","heading":"Text","content":"page: Définir les options de configuration\ninclude: permet d&#39;inclure des fichiers statiques dans le fichier JSP avant la génération.\nde la servlet\ntaglib: permet de définir des tags personnalisés"},{"id":"text-91","heading":"Text","content":"Leur syntaxe est la suivante:\n&lt;% @ Directif attribut= &quot;valeur&quot;&#8230;%&gt;"},{"id":"text-92","heading":"Text","content":"73.4.1.1. La directive de page\nCette directive doit être utilisée dans toutes les pages JSP: elle vous permet de définir des options s’appliquant à l’ensemble du JSP.\nIl peut être placé n&#39;importe où dans la source mais il est préférable de le mettre au début du fichier, même avant la balise. . Il peut être utilisé plusieurs fois dans la même page, mais il ne doit définir la valeur d&#39;une option qu&#39;une seule fois, à l&#39;exception de l&#39;option d&#39;importation.\nLes options définies par cette directive sont de la forme option = valeur."},{"id":"text-93","heading":"Text","content":"Option"},{"id":"text-94","heading":"Text","content":"Valeur"},{"id":"text-95","heading":"Text","content":"Valeur par défaut"},{"id":"text-96","heading":"Text","content":"Autre valeur possible"},{"id":"text-97","heading":"Text","content":"autoFlush"},{"id":"text-98","heading":"Text","content":"Chaîne"},{"id":"text-99","heading":"Text","content":"&quot;Vrai&quot;"},{"id":"text-100","heading":"Text","content":"&quot;Faux&quot;"},{"id":"text-101","heading":"Text","content":"tampon"},{"id":"text-102","heading":"Text","content":"Chaîne"},{"id":"text-103","heading":"Text","content":"&quot;8kb&quot;"},{"id":"text-104","heading":"Text","content":"&quot;Aucun&quot; ou &quot;nnnkb&quot; (nnn indiquant la valeur)"},{"id":"text-105","heading":"Text","content":"contentType"},{"id":"text-106","heading":"Text","content":"Une chaîne contenant le type MIME"},{"id":"text-107","heading":"Text","content":"errorPage"},{"id":"text-108","heading":"Text","content":"Une chaîne contenant une URL"},{"id":"text-109","heading":"Text","content":"s&#39;étend"},{"id":"text-110","heading":"Text","content":"Une classe"},{"id":"text-111","heading":"Text","content":"importation"},{"id":"text-112","heading":"Text","content":"Une classe ou un package. *"},{"id":"text-113","heading":"Text","content":"Info"},{"id":"text-114","heading":"Text","content":"Chaîne"},{"id":"text-115","heading":"Text","content":"isErrorPage"},{"id":"text-116","heading":"Text","content":"Chaîne"},{"id":"text-117","heading":"Text","content":"&quot;Faux&quot;"},{"id":"text-118","heading":"Text","content":"&quot;Vrai&quot;"},{"id":"text-119","heading":"Text","content":"isThreadSafe"},{"id":"text-120","heading":"Text","content":"Chaîne"},{"id":"text-121","heading":"Text","content":"&quot;Vrai&quot;"},{"id":"text-122","heading":"Text","content":"&quot;Faux&quot;"},{"id":"text-123","heading":"Text","content":"la langue"},{"id":"text-124","heading":"Text","content":"Chaîne"},{"id":"text-125","heading":"Text","content":"&quot;Java&quot;"},{"id":"text-126","heading":"Text","content":"session"},{"id":"text-127","heading":"Text","content":"Chaîne"},{"id":"text-128","heading":"Text","content":"&quot;Vrai&quot;"},{"id":"text-129","heading":"Text","content":"&quot;Faux&quot;"},{"id":"text-130","heading":"Text","content":"Exemple:"},{"id":"text-131","heading":"Text","content":"Les options sont:"},{"id":"text-132","heading":"Text","content":"autoFlush = &quot;vrai| Faux &quot;\nCette option spécifie si le flux de sortie du servlet doit être vidé lorsque\nle tampon est plein. Si la valeur est false, une exception est levée dès que\nle tampon est plein. Nous ne pouvons pas définir false si la valeur du tampon est\naucun."},{"id":"text-133","heading":"Text","content":"tampon = &quot;aucun |8kb|Taillekb &quot;\nCette option permet de spécifier la taille de la mémoire tampon des données générées contenues\npar l&#39;objet de type JspWriter."},{"id":"text-134","heading":"Text","content":"contentType = &quot;mimeType [;charset=[;charset=[;charset=[;charset=jeu de caractères ]&quot;\n| &quot;text / html; jeu de caractères = ISO-8859-1&quot; \nCette option spécifie le type MIME des données générées.\nCette option est équivalente à"},{"id":"text-135","heading":"Text","content":"errorPage =&quot;RelativeURL&quot;\nCette option vous permet de spécifier le JSP appelé en cas d’exception.\nlevage\nSi l&#39;URL ne commence pas par &amp; # 39; / &amp; # 39 ;, alors l&#39;URL est relative au répertoire\nserveur Web principal sinon il est relatif au répertoire qui contient\nle JSP"},{"id":"text-136","heading":"Text","content":"s&#39;étend= &quot;Package.class&quot;\nCette option vous permet de spécifier la classe qui sera la super classe de l&#39;objet\nJava créé à partir du JSP."},{"id":"text-137","heading":"Text","content":"import = &quot; paquet. * , &#8230; &quot;\nCette option importe les classes contenues dans les packages utilisés.\ndans le code du JSP. Cette option est utilisée comme instruction d&#39;importation\ndans un code source Java. \nChaque classe ou package est séparé par une virgule.\nCette option peut être présente dans plusieurs directives de page."},{"id":"text-138","heading":"Text","content":"info = &quot;text&quot;\nCette option vous permet de spécifier une petite description du fichier JSP. Le texte fourni\nsera renvoyé par la méthode getServletInfo () du servlet généré."},{"id":"text-139","heading":"Text","content":"isErrorPage = &quot;true |faux&quot;\nCette option spécifie si le JSP génère une page d&#39;erreur. La valeur\ntrue permet à l&#39;objet Exception d&#39;être utilisé dans le JSP"},{"id":"text-140","heading":"Text","content":"isThreadSafe = &quot;vrai| Faux &quot;\nCette option indique si le servlet généré sera multithread: dans ce cas,\nla même instance du servlet peut gérer plusieurs demandes simultanément.\nEn retour, il doit gérer correctement les accès concurrents aux ressources.\nLa valeur false amène le servlet généré à implémenter l&#39;interface SingleThreadModel."},{"id":"text-141","heading":"Text","content":"language = &quot;java&quot;\nCette option définit le langage utilisé pour écrire du code dans le JSP. le\nla seule valeur actuellement autorisée est &quot;java&quot;."},{"id":"text-142","heading":"Text","content":"session = &quot;vrai| faux&quot;\nCette option spécifie si le JSP est inclus dans une session ou si\nnon. La valeur par défaut (true) permet l&#39;utilisation d&#39;un objet de session de\nType HttpSession qui gère les informations dans une session."},{"id":"text-143","heading":"Text","content":"73.4.1.2. La directive include\nCette directive vous permet d&#39;inclure un fichier dans le code source JSP. Le fichier inclus peut être un extrait de code JSP, HTML ou Java. Le fichier est inclus dans le JSP avant d&#39;être interprété par le moteur JSP.\nCette balise est particulièrement utile pour insérer un élément multi-page commun tel qu&#39;un en-tête ou un pied de page.\nSi le fichier inclus est un fichier HTML, il ne doit pas contenir de balise. , ,  ou  ce qui dupliquerait ceux présents dans le fichier JSP. Cela nécessite l&#39;écriture de fichiers HTML particuliers uniquement pour être inclus dans les JSP: ils ne peuvent pas être utilisés seuls.\nLa syntaxe est la suivante:"},{"id":"text-144","heading":"Text","content":"Si le chemin commence par &amp; # 39; / # 39 ;, le chemin est relatif au contexte de l&#39;application, sinon il est relatif au fichier JSP."},{"id":"text-145","heading":"Text","content":"Exemple:"},{"id":"text-146","heading":"Text","content":"hello.htm:"},{"id":"text-147","heading":"Text","content":"BONJOUR"},{"id":"text-148","heading":"Text","content":"Exemple: Test1.jsp"},{"id":"text-149","heading":"Text","content":"Test de page JSP"},{"id":"text-150","heading":"Text","content":"Test d&#39;inclusion d&#39;un fichier dans le JSP"},{"id":"text-151","heading":"Text","content":"fin"},{"id":"text-152","heading":"Text","content":"Pour tester cette JSP avec le JSWDK, placez simplement ces deux fichiers dans le répertoire jswdk-1.0.1  examples  jsp  test.\nPour afficher le fichier JSP, entrez l&#39;URL http: // localhost: 8080 / examples / jsp / test / Test1.jsp dans un navigateur."},{"id":"text-153","heading":"Text","content":"Attention: une modification du fichier inclus ne provoque pas de régénération\net une compilation du servlet correspondant au JSP. Pour insérer un\nfichier dynamiquement lors de l&#39;exécution du servlet, il est nécessaire d&#39;utiliser la balise\n      ."},{"id":"text-154","heading":"Text","content":"73.4.1.3. La directive taglib\nCette directive déclare l&#39;utilisation d&#39;une bibliothèque de balises personnalisée. L&#39;utilisation de cette directive est détaillée dans la section consacrée aux bibliothèques de balises personnalisées."},{"id":"text-155","heading":"Text","content":"73.4.2. Tags de script\nCes balises sont utilisées pour insérer du code Java qui sera inclus dans le servlet généré à partir du JSP. Il existe trois balises pour l&#39;insertion de code Java:"},{"id":"text-156","heading":"Text","content":"la balise de déclaration: le code Java est inclus dans le corps du servlet\ngénéré. Ce code peut être la déclaration de variables d&#39;instance ou de classe ou la déclaration de méthodes.\nla balise expression: évalue une expression et insère le résultat dans la forme\nchaîne dans la page Web générée.\nla balise scriptlets: Par défaut, le code Java est inclus dans la méthode service () du servlet."},{"id":"text-157","heading":"Text","content":"Il est possible d&#39;utiliser dans ces balises plusieurs objets définis par les JSP."},{"id":"text-158","heading":"Text","content":"73.4.2.1. La balise de déclaration \nCette balise est utilisée pour déclarer des variables ou des méthodes pouvant être utilisées dans le JSP. Il ne génère aucun caractère dans le fichier HTML de sortie.\nLa syntaxe est la suivante:"},{"id":"text-159","heading":"Text","content":"Exemple:"},{"id":"text-160","heading":"Text","content":"Les variables déclarées de cette manière peuvent être utilisées dans les balises d&#39;expression et de scriptlet.\nIl est possible de déclarer plusieurs variables dans la même balise en les séparant avec &amp; # 39 ;; &amp; # 39; personnages.\nCette balise vous permet également d’insérer des méthodes dans le corps du servlet."},{"id":"text-161","heading":"Text","content":"Exemple:"},{"id":"text-162","heading":"Text","content":"Tester"},{"id":"text-163","heading":"Text","content":"&lt;%!\nint minimum (int val1, int val2) \nsi (val1 < val2) return val1;\n   else return val2;\n \n%>"},{"id":"text-164","heading":"Text","content":"Le plus petit des 5 et 3 est"},{"id":"text-165","heading":"Text","content":"73.4.2.2. La balise d&#39;expression \nLe moteur JSP remplace cette balise par le résultat de l&#39;évaluation de l&#39;expression présente dans la balise.\nCe résultat est toujours converti en chaîne. Cette balise est un raccourci pour éviter d’utiliser la méthode println () lors de l’insertion de données dynamiques dans le fichier HTML.\nLa syntaxe est la suivante:"},{"id":"text-166","heading":"Text","content":"Le signe &amp; # 39; = &amp; # 39; doit être collé sous le signe%."},{"id":"text-167","heading":"Text","content":"Attention: ne mettez pas &amp; # 39; &amp; # 39; &amp; # 39; &amp; # 39; à la fin de l&#39;expression."},{"id":"text-168","heading":"Text","content":"Exemple: insertion de la date dans la page HTML"},{"id":"text-169","heading":"Text","content":"Test de page JSP"},{"id":"text-170","heading":"Text","content":"Date d&#39;aujourd&#39;hui:"},{"id":"text-171","heading":"Text","content":"Résultat:"},{"id":"text-172","heading":"Text","content":"Date du jour: jeu 15 fév 11:15:24 CET 2001"},{"id":"text-173","heading":"Text","content":"L&#39;expression est évaluée et convertie en une chaîne avec un appel à la méthode toString (). Cette chaîne est insérée dans la page HTML à la place de la balise. Il est possible que le résultat corresponde à une partie ou à la totalité d&#39;une balise HTML ou même à une JSP"},{"id":"text-174","heading":"Text","content":"Exemple:"},{"id":"text-175","heading":"Text","content":"Test de page JSP"},{"id":"text-176","heading":"Text","content":"&lt;% = &quot;&quot;%&gt; Bonjour &lt;% =&quot;&quot;%&gt;"},{"id":"text-177","heading":"Text","content":"Résultat: code HTML généré"},{"id":"text-178","heading":"Text","content":"Test de page JSP"},{"id":"text-179","heading":"Text","content":"Bonjour"},{"id":"text-180","heading":"Text","content":"73.4.2.3. Les variables implicites\nLes spécifications JSP définissent plusieurs objets utilisables dans le code, les plus utiles étant:"},{"id":"text-181","heading":"Text","content":"Objet"},{"id":"text-182","heading":"Text","content":"Classe"},{"id":"text-183","heading":"Text","content":"Rôle"},{"id":"text-184","heading":"Text","content":"en dehors"},{"id":"text-185","heading":"Text","content":"javax.servlet.jsp.JspWriter"},{"id":"text-186","heading":"Text","content":"Flux de sortie de la page HTML générée"},{"id":"text-187","heading":"Text","content":"demande"},{"id":"text-188","heading":"Text","content":"javax.servlet.http.HttpServletRequest"},{"id":"text-189","heading":"Text","content":"Contient les informations de la requête"},{"id":"text-190","heading":"Text","content":"réponse"},{"id":"text-191","heading":"Text","content":"javax.servlet.http.HttpServletResponse"},{"id":"text-192","heading":"Text","content":"Contient l&#39;information de réponse"},{"id":"text-193","heading":"Text","content":"session"},{"id":"text-194","heading":"Text","content":"javax.servlet.http.HttpSession"},{"id":"text-195","heading":"Text","content":"Gère la session"},{"id":"text-196","heading":"Text","content":"73.4.2.4. La balise scriptlets \nCette balise contient du code Java nommé scriptlet.\nLa syntaxe est la suivante:"},{"id":"text-197","heading":"Text","content":"Exemple:"},{"id":"text-198","heading":"Text","content":"Date d&#39;aujourd&#39;hui:"},{"id":"text-199","heading":"Text","content":"Par défaut, le code inclus dans la balise est inséré dans la méthode service () du servlet généré à partir du JSP.\nCette balise ne peut contenir autre chose que du code Java: elle ne peut pas contenir par exemple des balises HTML ou JSP. Pour ce faire, vous devez fermer la balise de scriptlet, placer la balise HTML ou JSP, puis redémarrer une balise de scriptlet pour continuer le code."},{"id":"text-200","heading":"Text","content":"Exemple:"},{"id":"text-201","heading":"Text","content":"Test de page JSP"},{"id":"text-202","heading":"Text","content":"&lt;% pour (int i = 0; i"},{"id":"text-203","heading":"Text","content":"Résultat: la page HTML générée"},{"id":"text-204","heading":"Text","content":"Test de page JSP"},{"id":"text-205","heading":"Text","content":"0 \n1 \n2 \n3 \n4 \n5 \n6 \n7 \n8 \n9"},{"id":"text-206","heading":"Text","content":"73.4.3. Tags de commentaire\nIl existe deux types de commentaires avec les JSP:"},{"id":"text-207","heading":"Text","content":"commentaires visibles dans le code HTML\ncommentaires invisibles dans le code HTML"},{"id":"text-208","heading":"Text","content":"73.4.3.1. Commentaires HTML \nCes commentaires sont ceux définis par le format HTML. Ils sont entièrement reproduits dans le fichier HTML généré. Il est possible d&#39;insérer dans cette balise une balise JSP de type expression à exécuter.\nLa syntaxe est la suivante:\n&lt;! &#8211; commentaires[[[[ ]-&gt;"},{"id":"text-209","heading":"Text","content":"Exemple:"},{"id":"text-210","heading":"Text","content":"Test de page JSP"},{"id":"text-211","heading":"Text","content":"&lt;! - Cette page a été générée sur  -&gt;\nBonjour"},{"id":"text-212","heading":"Text","content":"Résultat:"},{"id":"text-213","heading":"Text","content":"Test de page JSP"},{"id":"text-214","heading":"Text","content":"Bonjour"},{"id":"text-215","heading":"Text","content":"Le contenu d&#39;une expression incluse dans les commentaires est dynamique: sa valeur peut changer à chaque génération de la page en fonction de son contenu."},{"id":"text-216","heading":"Text","content":"73.4.3.2. Commentaires cachés \nLes commentaires masqués sont utilisés pour documenter la page JSP. Leur contenu est ignoré par le moteur JSP et n&#39;est donc pas reproduit dans la page HTML générée.\nLa syntaxe est la suivante:"},{"id":"text-217","heading":"Text","content":"Exemple:"},{"id":"text-218","heading":"Text","content":"Test de page JSP"},{"id":"text-219","heading":"Text","content":"Bonjour"},{"id":"text-220","heading":"Text","content":"Résultat:"},{"id":"text-221","heading":"Text","content":"Test de page JSP"},{"id":"text-222","heading":"Text","content":"Bonjour"},{"id":"text-223","heading":"Text","content":"Cette balise peut être utile pour éviter l&#39;exécution de code pendant la phase de débogage."},{"id":"text-224","heading":"Text","content":"73.4.4. Les balises d&#39;action\nLes étiquettes d&#39;action permettent d&#39;effectuer des traitements couramment utilisés."},{"id":"text-225","heading":"Text","content":"73.4.4.1. Le tag \nLe tag  vous permet de localiser une instance ou d&#39;instancier un bean à utiliser dans le fichier JSP.\nL&#39;utilisation d&#39;un bean dans une JSP est très pratique car elle peut encapsuler des processus complexes et être réutilisée par d&#39;autres JSP ou composants. Par exemple, le bean peut fournir un accès à une base de données. L&#39;utilisation de beans simplifie les processus inclus dans le JSP.\nLors de l&#39;instanciation d&#39;un bean, nous spécifions la portée du bean. Si le bean demandé est déjà instancié pour la portée spécifiée, aucune nouvelle instance du bean n&#39;est créée, mais sa référence est simplement renvoyée: la balise  n&#39;instancie pas nécessairement un objet.\nCette balise ne permet pas de traiter directement EJB.\nLa syntaxe est la suivante:\n&lt;Jsp: useBeanid = &quot;beanInstanceName &quot;scope = &quot;page| Demande | session | application &quot;\nbeanName = &quot; &lt;% = expression %&gt; &quot;type =&quot;package.class&quot;\n/&gt; \nL&#39;attribut id est utilisé pour donner un nom à la variable qui contiendra la référence sur le bean.\nL&#39;attribut scope permet de définir la portée sur laquelle le bean est défini et utilisable. La valeur de cet attribut détermine la manière dont la balise localise ou instancie le bean. Les valeurs possibles sont:"},{"id":"text-226","heading":"Text","content":"Valeur"},{"id":"text-227","heading":"Text","content":"Rôle"},{"id":"text-228","heading":"Text","content":"page"},{"id":"text-229","heading":"Text","content":"Le haricot peut être utilisé sur toute la page\nJSP ainsi que dans les fichiers statiques inclus.\nC&#39;est la valeur par défaut."},{"id":"text-230","heading":"Text","content":"demande\n    le haricot est accessible pendant la durée de vie de la demande.\nLa méthode getAttribute () de l&#39;objet request fournit une référence\nsur le haricot."},{"id":"text-231","heading":"Text","content":"session\n   \n    le haricot est utilisable par tous les JSP qui appartiennent\nà la même session que le JSP qui a instancié le bean. Le haricot est utilisable\ntout au long de la session par toutes les pages qui y participent. Le JSP\nqui crée le bean doit avoir l&#39;attribut session = &quot;true&quot; dans sa directive\npage."},{"id":"text-232","heading":"Text","content":"application\n   \n    le haricot est utilisable par tous les JSP qui appartiennent\nà la même application que le JSP qui a instancié le bean. Le haricot est\ninstancié uniquement lors du rechargement de l&#39;application."},{"id":"text-233","heading":"Text","content":"L&#39;attribut class est utilisé pour indiquer la classe du bean.\nL&#39;attribut type est utilisé pour spécifier le type de la variable qui contiendra la référence du bean. La valeur spécifiée doit être une super classe du bean ou une interface implémentée par le bean (directement ou par héritage).\nL&#39;attribut beanName est utilisé pour instancier le bean à l&#39;aide de la méthode instanciate () de la classe Beans."},{"id":"text-234","heading":"Text","content":"Exemple:"},{"id":"text-235","heading":"Text","content":"Dans cet exemple, une instance de MonBean est créée une fois dans la session. Dans la même session, l&#39;appel de la balise  avec le même bean et la même portée ne renverra que l&#39;instance créée. Le haricot est donc accessible tout au long de la session.\nLe tag  recherche si une instance du bean existe avec le nom et la portée spécifiés. S&#39;il n&#39;existe pas, une instance est créée. S&#39;il y a instanciation du haricot, alors les balises  inclus dans la balise sont utilisés pour initialiser les propriétés du bean, sinon ils sont ignorés. Tags inclus entre les tags  et  ne sont exécutés que si le haricot est instancié."},{"id":"text-236","heading":"Text","content":"Exemple:"},{"id":"text-237","heading":"Text","content":"Cet exemple a le même effet que le précédent avec une initialisation des propriétés du bean lors de son instanciation."},{"id":"text-238","heading":"Text","content":"Exemple complet: TestBean.jsp"},{"id":"text-239","heading":"Text","content":"Test d&#39;instanciation d&#39;un haricot dans un JSP"},{"id":"text-240","heading":"Text","content":"Test d&#39;utilisation d&#39;un bean dans un JSP"},{"id":"text-241","heading":"Text","content":"nom initial ="},{"id":"text-242","heading":"Text","content":"nom mis à jour ="},{"id":"text-243","heading":"Text","content":"Exemple complet: Person.java"},{"id":"text-244","heading":"Text","content":"paquet de test;\nClasse publique Personne \nnom de chaîne privé;\nprivate String prenom;"},{"id":"text-245","heading":"Text","content":"personne publique () \nthis.name = &quot;nom par défaut&quot;;\nthis.prenom = &quot;nom par défaut&quot;;"},{"id":"text-246","heading":"Text","content":"public void setName (nom de chaîne) \nthis.name = name;"},{"id":"text-247","heading":"Text","content":"public String getName () \nreturn (this.name);"},{"id":"text-248","heading":"Text","content":"public void setPenom (String name) \nthis.prenom = prénom;"},{"id":"text-249","heading":"Text","content":"public String getPrenom () \nretour (this.prenom);"},{"id":"text-250","heading":"Text","content":"Selon le moteur JSP utilisé, les fichiers bean doivent être placés dans un répertoire particulier pour être accessibles par JSP.\nPour tester cette JSP avec Tomcat, vous devez compiler le bean Person dans le répertoire c:  jakarta-tomcat  webapps  examples  web-inf  classes  test et placer le fichier TestBean.jsp dans le répertoire c:  jakarta-tomcat. répertoire  webapps  examples  jsp  test."},{"id":"text-251","heading":"Text","content":"73.4.4.2. Le tag \nLe tag  vous permet de mettre à jour la valeur d&#39;un ou plusieurs attributs d&#39;un bean. La balise utilise la méthode setter (setXXX () où XXX est le nom de la propriété avec la première lettre en majuscule) pour mettre à jour la valeur. Le haricot doit exister via un appel à la balise .\nIl existe trois façons de mettre à jour les propriétés à partir des paramètres de la requête ou avec une valeur:"},{"id":"text-252","heading":"Text","content":"alimente automatiquement toutes les propriétés avec les paramètres correspondants de la requête\nnourrir automatiquement une propriété avec le paramètre de requête\ncorrespondant\nfournir une propriété avec la valeur spécifiée"},{"id":"text-253","heading":"Text","content":"La syntaxe est la suivante:\n&lt;jsp: setProperty name = &quot;beanInstanceName&quot;\npropriété = &quot;nom de la propriété&quot;valeur =&quot;  &lt;% = expression%&gt; &quot;\n/&gt;\nL&#39;attribut name doit contenir le nom de la variable contenant la référence du bean. Cette valeur doit être identique à celle de l&#39;attribut id de la balise  utilisé pour instancier le haricot.\nL&#39;attribut property = &quot;*&quot; est utilisé pour alimenter automatiquement les propriétés du bean avec les paramètres correspondants contenus dans la requête. Le nom des propriétés et le nom des paramètres doivent être identiques.\nLes paramètres de la requête étant toujours fournis sous forme de chaîne, une conversion est effectuée à l&#39;aide de la méthode valueOf () du wrapper du type de propriété."},{"id":"text-254","heading":"Text","content":"Exemple:"},{"id":"text-255","heading":"Text","content":"La propriété d&#39;attribut = &quot;propertyName &quot;[param=&quot;[param=&quot;[param= »[param= »paramètreName &quot;]permet de mettre à jour un attribut du haricot. Par défaut, l&#39;alimentation est automatiquement effectuée avec le paramètre correspondant dans la requête. Si le nom de la propriété et le paramètre sont différents, il est nécessaire de spécifier la propriété d&#39;attribut et l&#39;attribut param contenant le nom du paramètre qui alimentera la propriété du bean."},{"id":"text-256","heading":"Text","content":"Exemple:"},{"id":"text-257","heading":"Text","content":"La propriété d&#39;attribut = &quot;propertyName &quot;valeur =&quot; chaîne  &quot;alimente la propriété du bean avec une valeur particulière."},{"id":"text-258","heading":"Text","content":"Exemple:"},{"id":"text-259","heading":"Text","content":"Il n&#39;est pas possible d&#39;utiliser param et value dans la même balise."},{"id":"text-260","heading":"Text","content":"Exemple: Cet exemple est identique au précédent"},{"id":"text-261","heading":"Text","content":"Test d&#39;instanciation d&#39;un haricot dans un JSP"},{"id":"text-262","heading":"Text","content":"Test d&#39;utilisation d&#39;un bean dans un JSP"},{"id":"text-263","heading":"Text","content":"nom initial ="},{"id":"text-264","heading":"Text","content":"nom mis à jour ="},{"id":"text-265","heading":"Text","content":"Cette balise peut être utilisée entre les balises  et  initialiser les propriétés du haricot lors de son instanciation."},{"id":"text-266","heading":"Text","content":"73.4.4.3. Le tag \nLe tag  Obtenir la valeur d&#39;un attribut d&#39;un haricot. La balise utilise la méthode getter (getXXX () où XXX est le nom de la propriété avec la première lettre en majuscule) pour obtenir la valeur et l&#39;insérer dans la page HTML générée. Le haricot doit exister via un appel à la balise .\nLa syntaxe est la suivante:\n&lt;jsp: getProperty name = &quot;beanInstanceName&quot;propriété =&quot; nom de la propriété« />\nL&#39;attribut name indique le nom du bean tel que déclaré dans la balise .\nL&#39;attribut de propriété indique le nom de la propriété dont nous voulons la valeur."},{"id":"text-267","heading":"Text","content":"Exemple:"},{"id":"text-268","heading":"Text","content":"Test d&#39;instanciation d&#39;un haricot dans un JSP"},{"id":"text-269","heading":"Text","content":"Test d&#39;utilisation d&#39;un bean dans un JSP"},{"id":"text-270","heading":"Text","content":"nom initial ="},{"id":"text-271","heading":"Text","content":"nom mis à jour ="},{"id":"text-272","heading":"Text","content":"Attention: cette balise n&#39;obtient pas la valeur d&#39;une propriété indexée\nni les valeurs d&#39;un attribut d&#39;un EJB."},{"id":"text-273","heading":"Text","content":"Note: avec Tomcat 3.1, utilisation de la balise  sur un attribut dont la valeur est null n&#39;affiche rien tandis que l&#39;utilisation d&#39;une balise d&#39;expression renvoie &quot;null&quot;."},{"id":"text-274","heading":"Text","content":"Exemple:"},{"id":"text-275","heading":"Text","content":"Test d&#39;instanciation d&#39;un haricot dans un JSP"},{"id":"text-276","heading":"Text","content":"Test d&#39;utilisation d&#39;un bean dans un JSP"},{"id":"text-277","heading":"Text","content":"nom initial ="},{"id":"text-278","heading":"Text","content":"nom mis à jour = \nnom mis à jour ="},{"id":"text-279","heading":"Text","content":"73.4.4.4. La balise de redirection \nLe tag  Vous permet de rediriger la demande vers une autre URL pointant vers un fichier HTML, JSP ou un fichier de servlet.\nDès que le moteur JSP rencontre cette balise, il redirige la demande vers l&#39;URL spécifiée et ignore le reste de la JSP actuelle. Tout ce qui a été généré par le JSP est perdu.\nLa syntaxe est la suivante:\n&lt;jsp: forward page = &quot;RelativeURL  « />ou&lt;jsp: forward page = &quot; &lt;% = expression %&gt; &quot;&gt;&lt;jsp: param name = &quot;le nom du paramètre&quot;valeur =&quot;  &lt;% = expression  %&gt; « /> +\nL&#39;option de page doit contenir la valeur de l&#39;URL de la ressource vers laquelle la demande sera redirigée.\nCette URL est absolue si elle commence par un &amp; # 39; / &amp; # 39; sinon, il est relatif au JSP. Dans le cas d&#39;une URL absolue, le serveur Web détermine l&#39;emplacement de la ressource.\nIl est possible de passer un ou plusieurs paramètres à la ressource appelée grâce au tag ."},{"id":"text-280","heading":"Text","content":"Exemple: Test8.jsp"},{"id":"text-281","heading":"Text","content":"Page initiale appelée"},{"id":"text-282","heading":"Text","content":"Exemple: forward.htm"},{"id":"text-283","heading":"Text","content":"Page HTML"},{"id":"text-284","heading":"Text","content":"Page HTML transférée"},{"id":"text-285","heading":"Text","content":"Dans l&#39;exemple, le fichier forward.htm doit se trouver dans le même répertoire que le fichier JSP. Lors de l&#39;appel de la JSP, la page HTML est affichée. Le contenu généré par la page JSP n&#39;est pas affiché."},{"id":"text-286","heading":"Text","content":"73.4.4.5. Le tag \nCette balise inclut de manière dynamique le contenu généré par un JSP ou un servlet au moment de l’exécution du JSP. C&#39;est la différence avec la directive include pour laquelle le fichier est inséré dans le fichier JSP avant la génération du servlet.\nLa syntaxe est la suivante:\n&lt;jsp: include page = &quot;relativeURL &quot;flush =&quot; true &quot; /&gt;\nL&#39;attribut page vous permet de spécifier l&#39;URL relative de l&#39;élément à insérer.\nL&#39;attribut flush indique si le tampon doit être envoyé au client et vidé. Si la valeur de ce paramètre est true, il n&#39;est pas possible d&#39;utiliser certaines fonctionnalités du servlet ou du JSP appelé: il n&#39;est pas possible de modifier l&#39;en-tête de la réponse (en-tête, cookies) ni de le suivre sur une autre page."},{"id":"text-287","heading":"Text","content":"Exemple:"},{"id":"text-288","heading":"Text","content":"Bonjour"},{"id":"text-289","heading":"Text","content":"Il est possible de fournir des paramètres au servlet ou au JSP appelé à l’aide de la balise ."},{"id":"text-290","heading":"Text","content":"73.4.4.6. Le tag \nCette balise permet de générer le code HTML nécessaire pour exécuter une applet en fonction du navigateur: une balise HTML  ou  est généré en fonction de l&#39;attribut User-Agent de la requête.\nLe tag  a trois attributs requis:"},{"id":"text-291","heading":"Text","content":"Attribut\nRôle"},{"id":"text-292","heading":"Text","content":"code\npermet de spécifier le nom de la classe"},{"id":"text-293","heading":"Text","content":"base de code\ncontient une URL spécifiant le chemin absolu ou relatif du répertoire contenant la classe ou l&#39;archive"},{"id":"text-294","heading":"Text","content":"type\nles valeurs possibles sont applet ou bean"},{"id":"text-295","heading":"Text","content":"Il possède également plusieurs autres attributs facultatifs, les plus utilisés étant:"},{"id":"text-296","heading":"Text","content":"Attribut\nRôle"},{"id":"text-297","heading":"Text","content":"aligner\npermet de spécifier l&#39;alignement de l&#39;applet: les valeurs possibles sont bas, milieu ou haut"},{"id":"text-298","heading":"Text","content":"archiver\npermet de spécifier un ensemble de ressources (bibliothèques JAR, classes, &#8230;) à charger automatiquement. Le chemin de ces ressources prend en compte l&#39;attribut codebase"},{"id":"text-299","heading":"Text","content":"la taille\nspécifie la hauteur de l&#39;applet en pixel ou en pourcentage"},{"id":"text-300","heading":"Text","content":"hspace\nspécifie le nombre de pixels insérés à gauche et à droite de l&#39;applet"},{"id":"text-301","heading":"Text","content":"reconversion\nspécifie la version minimale du jer à utiliser pour exécuter l&#39;applet"},{"id":"text-302","heading":"Text","content":"prénom\nspécifier le nom de l&#39;applet"},{"id":"text-303","heading":"Text","content":"vspace\nspécifie le nombre de pixels insérés en haut et en bas de l&#39;applet"},{"id":"text-304","heading":"Text","content":"largeur\nspécifie la longueur de l&#39;applet en pixel ou en pourcentage"},{"id":"text-305","heading":"Text","content":"To be a try out of the setting of tag, it faut utiliser in the body of tag  le tag . Chaque paramètre sera alors défini dans un tag ."},{"id":"text-306","heading":"Text","content":"Exemple:"},{"id":"text-307","heading":"Text","content":"Le tag  dans le corps du tag  permet de préciser un message qui sera affiché dans les navigateurs ne supportant pas le tag HTML  ou ."},{"id":"text-308","heading":"Text","content":"L&#39;exemple de cette section est composé de deux pages.\nLa première page est une page HTML qui demande à être son nom et invoquant une url vers une JSP."},{"id":"text-309","heading":"Text","content":"Exemple: TestJSPIdent.html"},{"id":"text-310","heading":"Text","content":"Identification"},{"id":"text-311","heading":"Text","content":"Entrez votre nom:"},{"id":"text-312","heading":"Text","content":"La page JSP salue l&#39;utilisateur en récupérant son nom."},{"id":"text-313","heading":"Text","content":"Exemple: TestJSPAccueil.jsp"},{"id":"text-314","heading":"Text","content":"Accueil\n \n \n \nBonjour"},{"id":"text-315","heading":"Text","content":"Lors de l&#39;exécution d&#39;une page JSP, des erreurs peuvent survenir. Chaque erreur est traduite par la levée d&#39;une exception. Si cette exception est capturée dans un bloc try / catch of the JSP, celle-ci est traitée. Si l’exception n’est pas capturée dans la page, il ya deux possibilités selon qu’une page d’erreur soit associée à la page JSP ou non:"},{"id":"text-316","heading":"Text","content":"sans page d&#39;erreur associée, la pile d&#39;exécution de l&#39;exception est affichée\navec une page d&#39;erreur associée, une redirection est effectuée vers ce JSP"},{"id":"text-317","heading":"Text","content":"La définition d&#39;une page d&#39;erreur permet de préciser dans l&#39;attribut errorPage de la page de directive des autres JSP de l&#39;application. Si une exception est levée dans les traitements d&#39;une de ces pages, le JSP va automatiquement rediriger l&#39;utilisateur vers la page d&#39;erreur précisée.\nLa valeur de l&#39;attribut page d&#39;erreur de la directive doit contenir l&#39;adresse URL de la page d&#39;erreur. Le plus simple est de définir cette page à la racine de l&#39;application web et de faire précéder le nom de la page par un caractère &amp; # 39; / # 39; / # 39; dans l&#39;URL."},{"id":"text-318","heading":"Text","content":"Exemple:"},{"id":"text-319","heading":"Text","content":"73.6.1. La définition d&#39;une page d&#39;erreur\nUne page d&#39;erreur est une JSP sans l&#39;attribut isErrorPage est égal à true dans la page de directive. Une telle page dispose d&#39;un accès à la variable implicite nommée exception de type Jetable qui encapsule l&#39;exception qui a été levée.\nIl est possible dans une telle page d&#39;afficher un message d&#39;erreur personnalisée mais aussi de traiter de manière liée à la gestion de l&#39;exception: ajouter l&#39;exception dans un journal, envoyer un mail pour son traitement, &#8230;"},{"id":"text-320","heading":"Text","content":"Exemple:"},{"id":"text-321","heading":"Text","content":"% @ page isErrorPage = &quot;true&quot;%&gt;"},{"id":"text-322","heading":"Text","content":"Une erreur est survenue lors des traitements"},{"id":"text-323","heading":"Text","content":"Les bibliothèques de tags (taglibs) ou les tags personnalisés (tags personnalisés) permettent de définir leurs propres balises XML, de regrouper dans une bibliothèque et de réutiliser dans des fichiers JSP. C’est une extension de la technologie JSP à partir de la version 1.1 des spécifications du JSP."},{"id":"text-324","heading":"Text","content":"73.7.1. La présentation des tags personnalisés\nUn élément personnalisé du langage JSP a été personnalisé avec JSP. Ces dernières dernières permettent de définir ses propres tags qui ont été réalisées pour générer la réponse.\nLe principal, mais est de préférer la séparation des rôles entre le développeur Java et le concepteur de pages web. L&#39;idée maîtresse est de déformer le code Java contenu dans les scriplets de la classe JSP dans les classes dédiées et l&#39;appelant dans le code source de la classe JSP.\nCe concept peut sembler proche de celui des javabeans. Les javabeans sont particulièrement adaptés pour stocker et échanger des données entre les composants de l&amp;#39;application web en passant par la session.\nLes tags personnalisés sont adaptés pour enlever du code Java inclus dans les JSP et le déporter dans une classe dédiée. Cette classe est physiquement un javabean qui implémente une interface particulière.\nLa principale différence entre un javabean et un tag personnalisé est que ce dernier tient compte de l&amp;#39;environnement dans lequel il s&amp;#39;exécute (notamment la JSP et le contexte de l&amp;#39;application web ) et interagit avec lui.\nPour de plus amples informations sur les bibliothèques de tags personnalisés, il suffit de consulter le site qui leur est consacré : http://www.oracle.com/technetwork/java/index-jsp-135995.html.\nLes tags personnalisés possèdent des fonctionnalités intéressantes :"},{"id":"text-325","heading":"Text","content":"ils ont un accès aux objets de la JSP notamment l&amp;#39;objet de type HttpResponse. Ils peuvent donc modifier le contenu de la réponse générée par la JSP\nils peuvent recevoir des paramètres envoyés à partir de la JSP qui les appelle\nils peuvent avoir un corps qu&amp;#39;ils peuvent manipuler. Par extension de cette fonctionnalité, il est possible d&amp;#39;imbriquer un tag personnalisé dans un autre avec un nombre d&amp;#39;imbrications illimité"},{"id":"text-326","heading":"Text","content":"Les avantages des bibliothèques de tags personnalisés sont :"},{"id":"text-327","heading":"Text","content":"une suppression du code Java dans la JSP remplacé par un tag XML facilement compréhensible ce qui simplifie grandement la JSP\nune API facile à mettre en oeuvre\nune forte et facile réutilisabilité des tags développés\nune maintenance des JSP facilitée"},{"id":"text-328","heading":"Text","content":"La définition d&amp;#39;une bibliothèque de tags comprend plusieurs entités :"},{"id":"text-329","heading":"Text","content":"une classe dite &quot;handler&quot; pour chaque tag qui compose la bibliothèque\nun fichier de description de la bibliothèque"},{"id":"text-330","heading":"Text","content":"73.7.2. Les handlers de tags\nChaque tag est associé à une classe qui va contenir les traitements à exécuter lors de l&amp;#39;utilisation du tag. Une telle classe est nommée &quot;handler de tag&quot; (tag handler). Pour permettre son appel, une telle classe doit obligatoirement implémenter directement ou indirectement l&amp;#39;interface javax.servlet.jsp.tagext.Tag\nL&amp;#39;interface Tag possède une interface fille BodyTag qui doit être utilisée dans le cas où le corps du tag est utilisé.\nPour plus de facilité, l&amp;#39;API JSP propose les classes TagSupport et BodyTagSupport qui implémentent respectivement l&amp;#39;interface Tag et BodyTag. Ces deux classes, contenues dans le package javax.servlet.jsp.tagext, proposent des implémentations par défaut des méthodes de l&amp;#39;interface. Ces deux classes proposent un traitement standard par défaut pour chacune des méthodes de l&amp;#39;interface qu&amp;#39;elles implémentent. Pour définir un handler de tag, il suffit d&amp;#39;hériter de l&amp;#39;une ou l&amp;#39;autre de ces deux classes.\nLes méthodes définies dans les interfaces Tag et BodyTag sont appelées, par la servlet issue de la compilation de la JSP, au cours de l&amp;#39;utilisation du tag.\nLe cycle de vie général d&amp;#39;un tag est le suivant :"},{"id":"text-331","heading":"Text","content":"lors de la rencontre du début du tag, un objet du type du handler est instancié\nplusieurs propriétés sont initialisées (pageContext, parent, &#8230;) en utilisant les setters correspondants\nsi le tag contient des attributs, les setters correspondants sont appelés pour alimenter leurs valeurs\nla méthode doStartTag() est appelée\nsi la méthode doStartTag() renvoie la valeur EVAL_BODYINCLUDE alors le contenu du corps du tag est évalué\nlors de la rencontre de la fin du tag, appel de la méthode doEndTag()\nsi la méthode doEndTag() renvoie la valeur EVAL_PAGE alors l&amp;#39;évaluation de la page se poursuit, si elle renvoie la valeur SKIP_PAGE elle ne se poursuit pas"},{"id":"text-332","heading":"Text","content":"Toutes ces opérations sont réalisées par le code généré lors de la compilation de la JSP.\nUn handler de tag possède un objet qui permet d&amp;#39;avoir un accès aux objets implicites de la JSP. Cet objet est du type javax.servlet.jsp.PageContext\nComme le code contenu dans la classe du tag ne peut être utilisé que dans le contexte particulier du tag, il peut être intéressant de sortir une partie de ce code dans une ou plusieurs classes dédiées qui peuvent être éventuellement des beans.\nPour compiler ces classes, il faut obligatoirement que le jar de l&amp;#39;API servlets (servlets.jar) soit inclus dans la variable CLASSPATH."},{"id":"text-333","heading":"Text","content":"73.7.3. L&amp;#39;interface Tag\nCette interface définit les méthodes principales pour la gestion du cycle de vie d&amp;#39;un tag personnalisé qui ne doit pas manipuler le contenu de son corps.\nElle définit plusieurs constantes :"},{"id":"text-334","heading":"Text","content":"Constante\nRôle"},{"id":"text-335","heading":"Text","content":"EVAL_BODY_INCLUDE\nContinuer avec l&amp;#39;évaluation du corps du tag"},{"id":"text-336","heading":"Text","content":"EVAL_PAGE\nContinuer l&amp;#39;évaluation de la page"},{"id":"text-337","heading":"Text","content":"SKIP_BODY\nEmpêcher l&amp;#39;évaluation du corps du tag"},{"id":"text-338","heading":"Text","content":"SKIP_PAGE\nEmpêcher l&amp;#39;évaluation du reste de la page"},{"id":"text-339","heading":"Text","content":"Elle définit aussi plusieurs méthodes :"},{"id":"text-340","heading":"Text","content":"Méthode\nRôle"},{"id":"text-341","heading":"Text","content":"int doEndTag()\nTraitements à la rencontre du tag de fin"},{"id":"text-342","heading":"Text","content":"int doStartTag()\nTraitements à la rencontre du tag de début"},{"id":"text-343","heading":"Text","content":"setPageContext(Context)\nSauvegarde du contexte de la page"},{"id":"text-344","heading":"Text","content":"La méthode doStartTag() est appelée lors de la rencontre du tag d&amp;#39;ouverture et contient les traitements à effectuer dans ce cas. Elle doit renvoyer un entier prédéfini qui indique comment va se poursuivre le traitement du tag :"},{"id":"text-345","heading":"Text","content":"EVAL_BODY_INCLUDE : poursuite du traitement avec évaluation du corps du tag\nSKIP_BODY : poursuite du traitement sans évaluation du corps du tag"},{"id":"text-346","heading":"Text","content":"La méthode doEndTag() est appelée lors de la rencontre du tag de fermeture et contient les traitements à effectuer dans ce cas. Elle doit renvoyer un entier prédéfini qui indique comment va se poursuivre le traitement de la JSP."},{"id":"text-347","heading":"Text","content":"EVAL_PAGE : poursuite du traitement de la JSP\nSKIP_PAGE : ne pas poursuivre le traitement du reste de la JSP"},{"id":"text-348","heading":"Text","content":"73.7.4. L&amp;#39;accès aux variables implicites de la JSP\nLes tags ont accès aux variables implicites de la JSP dans laquelle ils s&amp;#39;exécutent grâce à un objet de type PageContext. La variable pageContext est un objet de ce type qui est initialisé juste après l&amp;#39;instanciation du handler.\nLe classe PageContext est une classe abstraite dont l&amp;#39;implémentation des spécifications doit fournir une adaptation concrète.\nCette classe définit plusieurs méthodes :"},{"id":"text-349","heading":"Text","content":"Méthodes\nRôles"},{"id":"text-350","heading":"Text","content":"JspWriter getOut()\nPermet un accès à la variable out de la JSP"},{"id":"text-351","heading":"Text","content":"Exception getException()\nPermet un accès à la variable exception de la JSP"},{"id":"text-352","heading":"Text","content":"Object getPage()\nPermet un accès à la variable page de la JSP"},{"id":"text-353","heading":"Text","content":"ServletRequest getRequest()\nPermet un accès à la variable request de la JSP"},{"id":"text-354","heading":"Text","content":"ServletResponse getResponse()\nPermet un accès à la variable response de la JSP"},{"id":"text-355","heading":"Text","content":"ServletConfig getServletConfig()\nPermet un accès à l&amp;#39;instance de la variable de type ServletConfig"},{"id":"text-356","heading":"Text","content":"ServletContext getServletContext()\nPermet un accès à l&amp;#39;instance de la variable de type ServletContext"},{"id":"text-357","heading":"Text","content":"HttpSession getSession()\nPermet un accès à la session"},{"id":"text-358","heading":"Text","content":"Object getAttribute(String)\nRenvoie l&amp;#39;objet associé au nom fourni en paramètre dans la portée de la page"},{"id":"text-359","heading":"Text","content":"setAttribute(String, Object)\nPermet de placer dans la portée de la page un objet dont le nom est fourni en paramètre"},{"id":"text-360","heading":"Text","content":"73.7.5. Les deux types de handlers\nIl existe deux types de handlers :"},{"id":"text-361","heading":"Text","content":"les handlers de tags sans corps\nles handlers de tags avec corps"},{"id":"text-362","heading":"Text","content":"73.7.5.1. Les handlers de tags sans corps\nPour définir le handler d&amp;#39;un tag personnalisé sans corps, il suffit de définir une classe qui implémente l&amp;#39;interface Tag ou qui héritent de la classe TagSupport. Il faut définir ou redéfinir les méthodes doStartTag() et endStartTag().\nLa méthode doStartTag() est appelée à la rencontre du début du tag. Cette méthode doit contenir le code à exécuter dans ce cas et renvoyer la constante SKIP_BODY puisque le tag ne contient pas de corps."},{"id":"text-363","heading":"Text","content":"73.7.5.2. Les handlers de tags avec corps\nLe cycle de vie d&amp;#39;un tel tag inclut le traitement du corps si la méthode doStartTag() renvoie la valeur EVAL_BODY_TAG.\nDans ce cas, les opérations suivantes sont réalisées :"},{"id":"text-364","heading":"Text","content":"la méthode setBodyContent() est appelée\nle contenu du corps est traité\nla méthode doAfterBody() est appelée. Si elle renvoie la valeur EVAL_BODY_TAG, le contenu du corps est de nouveau traité"},{"id":"text-365","heading":"Text","content":"73.7.6. Les paramètres d&amp;#39;un tag\nUn tag peut avoir un ou plusieurs paramètres qui seront transmis à la classe par des attributs. Pour chacun des paramètres, il faut définir des getters et des setters en respectant les règles et conventions des Java beans. Il est impératif de définir un champ, un setter et éventuellement un accesseur pour chaque attribut.\nLa JSP utilisera le setter pour fournir à l&amp;#39;objet la valeur de l&amp;#39;attribut.\nAu moment de la génération de la servlet par le moteur de JSP, celui-ci vérifie par introspection la présence d&amp;#39;un setter pour l&amp;#39;attribut concerné."},{"id":"text-366","heading":"Text","content":"73.7.7. La définition du fichier de description de la bibliothèque de tags (TLD)\nLe fichier de description de la bibliothèque de tags (tag library descriptor file) est un fichier au format XML qui décrit une bibliothèque de tags. Les informations qu&amp;#39;il contient concernent la bibliothèque de tags elle-même et aussi chacun des tags qui la compose.\nCe fichier est utilisé par le conteneur Web lors de la compilation de la JSP pour remplacer le tag par du code Java.\nCe fichier doit toujours avoir pour extension .tld. Il doit être placé dans le répertoire web-inf du fichier war ou dans un de ses sous-répertoires. Le plus pratique est de tous les regrouper dans un répertoire nommé par exemple tags ou tld.\nComme tout bon fichier XML, le fichier TLD commence par un prologue :"},{"id":"text-367","heading":"Text","content":"Exemple :"},{"id":"text-368","heading":"Text","content":"La DTD précisée doit correspondre à la version de l&amp;#39;API JSP utilisée. L&amp;#39;exemple précédent concernait la version 1.1, l&amp;#39;exemple suivant concerne la version 1.2"},{"id":"text-369","heading":"Text","content":"Exemple :"},{"id":"text-370","heading":"Text","content":"Le tag racine du document XML est le tag .\nCe tag peut contenir plusieurs tags qui définissent les caractéristiques générales de la bibliothèque. Les tags suivants  sont définis dans les spécifications 1.2 :"},{"id":"text-371","heading":"Text","content":"prénom\nRôle"},{"id":"text-372","heading":"Text","content":"tlib-version\nversion de la bibliothèque"},{"id":"text-373","heading":"Text","content":"jsp-version\nversion des spécifications JSP utilisées"},{"id":"text-374","heading":"Text","content":"short-name\nnom court de la bibliothèque (optionnel)"},{"id":"text-375","heading":"Text","content":"uri\nURI qui identifie de façon unique la bibliothèque : cette URI n&amp;#39;a pas besoin d&amp;#39;exister réellement"},{"id":"text-376","heading":"Text","content":"display-name\nnom de la bibliothèque"},{"id":"text-377","heading":"Text","content":"small-icon\n(optionnel)"},{"id":"text-378","heading":"Text","content":"large-icon\n(optionnel)"},{"id":"text-379","heading":"Text","content":"la description\ndescription de la bibliothèque"},{"id":"text-380","heading":"Text","content":"validateur\n(optionnel)"},{"id":"text-381","heading":"Text","content":"auditeur\n(optionnel)"},{"id":"text-382","heading":"Text","content":"étiquette\nil en faut autant que de tags qui composent la bibliothèque"},{"id":"text-383","heading":"Text","content":"Pour chaque tag personnalisé défini dans la bibliothèque, il faut un tag . Ce tag permet de définir les caractéristiques d&amp;#39;un tag de la bibliothèque.\nCe tag peut contenir les tags suivants :"},{"id":"text-384","heading":"Text","content":"prénom\nRôle"},{"id":"text-385","heading":"Text","content":"prénom\nnom du tag : il doit être unique dans la bibliothèque"},{"id":"text-386","heading":"Text","content":"tag-class\nnom entièrement qualifié de la classe qui contient le handler du tag"},{"id":"text-387","heading":"Text","content":"tei-class\nnom qualifié d&amp;#39;une classe fille de la classe javax.servlet.jsp.tagext.TagExtraInfo (optionnel)"},{"id":"text-388","heading":"Text","content":"body-content\ntype du corps du tag. Les valeurs possibles sont :"},{"id":"text-389","heading":"Text","content":"JSP : le corps du tag contient des tags JSP qui doivent être interprétés\ntagdependent : l&amp;#39;interprétation du contenu du corps est faite par le tag\nempty : le corps doit obligatoirement être vide"},{"id":"text-390","heading":"Text","content":"La valeur par défaut est JSP"},{"id":"text-391","heading":"Text","content":"display-name\nnom court du tag"},{"id":"text-392","heading":"Text","content":"small-icon\nnom relatif à la bibliothèque d&amp;#39;un fichier gif ou jpeg contenant une icône. (optionnel)"},{"id":"text-393","heading":"Text","content":"large-icon\nnom relatif à la bibliothèque d&amp;#39;un fichier gif ou jpeg contenant une icône. (optionnel)"},{"id":"text-394","heading":"Text","content":"la description\ndescription du tag (optionnel)"},{"id":"text-395","heading":"Text","content":"variable\n(optionnel)"},{"id":"text-396","heading":"Text","content":"attribut\nil en faut autant que d&amp;#39;attributs possédés par le tag (optionnel)"},{"id":"text-397","heading":"Text","content":"Exemple\nun exemple de l&amp;#39;utilisation du tag (optionnel)"},{"id":"text-398","heading":"Text","content":"Pour chaque attribut du tag personnalisé, il faut utiliser un tag . Ce tag décrit un attribut d&amp;#39;un tag et peut contenir les tags suivants :"},{"id":"text-399","heading":"Text","content":"prénom\nLa description"},{"id":"text-400","heading":"Text","content":"prénom\nnom de l&amp;#39;attribut"},{"id":"text-401","heading":"Text","content":"Champs obligatoires\nbooléen qui indique la présence obligatoire de l&amp;#39;attribut"},{"id":"text-402","heading":"Text","content":"rtexprvalue\nbooléen qui indique si la page doit évaluer l&amp;#39;expression lors de l&amp;#39;exécution. Il faut donc mettre la valeur true si la valeur de l&amp;#39;attribut est fournie avec un tag JSP d&amp;#39;expression"},{"id":"text-403","heading":"Text","content":"Le tag  contient les tags suivants :"},{"id":"text-404","heading":"Text","content":"prénom\nRôle"},{"id":"text-405","heading":"Text","content":"name-given"},{"id":"text-406","heading":"Text","content":"name-from-attribut"},{"id":"text-407","heading":"Text","content":"variable-class\nnom de la classe de la valeur de l&amp;#39;attribut. Par défaut java.lang.String"},{"id":"text-408","heading":"Text","content":"déclarer\npar défaut : True"},{"id":"text-409","heading":"Text","content":"portée\nvisibilité de l&amp;#39;attribut. Les valeurs possibles sont :\n      Par défaut : NESTED (optionnel)"},{"id":"text-410","heading":"Text","content":"la description\ndescription de l&amp;#39;attribut (optionnel)"},{"id":"text-411","heading":"Text","content":"Chaque bibliothèque doit être définie avec un fichier de description au format xml possédant une extension .tld. Le contenu de ce fichier doit pouvoir être validé avec une DTD fournie par Sun.\nCe fichier est habituellement stocké dans le répertoire web-inf de l&amp;#39;application web ou un de ses sous-répertoires."},{"id":"text-412","heading":"Text","content":"Exemple :"},{"id":"text-413","heading":"Text","content":"1,0\n  1.1\n  testtaglib\n  http://perso.jmd.test.taglib\n  Bibliotheque de test des taglibs"},{"id":"text-414","heading":"Text","content":"testtaglib1\n  perso.jmd.test.taglib.TestTaglib1\n  Tag qui affiche bonjour"},{"id":"text-415","heading":"Text","content":"73.7.8. L&amp;#39;utilisation d&amp;#39;une bibliothèque de tags\nPour utiliser une bibliothèque de tags, il y a des actions à réaliser au niveau du code source de la JSP et au niveau de conteneur d&amp;#39;applications web pour la déployer."},{"id":"text-416","heading":"Text","content":"73.7.8.1. L&amp;#39;utilisation dans le code source d&amp;#39;une JSP\nChaque bibliothèque utilisée dans une JSP doit être déclarée avant son utilisation en utilisant la directive taglib. Le plus simple est d&amp;#39;effectuer ces déclarations tout au début du code de la JSP.\nCette directive possède deux attributs :\nDans ce dernier cas, il faut ajouter pour chaque bibliothèque un tag  dans le fichier de description de déploiement de l&amp;#39;application/WEB-INF/web.xml"},{"id":"text-417","heading":"Text","content":"Exemple :"},{"id":"text-418","heading":"Text","content":"/maTagLibTest\n    /WEB-INF/tld/testtaglib.tld"},{"id":"text-419","heading":"Text","content":"L&amp;#39;appel d&amp;#39;un tag se fait en utilisant un tag dont le nom a la forme suivante : prefix:tag\nLe préfix est celui défini dans la directive taglib."},{"id":"text-420","heading":"Text","content":"Exemple : un tag sans corps"},{"id":"text-421","heading":"Text","content":"Exemple : un tag avec corps"},{"id":"text-422","heading":"Text","content":"..."},{"id":"text-423","heading":"Text","content":"Le corps peut contenir du code HTML, du code JSP ou d&amp;#39;autre tag personnalisé.\nLe tag peut avoir des attributs si ceux-ci ont été définis. La syntaxe pour les utiliser respecte la norme XML."},{"id":"text-424","heading":"Text","content":"Exemple : un tag avec un paramètre constant"},{"id":"text-425","heading":"Text","content":"La valeur de cet attribut peut être une donnée dynamiquement évaluée lors de l&amp;#39;exécution :"},{"id":"text-426","heading":"Text","content":"Exemple : un tag avec un paramètre"},{"id":"text-427","heading":"Text","content":"&lt;prefix:tag attribut=&quot;\"/>"},{"id":"text-428","heading":"Text","content":"73.7.8.2. Le déploiement d&amp;#39;une bibliothèque\nAu moment de la compilation de la JSP en servlet, le conteneur transforme chaque tag en un appel à un objet du type de la classe associée au tag.\nIl y a deux types d&amp;#39;éléments auxquels le conteneur d&amp;#39;applications web doit pouvoir accéder :"},{"id":"text-429","heading":"Text","content":"le fichier de description de la bibliothèque\nles classes des handlers de tags"},{"id":"text-430","heading":"Text","content":"Les classes des handlers de tags peuvent être stockées à deux endroits dans le fichier war selon leur format :"},{"id":"text-431","heading":"Text","content":"s&amp;#39;ils sont packagés sous forme de fichiers jar alors ils doivent être placés dans le répertoire /WEB-INF/lib\ns&amp;#39;ils ne sont pas packagés alors ils doivent être placés dans le répertoire /WEB-INF/classes"},{"id":"text-432","heading":"Text","content":"73.7.9. Le déploiement et les tests dans Tomcat\nTomcat étant l&amp;#39;implémentation de référence pour les technologies servlets et JSP, il est pratique d&amp;#39;effectuer des tests avec cet outil.\nLa version de Tomcat utilisée dans cette section est la 3.2.1.\nLe déploiement se fait en deux étapes :"},{"id":"text-433","heading":"Text","content":"la copie des fichiers\nl&amp;#39;enregistrement de la bibliothèque"},{"id":"text-434","heading":"Text","content":"Les classes compilées doivent être copiées dans le répertoire WEB-INF/classes de la webapp si elles ne sont pas packagées dans une archive jar, sinon le ou les fichiers .jar doivent être copiés dans le répertoire WEB-INF/lib.\nLe fichier .tld doit être copié dans le répertoire WEB-INF ou dans un de ses sous-répertoires.\nIl faut ensuite enregistrer la bibliothèque dans le fichier de configuration web.xml contenu dans le répertoire web-inf du répertoire de l&amp;#39;application web.\nIl faut ajouter dans ce fichier, un tag  pour chaque bibliothèque utilisée par l&amp;#39;application web. Ce tag contient deux informations :"},{"id":"text-435","heading":"Text","content":"l&amp;#39;URI de la bibliothèque contenue dans le tag taglib-uri. Cette URI doit être identique à celle définie dans le fichier de description de la bibliothèque\nla localisation du fichier de description"},{"id":"text-436","heading":"Text","content":"Exemple :"},{"id":"text-437","heading":"Text","content":"index.htm\n    index.jsp\n  \n\t\n  \n    /maTagLibTest\n    /WEB-INF/tld/testtaglib.tld"},{"id":"text-438","heading":"Text","content":"Il ne reste plus qu&amp;#39;à lancer Tomcat si ce n&amp;#39;est pas encore fait et à saisir l&amp;#39;url de la page contenant l&amp;#39;appel au tag personnalisé."},{"id":"text-439","heading":"Text","content":"73.7.10. Les bibliothèques de tags existantes\nIl existe de nombreuses bibliothèques de tags libres ou commerciales disponibles sur le marché. Cette section va tenter de présenter quelques-unes des plus connues et des plus utilisées du monde libre. Cette liste n&amp;#39;est pas exhaustive."},{"id":"text-440","heading":"Text","content":"73.7.10.1. Struts\nStruts est un framework pour la réalisation d&amp;#39;applications web reposant sur le modèle MVC 2.\nPour la partie vue, Struts utilise les JSP et propose en plus plusieurs bibliothèques de tags pour faciliter le développement de cette partie présentation. Struts possède quatre grandes bibliothèques :"},{"id":"text-441","heading":"Text","content":"formulaire HMTL\nmodèles (templates)\nJavabeans (bean)\ntraitements logiques (logic)"},{"id":"text-442","heading":"Text","content":"Le site web de Struts se trouve à l&amp;#39;url : http://struts.apache.org/index.html.\nCe framework est détaillée dans le chapitre «Struts»."},{"id":"text-443","heading":"Text","content":"73.7.10.2. JSP Standard Tag Library (JSTL)\nJSP Standard Tag Library (JSTL) est une spécification issue du travail du JCP sous la JSR numéro 52. Le chapitre «JSTL (Java server page Standard Tag Library)» fournit plus de détails sur cette spécification."},{"id":"text-444","heading":"Text","content":"73.7.10.3. Apache Taglibs (Jakarta Taglibs)\nApache Taglibs est un ensemble de taglibs : la plupart a été déclarée deprecated notamment à cause de la standardisation de la JSTL.\nIl propose en particulier, la bibliothèque Apache Standard Tag Library qui est une implémentation des versions 1.0, 1.1 et 1.2 de la spécification JSTL.\nLe site officiel est à l&amp;#39;url : http://tomcat.apache.org/taglibs/"},{"id":"text-445","heading":"Text","content":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"}],"media":{"primary_image":""},"relations":[{"rel":"canonical","href":"https://tutos-gameserver.fr/2019/05/03/developper-en-java-pages-de-serveur-java-jsp-bien-choisir-son-serveur-d-impression/"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2019/05/03/developper-en-java-pages-de-serveur-java-jsp-bien-choisir-son-serveur-d-impression/llm","type":"text/html"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2019/05/03/developper-en-java-pages-de-serveur-java-jsp-bien-choisir-son-serveur-d-impression/llm.json","type":"application/json"},{"rel":"llm-manifest","href":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","type":"application/json"}],"http_headers":{"X-LLM-Friendly":"1","X-LLM-Schema":"1.1.0","Content-Security-Policy":"default-src 'none'; img-src * data:; style-src 'unsafe-inline'"},"license":"CC BY-ND 4.0","attribution_required":true,"allow_cors":false}