1.9 La communication Servlet-JSP-Bean - Free
PROLOGUE. Il est certes possible pour ..... Le sujet de ce texte, c'est la critique
faite pendant l'élaboration de l'?uvre d'art, pas après. Je ne parlerai donc pas ...
part of the document
JAVA ET JSP
(Java Server Pages)
EMBED MSPhotoEd.3
Sommaire
TOC \o "1-4" \h \z HYPERLINK \l "_Toc273101968" 1.1 Présentation PAGEREF _Toc273101968 \h 6
HYPERLINK \l "_Toc273101969" 1.1.1 JSP (JavaServer Page) PAGEREF _Toc273101969 \h 6
HYPERLINK \l "_Toc273101970" 1.1.2 Fonctionnement interne PAGEREF _Toc273101970 \h 6
HYPERLINK \l "_Toc273101971" 1.1.3 Configuration du cours PAGEREF _Toc273101971 \h 7
HYPERLINK \l "_Toc273101972" 1.1.4 Rappel sur le protocole HTTP PAGEREF _Toc273101972 \h 8
HYPERLINK \l "_Toc273101973" 1.1.4.1 Le protocole PAGEREF _Toc273101973 \h 8
HYPERLINK \l "_Toc273101974" 1.1.4.2 Les requêtes PAGEREF _Toc273101974 \h 9
HYPERLINK \l "_Toc273101975" 1.1.4.3 Les réponses PAGEREF _Toc273101975 \h 10
HYPERLINK \l "_Toc273101976" 1.1.4.4 La gestion de l'état PAGEREF _Toc273101976 \h 11
HYPERLINK \l "_Toc273101977" 1.2 Les éléments de base de JSP PAGEREF _Toc273101977 \h 12
HYPERLINK \l "_Toc273101978" 1.2.1 L'organisation d'une page JSP PAGEREF _Toc273101978 \h 12
HYPERLINK \l "_Toc273101979" 1.2.1.1 Le modèle MVC (Model-View-Controller) PAGEREF _Toc273101979 \h 13
HYPERLINK \l "_Toc273101980" 1.2.1.2 Le mélange de codes PAGEREF _Toc273101980 \h 14
HYPERLINK \l "_Toc273101981" 1.2.1.3 Le code JSP PAGEREF _Toc273101981 \h 15
HYPERLINK \l "_Toc273101982" 1.2.1.4 Les 2 versions de JSP PAGEREF _Toc273101982 \h 16
HYPERLINK \l "_Toc273101983" 1.2.2 La directive de page : PAGEREF _Toc273101983 \h 17
HYPERLINK \l "_Toc273101984" 1.2.3 Le commentaire : PAGEREF _Toc273101984 \h 18
HYPERLINK \l "_Toc273101985" 1.2.4 La déclaration : PAGEREF _Toc273101985 \h 19
HYPERLINK \l "_Toc273101986" 1.2.5 Le scriptlet : PAGEREF _Toc273101986 \h 20
HYPERLINK \l "_Toc273101987" 1.2.6 L'expression : PAGEREF _Toc273101987 \h 23
HYPERLINK \l "_Toc273101988" 1.2.7 L'inclusion : PAGEREF _Toc273101988 \h 24
HYPERLINK \l "_Toc273101989" 1.2.8 La directive de bibliothèque de balises (Taglib) PAGEREF _Toc273101989 \h 28
HYPERLINK \l "_Toc273101990" 1.3 Les objets implicites PAGEREF _Toc273101990 \h 29
HYPERLINK \l "_Toc273101991" 1.3.1 L'interface request (Correspond à la requête client) PAGEREF _Toc273101991 \h 30
HYPERLINK \l "_Toc273101992" 1.3.1.1 Définition et méthodes PAGEREF _Toc273101992 \h 30
HYPERLINK \l "_Toc273101993" 1.3.1.2 Récupérer des informations provenant d'une autre page PAGEREF _Toc273101993 \h 32
HYPERLINK \l "_Toc273101994" 1.3.1.3 Récupérer des informations sur le client et le serveur PAGEREF _Toc273101994 \h 34
HYPERLINK \l "_Toc273101995" 1.3.1.4 Le navigateur du client PAGEREF _Toc273101995 \h 35
HYPERLINK \l "_Toc273101996" 1.3.1.5 Récupérer toutes les en-têtes PAGEREF _Toc273101996 \h 36
HYPERLINK \l "_Toc273101997" 1.3.1.6 Récupérer toutes les variables d'une page html PAGEREF _Toc273101997 \h 38
HYPERLINK \l "_Toc273101998" 1.3.1.7 Faire du jspSelf en mode GET PAGEREF _Toc273101998 \h 40
HYPERLINK \l "_Toc273101999" 1.3.1.8 Faire du jspSelf en mode POST PAGEREF _Toc273101999 \h 43
HYPERLINK \l "_Toc273102000" 1.3.2 L'interface response (Correspond à la réponse envoyée au client) PAGEREF _Toc273102000 \h 44
HYPERLINK \l "_Toc273102001" 1.3.2.1 Définition et méthodes PAGEREF _Toc273102001 \h 44
HYPERLINK \l "_Toc273102002" 1.3.3 Les cookies PAGEREF _Toc273102002 \h 45
HYPERLINK \l "_Toc273102003" 1.3.3.1 Définition et méthodes PAGEREF _Toc273102003 \h 45
HYPERLINK \l "_Toc273102004" 1.3.3.2 Exemple PAGEREF _Toc273102004 \h 46
HYPERLINK \l "_Toc273102005" 1.3.4 L'interface session PAGEREF _Toc273102005 \h 50
HYPERLINK \l "_Toc273102006" 1.3.4.1 Définition et méthodes PAGEREF _Toc273102006 \h 50
HYPERLINK \l "_Toc273102007" 1.3.4.2 Exemple PAGEREF _Toc273102007 \h 51
HYPERLINK \l "_Toc273102008" 1.3.5 L'objet application (ServletContext) PAGEREF _Toc273102008 \h 53
HYPERLINK \l "_Toc273102009" 1.3.5.1 Définition et méthodes PAGEREF _Toc273102009 \h 53
HYPERLINK \l "_Toc273102010" 1.3.5.2 Exemple PAGEREF _Toc273102010 \h 54
HYPERLINK \l "_Toc273102011" 1.3.6 L'objet out PAGEREF _Toc273102011 \h 56
HYPERLINK \l "_Toc273102012" 1.3.7 L'objet config PAGEREF _Toc273102012 \h 57
HYPERLINK \l "_Toc273102013" 1.3.8 L'objet page PAGEREF _Toc273102013 \h 58
HYPERLINK \l "_Toc273102014" 1.3.9 L'objet pageContext PAGEREF _Toc273102014 \h 59
HYPERLINK \l "_Toc273102015" 1.3.10 L'objet exception PAGEREF _Toc273102015 \h 60
HYPERLINK \l "_Toc273102016" 1.4 Le problème du blocage des cookies PAGEREF _Toc273102016 \h 64
HYPERLINK \l "_Toc273102017" 1.4.1 Blocage des cookies et des sessions PAGEREF _Toc273102017 \h 64
HYPERLINK \l "_Toc273102018" 1.4.2 Réécriture d'URL PAGEREF _Toc273102018 \h 65
HYPERLINK \l "_Toc273102019" 1.5 Les JavaBeans PAGEREF _Toc273102019 \h 66
HYPERLINK \l "_Toc273102020" 1.5.1 Présentation PAGEREF _Toc273102020 \h 66
HYPERLINK \l "_Toc273102021" 1.5.2 Structure syntaxique PAGEREF _Toc273102021 \h 68
HYPERLINK \l "_Toc273102022" 1.5.3 Stockage PAGEREF _Toc273102022 \h 69
HYPERLINK \l "_Toc273102023" 1.6 Les éléments action JSP PAGEREF _Toc273102023 \h 70
HYPERLINK \l "_Toc273102024" 1.6.1 Présentation PAGEREF _Toc273102024 \h 70
HYPERLINK \l "_Toc273102025" 1.6.2 L'élément useBean : PAGEREF _Toc273102025 \h 71
HYPERLINK \l "_Toc273102026" 1.6.2.1 Description et syntaxe PAGEREF _Toc273102026 \h 71
HYPERLINK \l "_Toc273102027" 1.6.2.2 Ecrans PAGEREF _Toc273102027 \h 72
HYPERLINK \l "_Toc273102028" 1.6.2.3 Scripts PAGEREF _Toc273102028 \h 73
HYPERLINK \l "_Toc273102029" 1.6.2.4 Passer toutes les valeurs en une seule fois PAGEREF _Toc273102029 \h 75
HYPERLINK \l "_Toc273102030" 1.6.3 Bean et scope PAGEREF _Toc273102030 \h 76
HYPERLINK \l "_Toc273102031" 1.6.4 L'élément setProperty : PAGEREF _Toc273102031 \h 77
HYPERLINK \l "_Toc273102032" 1.6.4.1 Description et syntaxe PAGEREF _Toc273102032 \h 77
HYPERLINK \l "_Toc273102033" 1.6.5 L'élément getProperty : PAGEREF _Toc273102033 \h 77
HYPERLINK \l "_Toc273102034" 1.6.5.1 Description et syntaxe PAGEREF _Toc273102034 \h 77
HYPERLINK \l "_Toc273102035" 1.6.6 L'élément d'inclusion : PAGEREF _Toc273102035 \h 78
HYPERLINK \l "_Toc273102036" 1.6.6.1 Description et syntaxe PAGEREF _Toc273102036 \h 78
HYPERLINK \l "_Toc273102037" 1.6.6.2 La page modèle du site PAGEREF _Toc273102037 \h 78
HYPERLINK \l "_Toc273102038" 1.6.6.3 Inclure une page avec ou sans photo PAGEREF _Toc273102038 \h 80
HYPERLINK \l "_Toc273102039" 1.6.7 L'élément de délégation : PAGEREF _Toc273102039 \h 84
HYPERLINK \l "_Toc273102040" 1.6.7.1 Description et syntaxe PAGEREF _Toc273102040 \h 84
HYPERLINK \l "_Toc273102041" 1.6.7.2 Exemple PAGEREF _Toc273102041 \h 84
HYPERLINK \l "_Toc273102042" 1.6.8 L'élément plugin : (Applet) PAGEREF _Toc273102042 \h 86
HYPERLINK \l "_Toc273102043" 1.6.8.1 Description et syntaxe PAGEREF _Toc273102043 \h 86
HYPERLINK \l "_Toc273102044" 1.6.8.2 Exemple : le convertisseur Euros/Dollars PAGEREF _Toc273102044 \h 87
HYPERLINK \l "_Toc273102045" 1.6.9 L'élément texte : PAGEREF _Toc273102045 \h 89
HYPERLINK \l "_Toc273102046" 1.6.10 L'élément racine : PAGEREF _Toc273102046 \h 90
HYPERLINK \l "_Toc273102047" 1.7 Mini Application niveau 1 : le bureau de change PAGEREF _Toc273102047 \h 91
HYPERLINK \l "_Toc273102048" 1.7.1 Cahier des charges PAGEREF _Toc273102048 \h 91
HYPERLINK \l "_Toc273102049" 1.7.2 Ecrans PAGEREF _Toc273102049 \h 91
HYPERLINK \l "_Toc273102050" 1.8 Travailler avec une Base de données PAGEREF _Toc273102050 \h 93
HYPERLINK \l "_Toc273102051" 1.8.1 Afficher des données d'une table via un scriptlet PAGEREF _Toc273102051 \h 93
HYPERLINK \l "_Toc273102052" 1.8.2 Insérer dynamiquement un enregistrement PAGEREF _Toc273102052 \h 95
HYPERLINK \l "_Toc273102053" 1.9 La communication Servlet-JSP-Bean PAGEREF _Toc273102053 \h 97
HYPERLINK \l "_Toc273102054" 1.9.1 Objectif PAGEREF _Toc273102054 \h 97
HYPERLINK \l "_Toc273102055" 1.9.2 Démarche PAGEREF _Toc273102055 \h 99
HYPERLINK \l "_Toc273102056" 1.9.3 Scripts PAGEREF _Toc273102056 \h 100
HYPERLINK \l "_Toc273102057" 1.10 Mini application niveau 2 : JSP, Beans et BD PAGEREF _Toc273102057 \h 107
HYPERLINK \l "_Toc273102058" 1.10.1 Objectif, principes et démarche PAGEREF _Toc273102058 \h 107
HYPERLINK \l "_Toc273102059" 1.10.2 Ecrans PAGEREF _Toc273102059 \h 107
HYPERLINK \l "_Toc273102060" 1.11 Divers PAGEREF _Toc273102060 \h 108
HYPERLINK \l "_Toc273102061" 1.11.1 Importer ses propres classes PAGEREF _Toc273102061 \h 108
HYPERLINK \l "_Toc273102062" 1.11.2 Internationalisation PAGEREF _Toc273102062 \h 110
HYPERLINK \l "_Toc273102063" 1.11.2.1 Objectif PAGEREF _Toc273102063 \h 110
HYPERLINK \l "_Toc273102064" 1.11.2.2 Le navigateur et la langue PAGEREF _Toc273102064 \h 110
HYPERLINK \l "_Toc273102065" 1.11.2.3 Premier script PAGEREF _Toc273102065 \h 111
HYPERLINK \l "_Toc273102066" 1.11.2.4 Deuxième script PAGEREF _Toc273102066 \h 112
HYPERLINK \l "_Toc273102067" 1.11.3 JSP et XML PAGEREF _Toc273102067 \h 113
HYPERLINK \l "_Toc273102068" 1.12 Annexes PAGEREF _Toc273102068 \h 114
HYPERLINK \l "_Toc273102069" 1.12.1 Utilisation d'une archive personnelle dans un projet web PAGEREF _Toc273102069 \h 114
HYPERLINK \l "_Toc273102070" 1.12.2 Archiver un site WEB PAGEREF _Toc273102070 \h 114
HYPERLINK \l "_Toc273102071" 1.12.3 Le code de l'applet EurosDollars PAGEREF _Toc273102071 \h 115
HYPERLINK \l "_Toc273102072" 1.13 Corrigés des exercices PAGEREF _Toc273102072 \h 117
HYPERLINK \l "_Toc273102073" 1.13.1 Testez Chrome PAGEREF _Toc273102073 \h 117
HYPERLINK \l "_Toc273102074" 1.13.2 Les cookies PAGEREF _Toc273102074 \h 117
HYPERLINK \l "_Toc273102075" 1.13.3 Gestion de panier avec un cookie PAGEREF _Toc273102075 \h 118
HYPERLINK \l "_Toc273102076" 1.13.4 Les sessions PAGEREF _Toc273102076 \h 122
HYPERLINK \l "_Toc273102077" 1.13.5 Corrigé Mini Application niveau 1 : le bureau de change PAGEREF _Toc273102077 \h 123
HYPERLINK \l "_Toc273102078" 1.13.5.1 Tableau de synthèse PAGEREF _Toc273102078 \h 123
HYPERLINK \l "_Toc273102079" 1.13.5.2 Accueil PAGEREF _Toc273102079 \h 123
HYPERLINK \l "_Toc273102080" 1.13.5.3 Saisie client PAGEREF _Toc273102080 \h 124
HYPERLINK \l "_Toc273102081" 1.13.5.4 Calcul PAGEREF _Toc273102081 \h 125
HYPERLINK \l "_Toc273102082" 1.13.5.5 Déconnexion PAGEREF _Toc273102082 \h 125
HYPERLINK \l "_Toc273102083" 1.13.6 Corrigé mini application niveau2 : BD PAGEREF _Toc273102083 \h 126
HYPERLINK \l "_Toc273102084" 1.14 JSP et MVC : la bonne pratique PAGEREF _Toc273102084 \h 129
HYPERLINK \l "_Toc273102085" 1.14.1.1 Insertion et suppression PAGEREF _Toc273102085 \h 129
HYPERLINK \l "_Toc273102086" 1.14.1.2 Affichage d'un enregistrement PAGEREF _Toc273102086 \h 131
HYPERLINK \l "_Toc273102087" 1.14.1.3 Affichage de tous les enregistrements PAGEREF _Toc273102087 \h 132
HYPERLINK \l "_Toc273102088" 1.15 EN ATTENTE PAGEREF _Toc273102088 \h 133
HYPERLINK \l "_Toc273102089" 1.15.1 JavaBean ConnexionMysql PAGEREF _Toc273102089 \h 133
HYPERLINK \l "_Toc273102090" 1.15.2 JavaBean Villes PAGEREF _Toc273102090 \h 136
Présentation
JSP (JavaServer Page)
JSP est un générateur dynamique de pages html.
Il est possible de faire en JSP ce qui est fait avec des servlets.
L'écriture de code JSP est plus simple que l'écriture de servlets.
Une page JSP est un squelette de page html, donc avec du code html, qui contient du code JSP et éventuellement du code Java (Scriptlet).
Les JSP prendront en charge la partie présentation dans une application WEB à plusieurs niveaux.
La partie accès aux bases de données sera prise en compte des beans et des EJB (Entreprise Java Beans).
Les servlets prendront en charge la partie contrôle de l'application.
Fonctionnement interne
La JSP, qui est stockée sur le serveur WEB qui doit être aussi un serveur de servlets (Jakarta-Tomcat est un serveur http de servlets) - est compilée et une servlet est créée et chargée en mémoire. C'est elle qui exécute les traitements.
Ces deux phases (compilation et traitement de la requête client) sont réalisées au sein du conteneur web qui lui-même contient un conteneur de servlets et un conteneur de JSP.
Tant que la JSP ne change pas, la servlet générée demeure chargée au sein du conteneur jusqu'à l'arrêt du serveur, exactement comme pour une servlet.
Elle se base sur les packages javax.servlet.jsp et javax.jsp.tagext.
Configuration du cours
Serveur Apache Tomcat 5.5
Dans une configuration standard les codes sont stockés dans l'arborescence suivante :
C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\NomDeLApplication\
Mais selon l'IDE que vous utilisez ceci peut changer.
Avec NetBeans par exemple :
Stockage des sources :
Stockage des JSP, HTML, ... :
C:\
\NomDeLApplication\web\jsp
C:\
\NomDeLApplication\web\html
Stockage des .java (servlets, classes, beans, applets) :
C:\
\NomDeLApplication\src\java
Stockage des exécutables :
Stockage des JSP :
C:\
\NomDeLApplication\build\web\jsp
Stockage des .class (servlets, classes, beans, applets) :
C:\
\NomDeLApplication\build\web\WEB-INF\classes
Copie d'écran de l'arborescence
EMBED MSPhotoEd.3
Rappel sur le protocole HTTP
Le protocole
Le protocole http fonctionne de la façon suivante : un client un navigateur WEB principalement envoie une requête à un serveur pour obtenir une ressource et le serveur renvoie une réponse, la ressource ou un message d'erreur.
Une ressource peut être un simple fichier html ou un programme qui accède à une base de données et génère une réponse dynamique.
RequêteRéponse
Demande d'une page JSPEnvoi d'une page "html"
Les requêtes
La requête est envoyée par le navigateur à un serveur pour obtenir une ressource. Ces informations sont contenues dans l'URI (Uniform Resource Identifier) souvent dénommée URL (Uniform Resource Locator).
L'URL contient le nom du protocole, le nom du serveur, éventuellement le port si celui-ci n'est pas le port TCP/IP standard ie le port 80, le chemin d'accè, le nom de la ressource et éventuellement des paires attribut=valeur précédées d'un ?.
Exemple : http://127.0.0.1:8085/java/menu.html.
Le navigateur envoie un message de requête qui est composé de 3 parties :
La ligne de requête
Elle fournit la méthode, la ressource, éventuellement des paires attribut=valeur et la version du protocole.
Par exemple GET /java/menuJsp.html http/1.0.
Les en-têtes de requête
Les en-têtes fournissent des informations du type nom du Host, User-agent (Informations sur le navigateur), Accept (Types de format de fichiers acceptés par le navigateur),
. Cf plus loin.
Le corps de requête
Le corps de requête existe dans le cas de requêtes POST (Des données sont transmises par ce biais).
Les réponses
Le message de réponse possède lui aussi une structure ternaire; il contient une ligne d'état, des en-têtes de réponse et éventuellement un corps de réponse.
La ligne de réponse
Elle fournit la version du protocole, un code résultat et une description de ce code résultat.
Par exemple http/1.0 200 OK.
Les en-têtes de réponse
Les en-têtes fournissent des informations du type date de dernière modification, statut, type de contenu (Content-type : text/html ou image/gif
),
Cf plus loin.
Le corps de réponse
Le corps de réponse est par exemple une page html.
La gestion de l'état
HTTP est un protocole sans état.
Quand le serveur envoie une réponse à une requête il oublie tout de la transaction ie quand le client émet une deuxième requête, le serveur ne sait pas si elle a un lien avec la première.
Le serveur renvoie dans sa réponse un id de session que le client renverra à son tour avec l'url de la requête suivante. Ainsi il est possible de faire le lien entre les différentes requêtes d'un même client.
On utilise aussi les cookies, les champs cachés de formulaires, les réécritures d'URL, les variables de session pour conserver et/ou créer un état et ainsi lier les pages d'une application.
Mais le client peut désactiver dans son navigateur les cookies et rend ainsi la gestion de cookies et de session impossible ou plus délicate à gérer.
Les éléments de base de JSP
L'organisation d'une page JSP
Une page JSP peut être vue selon trois points de vue.
Le modèle MVC (Model-View-Controller),
Le code JSP et le code non-JSP,
Les éléments JSP.
Le modèle MVC (Model-View-Controller)
Ce modèle décrit une architecture de composants à trois niveaux :
View : c'est la partie présentation. Ce sont les codes html et JSP.
Controller : c'est le niveau chargé du traitement des requêtes. Ce sont les servlets.
Model : c'est la logique métier avec la manipulation des données de l'application. Ce sont les JavaBeans, les EJB et aussi des servlets.
Le mélange de codes
Une page JSP est un fichier texte d'extension .jsp.
Une page JSP est composée de texte template et de code JSP.
Le texte template est du code HTML, XML, CSS, JavaScript et n'est pas du code JSP. Il n'est pas interprété et est envoyé tel quel au navigateur.
GestionErreurs.jsp
Suite à une division par zéro par exemple.
Notes :
La page jsp est stockée dans le dossier /monApp/jsp
La page html est stockée dans le dossier /monApp/html
Le code JSP
Le code JSP est composé de trois types d'éléments :
Les directives (qui déterminent des caractéristiques au moment de la compilation),
Les éléments de script (qui permettent d'ajouter des éléments de code),
Les éléments action (qui déterminent des comportements d'exécution).
Une page JSP contient du code JSP et/ou du code Java et/ou du code HTML
.
Il existe huit éléments de base plus des éléments d'action :
ElémentFonctionSyntaxeDirectivesLa directive de pagePour les attributs de la page
La directive d'inclusionPour l'inclusion de fichiers
La directive de librairie de balises (Taglib)Pour les bibliothèques de balises personnalisées.
Pas de balise Eléments de scriptLa déclarationPour la déclaration de variables de page
Le scriptletPour le code
L'expressionPour renvoyer les valeurs d'une expression
Le commentairePour les commentaires
Pas de balise Eléments d'actionBeanPermet l'utilisation d'un JavaBeanPropriété en lecturePermet la récupération d'une valeur d'une propriété en lecture d'un javaBeanPropriété en écriturePermet l'affectation d'une valeur d'une propriété d'un javaBeanInclusion dynamiquePermet l'inclusion dynamique de codeRedirectionRedirige vers une pageParamètreDéclare un paramètreAppletGénère le code html d'un Objet
Pour la plupart des éléments il existe deux syntaxes :
La syntaxe JSP standard (JSP 1.x); les balises d'ouverture et de fermeture sont les suivantes : ; Les pages sont d'extension .jsp.
La syntaxe XML (JSP 2.x); les balises auto-fermantes ont cette syntaxe :; les éléments pleins utilisent les balises à la syntaxe suivante : ; les pages sont d'extension .jspx.
Les 2 versions de JSP
Modèle de page version 1.x généré par NetBeans
Test.jsp