Td corrigé 1.9 La communication Servlet-JSP-Bean - Free pdf

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