Vous êtes sur la page 1sur 159

Apprenez crer des applications web dynamiques avec JEE

Par cysboy

www.siteduzero.com

Licence Creative Commons BY-NC-SA 2.0 Dernire mise jour le 28/07/2011

Sommaire

1/158

Sommaire
Sommaire ........................................................................................................................................... Partager .............................................................................................................................................. Apprenez crer des applications web dynamiques avec JEE ......................................................... Partie 1 : Prologue : les bases ............................................................................................................ 1 1 3 4

Rappels ............................................................................................................................................................................. 4
Internet : qui ? quoi ? qu'est-ce ? ................................................................................................................................................................................ 4 Les en-ttes en fte ! ................................................................................................................................................................................................... 6 Soyez dynamiques ...................................................................................................................................................................................................... 9

Votre bote outils ........................................................................................................................................................... 11


Environnement d'excution ....................................................................................................................................................................................... 11 Tomcat pour les intimes ! .......................................................................................................................................................................................... 14 Eclipse : le retour ...................................................................................................................................................................................................... 17

Premiers pas ................................................................................................................................................................... 21


Cration ..................................................................................................................................................................................................................... 21 Dploiement .............................................................................................................................................................................................................. 23 Arrt, dmarrage et suppression ............................................................................................................................................................................... 29

Les servlets : premier opus ............................................................................................................................................. 31


Hello world ................................................................................................................................................................................................................. 31 Expliquons tout a ..................................................................................................................................................................................................... 33 Une question de contexte .......................................................................................................................................................................................... 36

Grer l'affichage .............................................................................................................................................................. 38


MVC et JEE ............................................................................................................................................................................................................... 39 V comme JSP ........................................................................................................................................................................................................... 40 Le modle ................................................................................................................................................................................................................. 47

Utiliser des formulaires .................................................................................................................................................... 51


Rappel ....................................................................................................................................................................................................................... Les sources de notre formulaire ................................................................................................................................................................................ Rajoutons des champs .............................................................................................................................................................................................. Tout est li ................................................................................................................................................................................................................. 52 55 59 61

TP : la loterieZ ................................................................................................................................................................. 63
Cahier des charges ................................................................................................................................................................................................... 64 Copies d'cran .......................................................................................................................................................................................................... 64 Correction .................................................................................................................................................................................................................. 66

Partie 2 : Autour de nos servlets ....................................................................................................... 73


Paramtres de servlets ................................................................................................................................................... 73
Paramtres d'initialisation ......................................................................................................................................................................................... 73 Tout dpend du contexte... ........................................................................................................................................................................................ 76 Des objets en paramtres ......................................................................................................................................................................................... 80

Cycle de vie d'une servlet ............................................................................................................................................... 85


Initialisation de la servlet ........................................................................................................................................................................................... Utilisation de la servlet .............................................................................................................................................................................................. Le retour des listeners ............................................................................................................................................................................................... Des listeners, encore des listeners ........................................................................................................................................................................... 85 87 89 92

Les sessions .................................................................................................................................................................... 97


Qu'est-ce qu'une session ? ....................................................................................................................................................................................... 97 Crer et utiliser une session ...................................................................................................................................................................................... 97 Comment a fonctionne .......................................................................................................................................................................................... 102 Encore des listeners ................................................................................................................................................................................................ 104 Dure d'une session ................................................................................................................................................................................................ 106

Les cookies ................................................................................................................................................................... 107


Utiliser des cookies ................................................................................................................................................................................................. 108 Session ou cookie ................................................................................................................................................................................................... 112

Les filtres ....................................................................................................................................................................... 113


Fonctionnement ....................................................................................................................................................................................................... 114 Utiliser les filtres ...................................................................................................................................................................................................... 115 Filtres et RequestDispatcher ................................................................................................................................................................................... 123

Gestion des erreurs et page d'accueil ........................................................................................................................... 127


Erreurs HTTP .......................................................................................................................................................................................................... 127 Grer les exceptions ............................................................................................................................................................................................... 130 Configurer vos pages par dfaut ............................................................................................................................................................................. 131

TP : un espace de connexion ........................................................................................................................................ 135


Cahier des charges ................................................................................................................................................................................................. 135 L'exception personnalise ....................................................................................................................................................................................... 135 Accder la session dans un filtre ......................................................................................................................................................................... 136 Dtruire une session ............................................................................................................................................................................................... 136 Copies d'cran ........................................................................................................................................................................................................ 136 Correction ................................................................................................................................................................................................................ 137 Les JSP ................................................................................................................................................................................................................... 138 Les servlets ............................................................................................................................................................................................................. 145 Le filtre et l'exception ............................................................................................................................................................................................... 146 Le fichier web.xml .................................................................................................................................................................................................... 148

Partie 3 : Autour de nos JSP ........................................................................................................... 150

www.siteduzero.com

Sommaire

2/158

Cycle de vie d'une JSP ................................................................................................................................................. 150


Que savons-nous ? ................................................................................................................................................................................................. 150 De JSP servlet ...................................................................................................................................................................................................... 151 En rsum ............................................................................................................................................................................................................... 157

www.siteduzero.com

Apprenez crer des applications web dynamiques avec JEE

3/158

Apprenez crer des applications web dynamiques avec JEE

Par

cysboy

Mise jour : 24/07/2009 Difficult : Difficile 11 398 visites depuis 7 jours, class 19/778 Bonjour toutes et tous ! Avant de commencer lire ce tuto, vous devez avoir lu les premires parties du tuto sur la programmation en Java ainsi que la totalit du tuto de M@teo sur XHTML / CSS. Ceci fait, nous allons pouvoir nous concentrer sur ce qui nous intresse ici : JEE. Pour simplifier nous pouvons aussi dire : dveloppement d'application WEB en Java. Je ne prtends pas faire un cours magistral sur le sujet, mais les Zros qui connaissent un peu JEE savent que beaucoup de choses rentrent en ligne de compte et, par consquent, que a ncessite patience, rigueur et dbrouillardise.

Nous allons, dans un premier temps, rappeler quelques notions sur le fonctionnement du web. Ensuite, nous verrons ce qu'est le coeur d'une application JEE, les servlets. Aprs avoir appris manipuler ces objets, nous verrons que, pour avoir une application respectant certains standards de programmation JEE, nous allons devoir coupler ces dernires avec ce qu'on appelle des JSP. Toute application web dite dynamique ncessite une base de donnes ainsi que des objets qui iront manipuler ces donnes. La suite nous amnera l'interaction avec les bases de donnes. J'espre que ce programme vous plat... Petite prcision : En fait, la version actuelle (JEE) est un diminutif de Java 5 Enterprise Edition : Le 5 signifiant en fait 1.5. Par contre, dans ce tuto, nous partirons de la version 1.4 qui s'appelle, elle, J2EE : le 2 couvre en fait jusqu' la version 1.4 ! Je vois que vous tes impatients de commencer, alors allons-y !

www.siteduzero.com

Partie 1 : Prologue : les bases

4/158

Partie 1 : Prologue : les bases


Dans cette partie nous poserons les bases de connaissance ainsi que quelques rappels afin de pouvoir dvelopper aisment ! V ous apprendrez peut-tre certaines choses sur le fonctionnement du web et, pour ceux qui ne connaissent pas J2EE, vous verrez comment dbuter dans cette aventure ! Oui, ce que vous allez vivre partir de maintenant sera une vritable aventure .

Rappels
Le titre de ce chapitre n'est pas trs vocateur, je vous le concde... En fait, vous auriez pu remplacer ce dernier par : " tout ce que vous avez toujours voulu savoir sur le web sans jamais avoir os le demander !". Je sais qu'en bons Zros que vous tes, vous surfez rgulirement sur le net ; mais savez-vous rellement ce qu'il se passe lorsque vous saisissez une URL ou que vous suivez un lien ? Savez-vous ce qu'est un serveur web ? Connaissez-vous la diffrence entre une requte POST et une requte GET ? Non ? Alors suivez le guide !

Internet : qui ? quoi ? qu'est-ce ?


Je ne vais pas vous faire un historique sur la naissance du web tel que nous le connaissons maintenant, je vais juste vous rappeler le fonctionnement de celui-ci. Cependant, si certaines personnes souhaitent tout de mme en savoir plus sur l'histoire d'Internet, elles peuvent suivre ce lien. Pour faire court, ne confondez pas Internet avec le web ! Internet est un assemblage de multiples rseaux, tous connects entre eux. Cet amas de cbles, de fibres optiques... de matriels, pour faire simple, constitue Internet, aussi appel " le rseau des rseaux ". Le Web est un systme de fichiers prsent sur des machines (serveurs) transitant par un protocole particulier, consultable grce des navigateurs web et fonctionnant SUR Internet ! Le web est donc un systme de fichiers que toute personne possdant un ordinateur (ou un tlphone, maintenant...) connect Internet peut consulter (avec un abonnement d'un FAI, bien sr... ). En fait, consulter les fichiers prsents sur le web est chose courante, surtout pour vous ! Eh oui ! Surfer sur le web, aller sur le Site du Zro, consulter vos mails chez votre FAI... tout ceci est en fait de la consultation de fichiers prsents sur Internet. V ous n'tes pas sans savoir que, dans la majeure partie des cas, on surfe sur le web avec un navigateur tel que Firefox, Internet Explorer, Safari... Ne vous tes-vous jamais demands comment les navigateurs savent aller au bon endroit ? Comme, par exemple, aller sur le SdZ ?

V otre navigateur vous demande une URL saisie en " 1" et, une fois cette adresse valide, votre navigateur vous renvoie ce qui se trouve cette adresse (oui, c'est une adresse), le Site du Zro, en " 2". Il faut bien sr que l'adresse existe et qu'il y ait quelque chose cette adresse, sinon :

www.siteduzero.com

Partie 1 : Prologue : les bases

5/158

Pourquoi certaines adresses nous renvoient des pages web et d'autres des erreurs ?

Pour ceux qui ne le sauraient pas, tout ordinateur actuel possde une adresse sur un rseau : son adresse IP. C'est grce cette adresse qu'un ordinateur, ou un serveur, peut s'identifier sur un rseau. V oyez a comme sa carte d'identit. Par exemple, chez moi, je suis connect ma box (fournie par mon FAI) qui me donne accs Internet. Sur Internet, cette box a une adresse qui lui est propre et celle-ci ressemble quelques choses comme a 242.231.15.123 : on appelle ces adresses des "adresses IP". Lorsque vous demandez une page web votre navigateur, vous lui demandez, de faon tacite, d'aller chercher ce qui se trouve l'adresse demande ! Eh ! Si les ordinateurs ont des adresses pour se reconnatre sur les rseaux, comment se fait-il qu'en tapant un nom comme " google.com" les navigateurs sachent o chercher ? Partez du principe que toute adresse de site internet pointe vers un serveur (ou plusieurs) qui a une adresse. Par exemple, taper " http://www.google.fr" dans votre navigateur revient saisir " http://74.125.19.147" (adresse d'un serveur Google sur Internet) : essayez, vous verrez ! V ous tes d'accord sur le fait que cette suite de nombres n'est pas des plus faciles retenir... Il est bien plus simple de mmoriser google.fr. Je ne m'terniserai pas sur le sujet mais sachez qu'il y a une machine qui fait le lien entre les adresses de serveurs (suite de nombres) et les adresses littrales (google.fr) : les DNS. V oyez ces machines comme de gigantesques annuaires tlphoniques, mais pour les sites internet. Et qu'est-ce que c'est que le " http:// " ?

Si vous relisez bien ce que j'ai dit plus haut, vous devez voir que nous avons vu qu'avec l'URL que vous renseignez, vous spcifiez une machine interroger, donc des fichiers lire, il ne nous manque plus que le protocole. Ici, il s'agit du protocole http. C'est grce ce protocole que le navigateur envoie des " requtes" (nous y reviendrons) aux serveurs que vous sollicitez. Il en existe d'autres comme le FTP, le SMTP... Inutile de nous apesantir sur le sujet (c'est un tuto de programmation, pas de rseau, non mais)... Au final, une URL peut se dcomposer comme suit :

www.siteduzero.com

Partie 1 : Prologue : les bases

6/158

Je pense que ce schma est assez explicite... Il y a toutefois un petit dtail qu'il serait bon que vous sachiez. Dans les URL, il y a un paramtre facultatif : le numro de port utilis par le protocole. En fait, chaque protocole de transfert utilise un port sur le serveur, voyez a un peu comme une porte affecte une personne. Par exemple, lorsque vous rentrez dans une gendarmerie, vous prenez l'entre principale (sauf si vous vous tes fait coffrer... ), seules les personnes autorises ont le droit de prendre l'entre de service. C'est la mme chose pour les protocoles de transfert, chacun a un port attribu : HTTP : port 80 ; FTP : port 20 ou 21 ; SMTP : port 25 ; ...

Si nous ajoutons le numro de port notre URL prsente dans le schma, nous aurions ceci :

http://www.monsite.com:80/dossier/fichier.html
Mais ceci est facultatif puisque le protocole http utilise le port 80 par dfaut ! Maintenant que la lumire est plus ou moins faite sur la faon dont le web fonctionne, nous allons voir comment les serveurs nous retournent des pages web.

Les en-ttes en fte !


Nous avons vu que, lorsque vous saisissez une URL dans votre navigateur, que vous validez cette dernire, votre navigateur envoie une " requte" au serveur concern afin qu'il nous renvoie une page web. Tout d'abord, on nomme vulgairement l'change de donnes entre votre navigateur et le serveur qui fournit les pages web un change . Le client reprsente votre navigateur et le serveur... Enfin, vous avez devin. Le moment est venu de vous en apprendre un peu plus. V oici ce qu'il se passe : le client met une requte http vers le serveur cibl ; le serveur reoit les lments de la requte ; celui-ci les interprte ; il renvoie la page demande en mettant une rponse http ; le client reoit la page au format HTML ; le client affiche la page.

client / serveur

Nous pouvons rsumer ce qu'il se passe avec ce schma :

www.siteduzero.com

Partie 1 : Prologue : les bases

7/158

Bon, on a compris que le navigateur et le serveur s'changent des "requtes http". Mais c'est quoi ?

V oici un exemple d'en-tte HTTP correspondant cette adresse : http://www.6boy.info/parcours.html. Code : Autre

GET /parcours.html HTTP/1.1 Host: www.6boy.info UserAgent: Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9.0.4) Gecko/2008102920 Firefo Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive

Je me doute que ceci doit vous faire peur... Ne vous en faites pas trop, nous n'allons pas dcortiquer tout a : nous allons juste voir ce que cela signifie. Je vous ai fait une petite image qui encadre les blocs principaux. Je sais, je suis trop bon...

www.siteduzero.com

Partie 1 : Prologue : les bases

8/158

Dtes-vous que ce qui correspond au premier point est en fait ce que vous demandez au serveur. Serveur spcifi dans le paramtre " Host" du deuxime bloc (nous ne parlerons pas des autres paramtres du deuxime bloc... le but n'est pas l). V ous remarquez aussi qu'il y a un type de requte envoye au serveur ; ici, il s'agit d'une requte de type " GET". V ous pouvez comprendre la premire ligne de la requte comme une discussion entre votre navigateur et le serveur spcifi, un peu comme a : " Donne-moi la page suivante s'il te plat ". Il existe d'autres types de requtes HTTP, nous y reviendrons le moment venu... Maintenant, voyons ce que vous rpond le serveur :

Le plus intressant se trouve dans la premire zone. HTTP/1.x : le protocole utilis pour la rponse 200 : ce que le traitement de la requte sur le serveur a retourn comme type de rponse. OK : la traduction de 200 en langage humain, ici le traitement de la requte a t un succs !

Il y a toutefois une chose importante dans ces enttes HTTP, aussi bien dans la demande que dans la rponse :

Content-Type: text/html
Ceci signifie que le navigateur demande une page HTML et que le serveur retourne une page HTML. V ous devriez savoir ce que c'est si vous avez suivi le tuto de M@teo. V ous n'tes pas sans savoir que le HTML est le langage de base pour toute page web . Par l entendez que les pages sont toutes identiques et donc que leurs contenus ne s'adaptent pas aux utilisateurs. V ous n'aimeriez pas vous connecter sur le SdZ et vous retrouver avec un autre compte, ou pire, vous connecter sur votre bote mail de votre FAI et avoir les mails de votre petite soeur ! Pour russir rendre les pages web dynamiques, vous devrez utiliser un langage de programmation, autre que HTML, que votre serveur pourra interprter ! Sachez qu'un serveur ne sait utiliser et renvoyer que des pages HTML statiques ! Si vous voulez que votre site s'adapte aux utilisateurs, vous aller devoir faire deux choses : apprendre un langage permettant de faire ce genre de personnalisation... ajouter un serveur d'application capable d'interprter un langage.

STATIQUE

Il y a beaucoup de langages qui permettent de faire ce genre de choses. Beaucoup de tutos sur ce genre de langage existent sur le SdZ et sur le web en gnral. Ce genre de langage s'appelle un langage ct serveur : un langage interprt par un serveur. Les plus connus sont PHP, Java, .Net mais il en existe bien d'autres.

www.siteduzero.com

Partie 1 : Prologue : les bases


V oyons un peu ce qu'il se passe lorsque vous demandez une page contenant ce genre de code !

9/158

Soyez dynamiques
V ous allez voir, en fin de compte, c'est trs simple... Je vous ai dit plus haut que, par dfaut, votre serveur ne sait manipuler que des fichiers .html, donc des pages web statiques. Afin que notre serveur sache interprter du code dans des pages web, nous allons devoir lui installer un " environnement ". Pour simplifier les choses, les pages contenant du code interprter ont une extension particulire : .php : page contenant du code PHP ; .aspx : pages contenant du code .NET ; .jsp : pages contenant du code Java ; ...

Si vous demandez ce genre de page un serveur sans que celui-ci sache que faire avec ce qui s'y trouve, vous aurez de mauvaises surprises... Attends deux minutes ! quoi ressemble le fameux code dont tu parles depuis tout l'heure ?

En fait, il dpend du langage que vous utilisez... V oici une page contenant du code PHP : Code : PHP <html> <body> <?php echo "Bonjour toi...<br />";?> </body> </html>

V oici une page contenant du code Java : Code : JSP <html> <body> <% out.println("Bonjour toi...<br />");%> </body> </html>

V ous pouvez voir qu'il y a des diffrences entre ces deux codes, mme si le rsultat sera le mme. D'accord, on voit dj mieux quoi ressemble ton fameux code ct serveur. Mais, du coup, comment le serveur sait que faire avec ce code ? J'allais y venir. Dites-vous bien que sans le fameux " environnement " dont je vous parlais plus haut, le serveur ne saurait pas quoi faire. En fait, votre serveur va, ds qu'il aperoit un type d'extension de fichier demand, laisser l'environnement triturer la page. Ce dernier, aprs avoir termin sa cuisine de son ct, retourne une page ne contenant que du code HTML de base au serveur qui, lui, va nous retourner une rponse HTTP avec la page ! Nous ne parlerons pas de PHP ou de .NET puisque c'est de Java dont il s'agit dans ce tuto. Donc, afin que votre serveur sache interprter du code Java dans les pages web, vous allez avoir besoin d'un logiciel spcifique que l'on nomme vulgairement " conteneur de servlets ". Ne vous inquitez pas, vous allez savoir ce qu'est une servlet trs bientt...

www.siteduzero.com

Partie 1 : Prologue : les bases


Pour information, sachez qu'il existe plusieurs conteneurs de servlets, chacun avec des caractristiques diffrentes. Nous en parlerons dans le prochain chapitre. Revenons nos moutons : je vous disais que le serveur, selon les requtes mises, demandait de l'aide notre conteneur. Pour que vous puissiez mieux visualiser, voici un petit schma fait par mes soins :

10/158

V ous pouvez dj deviner ce dont nous allons avoir besoin pour travailler. Nous aborderons tout ceci dans le chapitre prochain ; pour le moment, vu que vous venez de voir dans les grandes lignes comment fonctionne la gnration de pages web dynamiques, le temps est venu de faire un petit QCM avant de poursuivre... Les Zros qui ne connaissaient pas ces notions ont d apprendre plein de chose rigolotes ici... Dtes-vous bien que ce que nous allons faire, tout au long de ce tuto, n'est qu'une autre faon de crer des programmes pour le web ! Sur le SdZ, vous pouvez dj voir que M@teo a fait deux tutos sur la cration de sites. Bon, je me doute que si vous avez lu ce chapitre, c'est que vous tes intresss par la faon de crer des sites internet avec Java. Alors continuons...

www.siteduzero.com

Partie 1 : Prologue : les bases

11/158

Votre bote outils


Nous avons vu prcdemment comment les pages web transitent sur Internet ainsi que la ncessit d'avoir un conteneur sur notre serveur, ceci pour que ce dernier sache interprter les pages dynamiques. Dans ce chapitre nous allons mettre en place notre environnement de dveloppement : le logiciel que nous allons utiliser pour coder nos pages web ; l'environnement d'excution de ces pages.

Je vous rappelle que, pour suivre aisment ce tuto, vous devez avoir lu les premires partie du tuto Java (au moins les deux premires parties). Par consquent, je pars du principe que vous avez un environnement Java install sur votre machine. Bien ! Nous allons maintenant mettre en place tout ce dont nous allons avoir besoin pour travailler.

Environnement d'excution
Attends ! Il va falloir qu'on achte un serveur pour suivre le tuto ?

Non, heureusement ! Nous allons juste utiliser le mme logiciel que les serveurs web... Et le serveur sera... votre machine ! Oui, vous avez bien entendu ! Nous allons faire croire votre ordinateur qu'il est un serveur. Du coup, pas besoin d'hberger nos pages sur Internet pour faire nos tests... Bon, si vous vous rappelez bien ce que je vous ai dit, il existe plusieurs logiciels qui permettent de contenir des pages web dynamiques crites en Java. V ous pourrez trouver : Apache Tomcat ; JBoss ; WebSphere ; GlassFish ; ... La liste est longue. Chacun de ces serveurs d'applications permet une machine de comprendre des pages web contenant du code Java. Pourquoi tu les appelles serveurs d'applications ?

Parce que c'est le nom que les dveloppeurs leur donnent. Le serveur physique (la machine) est communment appele serveur web et l'application qui permet de gnrer des pages HTML depuis des pages dynamiques s'appelle le serveur d'applications ! Tous ces serveurs d'applications ont des spcifications, tous sont des conteneurs de servlets (bientt, bientt... ) mais seulement certains d'entre eux peuvent contenir ce qu'on appelle des EJB. Nous aurons l'occasion d'en parler, mais pour l'heure, sachez seulement que ce sont des objets Java qui permettent de grer ce qu'on nomme la persistance des donnes ! Je ne vais pas vous en parler maintenant alors que vous n'avez mme pas encore install votre environnement de travail... Pour l'instant, nous allons utiliser Tomcat. Je vous invite donc le tlcharger sur ce site. Au moment ou j'cris ce tutoriel, Tomcat en est sa version 6, je vous invite donc le tlcharger :

www.siteduzero.com

Partie 1 : Prologue : les bases

12/158

Il ne vous reste plus qu' choisir ce que vous voulez comme type d'installation ; vu que je suis sous Windows, je prends celle-ci :

Une fois que le fichier est tlcharg, il ne vous reste plus qu' l'installer. Double cliquez sur l'excutable et laissez-vous guider. Je vous conseille vivement d'installer les exemples : comme a, vous pourrez jeter un coup d'oeil...

www.siteduzero.com

Partie 1 : Prologue : les bases

13/158

un moment donn de l'installation, Tomcat va vous demander sur quel port vous voulez utiliser le serveur, le mieux est encore de laisser la valeur par dfaut. Dans la mme fentre, on vous demande de saisir un nom et un mot de passe pour accder l'espace d'administration du serveur. Pour ceci, je vous laisse juges. Je n'ai pas de donnes sensibles sur mon serveur perso, donc je laisse tel quel... Mais si un jour vous devez utiliser un serveur destin tre connect Internet, je vous conseille vivement de mettre un bon couple login-mot de passe ! V oici ladite fentre :

www.siteduzero.com

Partie 1 : Prologue : les bases


Enfin, avant de terminer l'installation, on vous demandera de spcifier l'endroit o se trouve le JRE install :

14/158

V oil ; une fois install, on vous demande si vous souhaitez lancer le serveur : allez-y. Nous allons un peu en faire le tour... Une fois que Tomcat a lanc ses services, vous devriez avoir cette icne dans la barre des tches :

Si vous faites un clic droit sur cette icne, vous devriez voir ceci :

Nous ne nous attarderons pas sur l'aspect configuration pour le moment, sachez que vous pouvez arrter Tomcat en cliquant sur " Stop service" ou carrment quitter l'application en cliquant sur " Exit". Gnial, mais comment on se sert de Tomcat ?

C'est exactement ce que nous allons voir...

Tomcat pour les intimes !


Bon vous avez install Tomcat, mais comment s'en sert-on ? Rien de plus facile ! Rappelez-vous que c'est une application qui mule un serveur sur votre machine. Il suffit donc d'aller l'interroger pour voir ce qu'il y a dedans...

www.siteduzero.com

Partie 1 : Prologue : les bases

15/158

Oui, mais COMMENT ON FAIT ? ? ? ?

Souvenez-vous que pour interroger un serveur, il faut un navigateur et son adresse, l'adresse de notre serveur est " localhost", traduisez par " hte local ". Donc si vous tapez ceci dans votre navigateur l'emplacement de l'URL, vous aurez :

Hein ?

Ah oui... V ous vous rappelez que, pour le protocole HTTP on se sert par dfaut du port 80. Cependant, ici, nous avons spcifi Tomcat qu'il allait utiliser le port 8080 ; il fallait donc taper ceci dans l'URL : " V oici ce que vous devriez obtenir :

localhost:8080".

www.siteduzero.com

Partie 1 : Prologue : les bases

16/158

V ous voil sur la page d'accueil de votre serveur Tomcat ! Je vous invite faire un tour du ct des exemples que vous avez d installer... Pour ceux qui seraient un peu perdus, c'est par l :

V ous pouvez voir les exemples ainsi que les codes sources gnrant ces derniers ! Mais o se trouve tout a ?

Dans le rpertoire d'installation de Tomcat, vous avez plusieurs dossiers :

www.siteduzero.com

Partie 1 : Prologue : les bases

17/158

Les exemples se trouvent dans le dossier " examples" qui se trouve dans le dossier " webapps" ! V ous le dcouvrirez assez tt, mais c'est dans le dossier " webapps " que nous allons mettre tous nos projets JEE !

V ous pouvez voir aussi qu'il y a des dossiers comme " conf " ou " logs " dans lesquels vous trouverez respectivement les fichiers de configuration de votre serveur Tomcat, y compris les couples "utilisateurs / mots de passe" dans " conf/tomcat-users.xml " (bon savoir si vous perdez votre mot de passe d'accs l'administration) et les fichiers que Tomcat gnre en cas d'erreur... Nous aurons l'occasion de reparler de tout ceci. Nous ne tarderons pas utiliser l'interface d'administration, mais pour le moment, il nous manque encore quelque chose pour raliser des applications web : un diteur de code !

Eclipse : le retour
Afin de pouvoir crer des applications JEE, il va nous falloir l'environnement de dveloppement JEE, tlchargeable ici. Il s'agit de la version d'Eclipse permettant de raliser des projets JEE. Il vous suffit de suivre le lien entour ci-dessous :

Si la version J2SE d'Eclipse ne vous permet pas d'effectuer d'application JEE, le contraire est vrai ! Avec la version JEE

www.siteduzero.com

Partie 1 : Prologue : les bases


d'Eclipse, vous pourrez trs bien faire des applications Java comme vu dans le tuto : programmation en Java.

18/158

Une fois Eclipse tlcharg, nous avons ce qu'il nous faut pour crer des applications web en Java. Toutefois, le fait que nous devions lancer Tomcat, puis lancer Eclipse afin de tout faire fonctionner semble un peu fastidieux. Il existe un petit plug-in bien utile pour Eclipse, permettant ce dernier de piloter le lancement, l'arrt ou le redmarrage de Tomcat. Je vous invite donc le tlcharger ici. Choisissez la version la plus rcente :

Une fois le plug-in tlcharg, il vous suffit de dzipper l'archive et de coller le dossier que celle-ci contenait dans le dossier " plugin" prsent dans le dossier d'installation d'Eclipse ! Une fois ceci fait, vous pouvez lancer Eclipse. V ous devriez voir trois boutons avec une icne familire :

Il ne nous reste plus qu' paramtrer Tomcat dans Eclipse et le tour sera jou ! Pour cela, vous devez aller dans " Window", choisissez le point de menu " Preferences " ; de l, allez dans les paramtrages de Tomcat. Il ne vous reste plus qu' spcifier quelle version de Tomcat vous utilisez et o vous l'avez install :

www.siteduzero.com

Partie 1 : Prologue : les bases

19/158

V oil ! V ous pouvez dsormais piloter Tomcat depuis Eclipse : vous verrez trs bientt que ceci est trs utile. Je pense que vous avez compris que le bouton de gauche lance Tomcat, celui sa droite l'arrte et le dernier relance le serveur... Rien de compliqu ! Il y a une autre nouveaut qu'apporte ce plug-in : la possibilit de crer un projet Tomcat.

www.siteduzero.com

Partie 1 : Prologue : les bases

20/158

Enfin, nous avons tout ce dont nous avons besoin pour travailler ! Nous pouvons commencer et a ne sera pas une partie de plaisir... Prparez-vous... Nous allons voir tout ceci dans le prochain chapitre avec votre premire application web en Java ! V oil. Les bases sont poses ! V ous avez tout ce qu'il faut pour vous lancer dans l'aventure J2EE. Je vous propose donc de commencer tout de suite avec un chapitre somme toute assez touffu...

www.siteduzero.com

Partie 1 : Prologue : les bases

21/158

Premiers pas
Maintenant que nous avons nos outils, nous allons pouvoir rentrer dans le vif du sujet ! Rappelez-vous comment fonctionnent les applications web : requte, traitement, rponse. Nous allons voir comment bien commencer dans l'aventure JEE, mais progressivement car, avant de commencer programmer, vous allez avoir besoin de prcisions sur la faon dont Tomcat va grer nos applications ! Bon ben, qu'est-ce qu'on attend ?

Cration
Nous allons faire simple (comme d'habitude...). Avant de commencer coder, nous allons tout d'abord voir comment crer un projet JEE - ceci n'est pas anodin - et ensuite, comment mettre notre application sur notre serveur (dans Tomcat !), tout a pour pouvoir admirer notre travail. Lors du dernier chapitre, je vous avais montr que le plug-in Tomcat permettait de crer un " projet Tomcat" : c'est exactement ce que nous allons faire ! Fates " File > new > Other", droulez le menu " Java" et choisissez un " Projet Tomcat" :

Nommez-le " Test" :

www.siteduzero.com

Partie 1 : Prologue : les bases

22/158

Cliquez sur " Finish" pour terminer la cration du projet. Wahou ! Qu'est-ce que c'est que tout a ?

Regardez dans votre espace de travail, vous devriez avoir un dossier " Test" avec ceci dedans :

www.siteduzero.com

Partie 1 : Prologue : les bases

23/158

En fait, les plus curieux ont srement jet un rapide coup d'oeil aux dossiers se trouvant dans le rpertoire " webapps " dans Tomcat... Ceux-ci ont d s'apercevoir que les dossiers prsents n'taient pas tous les mmes, l'exception du dossier " WEB-INF". En effet, ce dernier est le coeur d'une application JEE ! Tout repose sur lui et sur son contenu... Les autres dossiers sont facultatifs et peuvent changer selon les besoins du programmeur. Dans notre cas nous avons des dossiers " src" et " bin", dossiers qui doivent vous tre familiers... Eh oui, un dossier pour les sources Java et un pour les .class ! Pour schmatiser un peu ce que contient un serveur d'application, voici un petit schma :

Concernant le contenu du dossier " WEB-INF", qui doit bien vous intriguer maintenant, nous allons y arriver trs vite ! Ds le chapitre prochain en fait...

Bon, vous venez de crer votre premier projet Tomcat. Nous allons voir maintenant comment le dployer !

Dploiement
www.siteduzero.com

Partie 1 : Prologue : les bases


Quoi ?

24/158

Je savais que ce mot allait vous perturber ! "Dployer" une application JEE veut seulement dire que nous allons la mettre en place dans notre conteneur de servlets : Tomcat ! Aprs cette manipulation, nous pourrons aller interroger notre serveur d'applications pour voir le rendu de nos pages web... Tu n'arrtes pas d'appeler Tomcat un " conteneur de servlets"... Tu ne pourrais pas expliquer d'avantage ?

Je pourrais, mais je prfre vous faire faire une servlet avant de vous expliquer ceci... V ous comprendrez mieux, je pense. V ous allez voir que mettre en place une application JEE est tout simple : un simple copier-coller suffit ! Il existe d'autres faons de faire, mais nous n'en parlerons que plus loin dans le tuto...

Bon, si vous ne l'avez pas encore fait, dmarrez votre serveur Tomcat, ce qui devrait vous donner ceci dans la console d'Eclipse :

Et rendez-vous dans la partie d'administration, pour mmoire c'est ici :

V ous voici devant le listing des applications prsentes dans Tomcat !

www.siteduzero.com

Partie 1 : Prologue : les bases

25/158

Nous aborderons plus loin les lments prsents en fin de page, de mme pour les options qu'offre le listing des applications Tomcat !

Maintenant, le but du jeu est d'importer notre travail dans Tomcat afin de pouvoir visualiser les pages cres et voir apparatre notre (nos) application(s) dans le listing ci-dessus. Rendez-vous dans votre espace de travail Eclipse, copiez le dossier " Test" correspondant votre application JEE vide, allez dans le dossier d'installation de Tomcat et collez le dossier dans le rpertoire " webapps ". V ous devriez avoir ceci dans le dossier " webapps " :

Maintenant, rendez-vous dans l'administration de Tomcat que vous avez dj ouverte tout l'heure. Si vous aviez teint votre navigateur ou redemand la page d'administration, vous devriez avoir ceci sous les yeux :

www.siteduzero.com

Partie 1 : Prologue : les bases

26/158

Si vous n'avez pas ceci, rafrachissez la page avec la touche F5.

Il ne vous reste plus qu' cliquer sur le lien correspondant notre projet dans l'administration pour y accder, et voil :

Ouh l ! Qu'est-ce que c'est que a ?

Eh oui ! Nous avons dploy un projet vide... Il n'existe aucune page web afficher... Du coup, la requte http de notre navigateur vers notre serveur a retourn une erreur : erreur 404. Les gens qui ont tendance fouiner sur le web ont d souvent voir ce genre d'erreur. Il en existe plusieurs en fait, voici un petit listing des codes renvoys par un serveur : Code 1XX, rponse provisoire : 100 : OK pour continuer, 101 : le serveur a chang de protocole ; Code 2XX, russite : 200 : (ok) la requte a t traite avec succs, 201 : (object created, reason = new URI) document cr, 202 : (async completion (TBS)) requte acheve de manire asynchrone, 203 : (partial completion) requte acheve de manire incomplte, 204 : (no info to return) aucune information retourner, 205 : (request completed, but clear form) requte termine mais formulaire vide, 206 : (partial GET furfilled) requte GET incomplte ; Code 3XX, redirection : 300 : (server couldn't decide what to return) code de retour impossible dterminer par le serveur, 301 : (object permanently moved) document dplac dfinitivement, 302 : (object temporarily moved) document dplac temporairement, 303 : (redirection with new access method) redirection avec nouvelle mthode d'accs, 304 : (if-modified-since was not modified) le champ 'if-modified-since' n'tait pas modifi,

www.siteduzero.com

Partie 1 : Prologue : les bases

27/158

305 : (redirection to proxy, location header specifies proxy to use) redirection vers un proxy spcifi par l'entte, 307 : (HTTP/1.1: keep same verb) HTTP/1.1 ; Code 4XX, erreur de requte client : 400 : (invalid syntax) erreur de syntaxe, 401 : (access denied) pas d'autorisation d'accs au document, 402 : (payment required) accs au document payant, 403 : (forbidden) la ressource demande existe mais vous n'avez pas le droit de l'avoir, 404 : (page not found) la ressource demande n'existe pas sur le serveur, 405 : (method is not allowed) mthode de requte du formulaire non autorise, 406 : (no response acceptable to client found) requte non accepte par le serveur, 407 : (proxy authentication required) autorisation du proxy ncessaire, 408 : (server timed out waiting for request) temps d'accs la page demande expir, 409 : (user should resubmit with more info) l'utilisateur doit soumettre nouveau avec plus d'infos, 410 : (the resource is no longer available) cette ressource n'est plus disponible, 411 : (the server refused to accept request w/o a length) le server a refus la requte car elle n'a pas de longueur, 412 : (precondition given in request failed) la prcondition donne dans la requte a chou, 413 : (request entity was too large) l'entit de la requte tait trop grande, 414 : (request URI too long) l'URI de la requte tait trop longue, 415 : (unsupported media type) type de mdia non gr ; Code 5XX, erreur du serveur : 500 : (internal server error) erreur interne du serveur, 501 : (required not supported) requte faite au serveur non supporte,, 502 : (error response received from gateway) mauvaise passerelle d'accs, 503 : (temporarily overloaded) service non disponible, 504 : (timed out waiting for gateway) temps d'accs la passerelle expir, 505 : (HTTP version not supported) version HTTP non gre. Je ne pense pas en avoir oubli... V ous pouvez voir qu'il existe beaucoup de codes de retour pour un traitement de requte HTTP. Je ne vous cache pas qu'il n'est pas utile de les connatre tous par coeur, sachez seulement retrouver la correspondance entre un code d'erreur et sa signification et a ira... Donc, pour en revenir notre problme, nous avons envoy une requte HTTP notre serveur pour qu'il nous retourne une page web. Or, si vous n'avez pas oubli les cours de tonton M@teo, si vous demandez une racine de rpertoire une serveur web, ce qui est notre cas, celui-ci cherche un fichier se nommant " index.html " (ou avec une autre extension, mais son nom est index). V ous tes d'accord avec moi pour dire que ce fichier n'existe nulle part dans notre rpertoire " Test" ! Par consquent, notre serveur nous retourne une erreur 404 : page not found ! Pour pallier ce problme, nous allons ajouter une page " index.html " dans notre projet grce Eclipse. Attention : la page que vous allez crer sera dans votre projet Eclipse et non dans l'application dploye dans Tomcat !

Pour crer une page HTML la racine du projet, faites - sous Eclispe - un clic-droit sur le dossier global de votre projet, choisissez ensuite " new > other" et dans le menu " web", slectionnez HTML :

www.siteduzero.com

Partie 1 : Prologue : les bases

28/158

Eclipse vous gnre une bonne dose de code HTML lui-mme. J'ai juste rajout cette ligne : Code : HTML <h1>Coucou les ZrOs</h1>

V ous n'avez plus qu' copier-coller ce fichier dans le dossier " webapps/Test" dans Tomcat et de rafrachir la page qui retournait une erreur. V ous passez de a :

a :

Victoire ! V ous venez de crer et de dployer votre premire application JEE !

www.siteduzero.com

Partie 1 : Prologue : les bases


Je sais, j'en fais beaucoup... Et une page web statique n'a rien d'une application JEE... Une chose... On va devoir faire des copier-coller sans arrt ?

29/158

Non, bien sr. Il y a une alternative et les plus malins d'entre vous l'ont sans doute dj trouve : utiliser le dossier " webapps " de votre Tomcat comme espace de travail ! Une reconfiguration d'Eclipse est peut-tre ncessaire... Pour faire ceci, il vous suffit d'aller dans le menu " File", de choisir l'option " Switch Workspace" et de slectionner " Other..." comme ceci :

V ous n'avez plus qu' choisir le dossier " webapps " de Tomcat et le tour est jou ! Il va de soi que je pars du principe que le Tomcat en question n'est pas le serveur que les clients utilisent dans le cas o vous travaillez en conditions relles... Il vaut mieux ne pas modifier des fichiers consultables directement sans tre sr que la modification fonctionne !

Arrt, dmarrage et suppression


C'est le genre de sous-chapitre que j'affectionne car il va tre trs court... V ous avez vu que la page HTML que nous avons cre fonctionne ; cependant, vous devez savoir que l'application fonctionne tant que Tomcat la considre comme dmarre :

Dans la colonne " commands ", vous avez le choix entre plusieurs actions : arrter : stoppe l'application, elle ne sera plus disponible ; dmarrer : lance l'application ; recharger : arrte puis dmarre l'application ; undeploy : supprime l'application.

Prenez votre application " Test" et cliquez sur " arrter", vous devriez avoir ceci maintenant :

www.siteduzero.com

Partie 1 : Prologue : les bases

30/158

Essayez d'accder la page de test... Impossible ! Si vous voulez y accder de nouveau, vous devrez dmarrer l'application. Pour supprimer une application sur le serveur Tomcat, il faut tout simplement cliquer sur " undeploy ". ATTENTION : cette action supprime l'application dans le listing de Tomcat mais aussi dans le dossier webapps ! !

Bon, vous savez maintenant comment crer, dployer, dmarrer, arrter et supprimer une application JEE. Si on en profitait pour entrer dans le vif du sujet ? Aprs le QCM, bien entendu... Pas mal pour un dbut ! Il y a aussi quelques points obscurs mais ne vous inquitez pas, nous allons les claircir d'ici peu... Le mieux est encore de continuer dans notre lance...

www.siteduzero.com

Partie 1 : Prologue : les bases

31/158

Les servlets : premier opus


Enfin, nous allons commencer faire du Java ! V ous attendiez ce moment avec impatience mais vous allez peut-tre le regretter... Je plaisante bien sr. Nous allons tout prendre partir de Zro, c'est rassurant. Tout d'abord, sachez qu'une servlet est une classe Java comme vous en avez fait des centaines de fois (si ce n'est pas des milliers...). La diffrence majeure rside dans le fait qu'elle a un rle jouer dans le jeu JEE !

Hello world
partir de maintenant, je pars du principe que vous savez comment dployer, dmarrer, arrter et consulter une application !

Avant toute chose, vous allez avoir besoin d'un autre plug-in pour Eclipse : le plugin XML Buddy . Celui-ci vous permettra de vous simplifier la vie lorsque vous allez crer des fichier XML (oui, oui, vous allez en faire). Je vous laisse le soin de le tlcharger et de dcompresser l'archive dans le dossier plugin d'Eclipse. Si vous tes perdus, une simple recherche de ce plug-in sur Google vous donnera satisfaction !

Nous allons commencer par un simple " hello world" et je vous assure que rien qu'avec ceci, il y a du travail et plein de choses voir ! Comme je vous l'avais dit, une servlet est une classe Java que Tomcat va utiliser. Je vous invite donc crer une nouvelle classe Java dans le dossier WEB-INF/src de votre projet Tomcat :

Fates un clic droit sur ce dossier dans Eclipse et choisissez " new > Class ", nommez-la DoIt dans le package com.servlet.test , voyez ci-dessous :

www.siteduzero.com

Partie 1 : Prologue : les bases

32/158

V ous vous retrouvez avec une classe ayant un code minimal. Je vous informe maintenant qu'une servlet digne de ce nom DOIT hriter d'une classe qui s'appelle HttpServlet, classe qui se trouve dans le package javax.servlet.http.HttpServlet . V ous vous retrouvez donc avec ce code : Code : Java package com.servlet.test; import javax.servlet.http.HttpServlet; public class DoIt extends HttpServlet{ }

Nous allons faire en sorte que notre servlet puisse tre appele la place de notre fichier index.html partir de maintenant, je vous demande de bien vouloir me faire confiance et de partir du principe que la lumire sera faite sur ce qui va suivre. V ous allez complter le code de votre servlet comme ceci : Code : Java package com.servlet.test; import java.io.IOException; import java.io.PrintWriter; import import import import javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

public class DoIt extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<h1>Coucou toi !</h1>");

www.siteduzero.com

Partie 1 : Prologue : les bases

33/158

Ne prenez pas peur cause de tous ces imports...

Maintenant, nous allons crer un fichier xml qui WEB-INF de votre projet, comme ceci :

DOIT s'appeler web.xml et que vous crerez dans le dossier

Pour faire ceci, faites un clic droit sur le dossier WEB-INF, choisissez new > XML Document et appelez-le web.xml. V ous allez poursuivre en y ajoutant ce contenu : Code : XML <web-app> <servlet> <servlet-class>com.servlet.test.DoIt</servlet-class> <servlet-name>firstServlet</servlet-name> </servlet> <servlet-mapping> <servlet-name>firstServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>

Faites-moi confiance... Maintenant, retournez sur la page d'administration de Tomcat, et sur votre page, vous devriez dornavant avoir ceci :

V ous venez de faire votre premire servlet fonctionnelle ! Maintenant, je peux vous expliquer ce que nous avons fait.

www.siteduzero.com

Partie 1 : Prologue : les bases

34/158

Expliquons tout a
V ous devez avoir 10 000 questions me poser et je compte bien y rpondre ! Tout d'abord, afin que vous compreniez mieux la faon dont tout ceci fonctionne, vous devez savoir pourquoi on appelle Tomcat un conteneur de servlet. V ous vous souvenez que le web fonctionne avec un systme de questions - rponses (requtes HTTP, rponses HTTP) et que, lorsque vous demandez une page web, vous envoyez une requte de type GET. Les Zros se souvenant de ces points ont trs certainement remarqu que la mthode dclare dans notre servlet contient le nom du type de requte envoye : requte de type GET - mthode doGet . Un autre point troublant : la mthode doGet de notre servlet prend deux objets en paramtres et ceux-ci ont des noms qui ressemblent beaucoup requte HTTP et rponse HTTP ! Est-ce que a veut dire que notre servlet reoit la requte HTTP et retourne la rponse HTTP ?

V ous y tes presque... En fait, ce n'est pas la servlet qui reoit tout ceci directement : c'est Tomcat ! C'est le conteneur de servlets qui reoit et envoie les requtes HTTP... Ds que ce dernier reoit une requte, il instancie deux objets : un objet HttpServletRequest contenant les informations de la requte HTTP ; un objet HttpServletResponse, servant fournir la rponse attendue. Une fois ceci fait, il va utiliser la servlet correspondant la requte demande et va invoquer la mthode adquate, ici doGet(HttpServletRequest request, HttpServletResponse response) ! La mthode adquate ? Tu veux dire qu'il peux y avoir plusieurs mthodes dans une servlet ?

V ous avez vu juste ! Pour faire court, il y existe une mthode pour chaque type de requte HTTP : GET : mthode doGet() , c' est la mthode la plus courante pour demander une ressource. Une requte GET est sans effet sur la ressource, il doit tre possible de rpter la requte sans effet ; POST : mthode doPost() , cette mthode doit tre utilise lorsqu'une requte modifie la ressource ; HEAD : mthode doHead() , cette mthode ne demande que des informations sur la ressource, sans demander la ressource elle-mme ; OPTIONS : mthode doOptions() , cette mthode permet d'obtenir les options de communication d'une ressource ou du serveur en gnral ; CONNECT : mthode doConnect() , cette mthode permet d'utiliser un proxy comme un tunnel de communication ; TRACE : mthode doTrace() , cette mthode demande au serveur de retourner ce qu'il a reu, dans le but de tester et d'effectuer un diagnostic sur la connexion ; PUT : mthode doPut() , cette mthode permet d'ajouter une ressource sur le serveur ; DELETE : mthode doDelete() , cette mthode permet de supprimer une ressource du serveur. Je n'ai pas invent ces dfinitions, celles-ci sont tires de Wikipdia... Pas de panique, dans 99.99999999 % des cas, vous utiliserez des requtes de type GET ou POST !

Attends deux minutes ! Quand doit-on utiliser tel ou tel type de requte ?

Nous reviendrons sur ce point trs bientt. Pour le moment, essayez de comprendre comment fonctionne Tomcat lorsqu'il reoit des requtes HTTP. Reprenons. Dans les grandes lignes, Tomcat reoit une requte HTTP d'un certain type, il utilise un objet requte et un objet rponse, il instancie la servlet correspondante la requte et invoque la mthode adquate. Le contenu de ladite mthode est excut, Tomcat rcupre les objets et nous retourne la rponse HTTP ! V oici un schma rcapitulatif :

www.siteduzero.com

Partie 1 : Prologue : les bases

35/158

Ensuite, le contenu de la servlet est trs simple : response.setContentType("text/html") : dfinit le type de rponse, ici, on retourne une page HTML ; PrintWriter out = response.getWriter() : on rcupre un objet permettant d'crire dans la future page HTML ; out.println("....") : crit dans la page.

Les plus observateurs d'entre vous ont d remarquer qu'une servlet n'a pas de constructeur ! Ne vous alarmez pas sur ce point pour le moment, nous aurons l'occasion d'y revenir. D'accord, on a compris. Par contre, comment Tomcat sait quelle servlet instancier ?

Avec le dernier point claircir pour le moment : le fichier web.xml . V ous avez compris ce qu'il se passe lorsque une requte HTTP est reue par Tomcat. Avant tout ceci, il se passe quelque chose de vital : le mapping des servlets ! Au lancement du serveur Tomcat, vous pouvez voir tout plein de choses incomprhensibles dans la console d'Eclipse, en voici une partie :

Et quelque part dans tout ce charabia, il y a ceci :

www.siteduzero.com

Partie 1 : Prologue : les bases

36/158

Ici on voit qu'une chose obscure nomme " contexte" a t initialise ! Ceci est tout simplement une sorte d'annuaire pour Tomcat : la dfinition des applications sur le serveur ainsi que la structure de celles-ci.

Une question de contexte


Chaque application sur le serveur a une structure et cette structure est dfinie dans le fichier web.xml. Ce fichier est utilis par Tomcat pour faire une relation entre une requte HTTP et une servlet. On dit aussi que le fichier sert dfinir le contexte de votre application. Un seul fichier web.xml par application !

V ous avez d avoir peur de ce fichier, mais il n'y a pas de quoi, je vous assure... Nous allons voir comment ce fichier est construit et quoi correspond tout ceci... Tout d'abord, vous avez srement vu que le contenu est englob par une balise : Code : XML <web-app> ... ... ... </web-app>

Cet encadrement, bien qu'incomplet, est Incomplet ?

OBLIGATOIRE.

Oui, il manque des informations cette balise, mais nous les ajouterons plus tard. Le but tant toujours de comprendre le fonctionnement de Tomcat. Donc, tout fichier web.xml doit tre dfini de la sorte ! Ensuite, nous trouvons deux lments de mme rang : par l, entendez balises xml se suivant et tant non imbriques. V oici un schma :

Chaque couleur correspond un niveau dans le fichier xml.

www.siteduzero.com

Partie 1 : Prologue : les bases

37/158

V ous m'avez compis, les lments de mme rang sont <servlet></servlet> et <servlet-mapping></servletmapping> . Dans ces lments, nous allons dfinir les noms de notre servlet ! Tu veux dire que notre servlet a plusieurs noms ?

Tout fait. En fait, notre servlet a : son nom, le nom de la classe complet avec le package ; un nom de mappage interne l'application, nom que la servlet porte dans l'application ; nom de la servlet pour le client.

La servlet est tout d'abord dfinie dans l'application via l'lment <servlet></servlet> . Nous trouvons deux lments dans ce dernier : <servlet-class></servlet-class> : code rel de la servlet ; <servlet-name></servlet-name> : nom interne l'application.

Ensuite, nous trouvons <servlet-mapping></servlet-mapping> contenant les informations de paramtrage client : <servlet-name></servlet-name> : nom interne l'application ; <url-pattern></url-pattern> : nom qui apparat ct client.

V oici un petit rcapitulatif de ce qu'il se passe. 1/ Tomcat, son lancement, prend connaissance des donnes mentionnes dans le fichier de configuration. 2/ Il reoit une requte HTTP demandant "/", dans notre cas bien sr. 3/ Il sait que ce nom est associ au nom de servlet "FirstServlet" qui, lui, correspond la servlet com.servlet.test.DoIt . 4/ Celle-ci est instancie et la mthode adquate est invoque. 5/ La rponse est rcupre par Tomcat qui renvoie cette dernire au client.

Un petit schma (les instanciations des objets requtes et rponses sont tacites) :

www.siteduzero.com

Partie 1 : Prologue : les bases


Pourquoi avoir autant de noms pour une servlet ?

38/158

Tout simplement pour faciliter les changements ventuels. Une chose importante savoir : une servlet peut tre utilise pour faire plusieurs choses... Nous allons y venir. Imaginez que vous appeliez votre servlet depuis une vingtaine de pages et que vous utilisiez le nom rel de votre servlet... Dj, les utilisateurs connatront la hirarchie de vos classes, et tous ceux qui ont dj fait des sites web savent qu'il vaut mieux que le client en sache le moins possible. Ensuite, si vous avez chang le nom de votre servlet, vous allez avoir 20 pages reprendre une par une pour faire les changement alors que l, tout est automatique ! V ous pouvez changer le nom de votre servlet, ce n'est pas grave puisque nous utilisons un autre nom. V ous avez appris beaucoup de choses dans ce chapitre. Le temps est venu de faire une pause et d'aller faire un tour sur le QCM... V otre premire servlet est au point maintenant et vous tes toujours en vie ! Mais ne vous leurrez pas, on ne s'arrte pas l. La plateforme JEE offre bien d'autres outils utiliser. De plus, je vous avais dit, au dbut de ce tutoriel, que les servlets fonctionnent avec ce qu'on appelle des JSP. Si vous voulez savoir ce qu'il en est, rendez-vous au chapitre suivant !

www.siteduzero.com

Partie 1 : Prologue : les bases

39/158

Grer l'affichage
Dans le prcdent chapitre nous avons russi faire notre premire servlet ! Les Zros qui ont l'habitude de faire des pages web se sont vite rendu compte que, si nous poursuivons dans cette voie, les choses seront loin d'tre simples... En effet, dans le langage HTML, le caractre sert TRS SOUVENT ! Or en Java aussi, donc si vos balises HTML ne sont pas "nature" sans CSS, voici ce que a pourrait donner : Code : Java out.println("<html>"); out.println("<body onLoad=\"alert('bonjour');\">"); out.println("<p style=\"color:red\" id=\"monId\" onClick=\"alert('toto');\">"); out.println("Pas facile lire tout a..."); out.println("</p>"); out.println("</body>"); out.println("</html>");

"

D'ailleurs, pour tre honnte, les servlets ne servent pas crire du code Java dans des pages web ! En fait, la plateforme JEE implmente le pattern MVC. Je vous invite trs vivement aller rejeter un coup d'oeil au tuto concern...

MVC et JEE
V oici le schma que je vous avais propos dans le chapitre sur MVC :

Avec la plate-forme JEE, vous allez devoir utiliser ce pattern. Disons qu'il est plus ou moins encapsul dedans ! Bon, si nous avons utiliser ce pattern, quoi correspond la servlet que nous venons de raliser ?

Rflchissez un peu... Dans le pattern MVC, il y a un objet qui a pour rle de rcuprer des demandes, de les traiter et de retourner ce qu'on lui a demand : le contrleur !

www.siteduzero.com

Partie 1 : Prologue : les bases

40/158

En effet, nous avons fait en sorte que notre servlet crive elle-mme du code HTML, mais dans la plupart des cas, les servlets ont pour rle de rcuprer les requtes client et d'agir en consquence. Attends : dans ce cas, que sont le modle et la vue du pattern MVC ?

Le modle peut tre divers et vari, comme tout modle digne de ce nom : un objet Java basique ; un objet Java devant faire appel une base de donnes ; ...

La vue, elle, reste une page web contenant du code HTML, la diffrence prs que celle-ci contiendra aussi du code Java : on appelle ces pages web des

J ava Server Pages, ou JSP pour les intimes !

Donc, si nous appliquons le pattern MVC l'architecture JEE, a nous donne :

V ous remarquerez srement que des flches de dpendance ont disparu ! En effet, vous allez voir que la vue est appele par le contrleur et reoit les informations du modle via ce dernier. Je vous propose maintenant de voir quoi ressemble une page JSP et comment la lier notre servlet...

V comme JSP
Comme vous le savez dj, une JSP est une page web contenant du code Java. Le dit code est introduit dans des pages web via des balises spcifiques <% %> ; ensuite, tout ce que vous mettrez l'intrieur est du pur code Java, voici un exemple : Code : JSP <html> <body> <% out.println("<h1>Une JSP !</h1>"); %> </body> </html>

www.siteduzero.com

Partie 1 : Prologue : les bases


Nous allons d'ailleurs l'ajouter dans notre projet ! Pour ce faire, il vous suffit de faire un clic droit sur votre projet et de choisir " new/other/web/JSP".

41/158

Appelez-la " firstJsp". V otre JSP se trouve donc la racine du projet : ct du fichier index.html pour ceux qui auraient continu de travailler sur le mme projet Tomcat.

Eclipse vous gnre du code, beaucoup de code, toutes les enttes HTML en fait... pour notre test nous n'en avons pas besoin : effacez le contenu du fichier et remplacez-le par mon code (non mais ! ). Ensuite, vous connaissez la musique, rendez-vous dans l'administration de Tomcat, rentrez dans votre projet ! Pour accder votre JSP, il suffit de rajouter son nom dans la barre d'adresse de votre navigateur :

www.siteduzero.com

Partie 1 : Prologue : les bases

42/158

Ce qui vous donne ceci :

Flicitations, vous avez votre premire JSP ! Ici, nous avons affich un message, mais on peut faire plein d'autres choses dans une JSP... Utiliser des objets, faire des boucles... V oici notre JSP avec un peu plus de code : Code : JSP <html> <body> <% out.println("<h1>Une JSP !</h1>"); %> <p>Alors...</p> <% String[] list = new String[]{"Et de un", "Et de deux", "Et de trois"}; out.println("<ul>"); //On peut mme y mettre des commentaires... /* Mme des commentaires multilignes */ //Allons-y pour une boucle... for(String str : list) out.println("<li>" + str + "</li>"); out.println("</ul>"); %> </body> </html>

Ce qui nous donne :

Les commentaires sont ignors et n'apparaissent pas... Et encore heureux...

www.siteduzero.com

Partie 1 : Prologue : les bases

43/158

Maintenant, je vous propose de voir comment faire en sorte qu'une servlet puisse utiliser une JSP afin de la fournir au client. V ous allez voir, c'est simple comme tout... Pour ce faire, nous allons crer une nouvelle servlet que nous appellerons InvokeJsp, toujours dans le package com.servlet.test , dont voici le contenu : Code : Java package com.servlet.test; import java.io.IOException; import import import import import javax.servlet.RequestDispatcher; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

public class InvokeJsp extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ RequestDispatcher dispatch = request.getRequestDispatcher("firstJsp.jsp"); dispatch.forward(request, response); } }

Il vous faut ensuite modifier le fichier web.xml comme ceci : Code : XML <web-app> <servlet> <servlet-class>com.servlet.test.DoIt</servlet-class> <servlet-name>firstServlet</servlet-name> </servlet> <servlet> <servlet-class>com.servlet.test.InvokeJsp</servlet-class> <servlet-name>invoke</servlet-name> </servlet> <servlet-mapping> <servlet-name>firstServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>invoke</servlet-name> <url-pattern>/invoke</url-pattern> </servlet-mapping> </web-app>

Nous avons conserv la configuration de notre premire servlet et nous avons ajout la configuration pour la seconde. V ous devez remarquer l'ordre de la dclaration : le fichier commence par dfinir tous les noms internes de nos servlets (1) et ensuite tous les chemins (2) pour y accder de l'extrieur :

www.siteduzero.com

Partie 1 : Prologue : les bases

44/158

V ous devez savoir une chose importante concernant Tomcat et le fichier web.xml . Si vous n'avez pas opt pour la solution d'utiliser le dossier webapps/ comme workspace, vous serez obligs de redmarrer Tomcat afin qu'il puisse prendre en compte les modifications apportes au fichier web.xml ! Il va donc le relire et le tour sera jou...

Pour ceux qui ont opt pour la solution fournie, s'ils attendent quelques secondes aprs avoir modifi le fichier web.xml , un message identique celui-ci s'affichera :

Ce qui signifie que Tomcat a recharg le contexte de l'application Test ! V ous pouvez aller l'adresse suivante : localhost:8080/Test/invoke et vous aurez le contenu de votre JSP mais cette fois, celui-ci nous a t fourni par notre servlet InvokeJsp. V ous avez compris que ceci se faisait par le biais de ces deux lignes de code : Code : Java RequestDispatcher dispatch =

www.siteduzero.com

Partie 1 : Prologue : les bases


request.getRequestDispatcher("firstJsp.jsp"); dispatch.forward(request, response); //en contract : request.getRequestDispatcher("firstJsp.jsp").forward(request, response);

45/158

Ces lignes de codes signifient en gros que notre servlet, aprs avoir fait son travail (ici elle n'en fait aucun, mais bon...) confie le tout la page firstJsp.jsp. Cette page rcupre les objets passs en paramtre de la servlet, le code Java l'intrieur est interprt, ce qui gnre du code HTML. Au final, notre page JSP ne contiendra plus que du code HTML, elle est retourne Tomcat, qui nous la retourne ! Tu veux dire que nous pouvons utiliser les objets HttpServletRequest et HttpServletResponse dans nos pages JSP ? Oui, ainsi que tout autre objet Java ! Par contre, les deux objets cits ci-dessus mis part, ainsi que l'objet PrintWriter (out est un objet PrintWriter), un import sera ncessaire ! Je vous propose de modifier quelque peu votre JSP... Code : JSP <%@ page import="java.util.Enumeration, java.text.SimpleDateFormat, java.util.Date" %> <html> <body> <% out.println("<h1>Nous sommes le : " + new SimpleDateFormat("dd/MM/yyyy").format(new Date()) + "</h1>"); %> <h1>il est : <%=new SimpleDateFormat("HH:mm:ss").format(new Date()) %></h1> <% //Nous allons rcuprer les en-ttes Enumeration e = request.getHeaderNames(); while(e.hasMoreElements()){ String element = e.nextElement().toString(); out.println("<pre>" + element + " : " + request.getHeader(element) + "</pre>"); } %> </body> </html>

Si cette ligne de code, <%=new SimpleDateFormat("HH:mm:ss").format(new Date()) %> , vous turlupine, ne vous tracassez pas trop... L'objet SimpleDateFormat prend une chane de caractres ("HH:mm:ss") correspondant "Heures : Minutes : Secondes". On invoque ensuite la mthode format qui met en forme un objet Date : cette ligne de code nous retourne donc l'heure courante. Tandis que ce format de date : "dd/MM/yyyy" nous retourne la date courante. Rien ne vous empche de faire vos imports o vous le souhaitez dans la JSP. Personnellement, je prfre les avoir en haut de page, mais ce n'est qu'un avis personnel !

V ous pouvez tout aussi bien ne pas faire d'import, mais vous devrez spcifier le nom complet de l'objet utilis (avec le package !). Donc, partant de ce postulat, ce code : Code : JSP

www.siteduzero.com

Partie 1 : Prologue : les bases


<%@ page import="java.util.Enumeration, java.text.SimpleDateFormat, java.util.Date" %> <html> <body> <% out.println("<h1>Nous sommes le : " + new SimpleDateFormat("dd/MM/yyyy").format(new Date()) + "</h1>"); %> <h1>il est : <%=new SimpleDateFormat("HH:mm:ss").format(new Date()) %></h1> <% //Nous allons rcuprer les en-ttes Enumeration e = request.getHeaderNames(); while(e.hasMoreElements()){ String element = e.nextElement().toString(); out.println("<pre>" + element + " : " + request.getHeader(element) + "</pre>"); } %> </body> </html>

46/158

Nous donne le mme rsultat que ce code : Code : JSP <html> <body> <% out.println("<h1>Nous sommes le : " + new java.text.SimpleDateFormat("dd/MM/yyyy") .format(new java.util.Date()) + "</h1>"); %> <h1>il est : <%= new java.text.SimpleDateFormat("HH:mm:ss") .format(new java.util.Date()) %></h1> <% //Nous allons rcuprer les en-ttes java.util.Enumeration e = request.getHeaderNames(); while(e.hasMoreElements()){ String element = e.nextElement().toString(); out.println("<pre>" + element + " : " + request.getHeader(element) + "</pre>"); } %> </body> </html>

Qui, au final, vous donnera l'affichage :

www.siteduzero.com

Partie 1 : Prologue : les bases

47/158

V ous noterez la faon dont les imports sont faits avec les JSP : <%@ page import="package.Class, autrepackage.AutreClass, ..." %> : retenez bien ceci ! V ous aurez remarqu que j'ai utilis un raccourci pour crire des donnes dans la page : <%= "Une chane"%> . Ceci est quivalent <% out.println("Une chane");%> Par contre, avec ce raccourcis, vous ne DEVEZ PAS terminer votre instruction avec un ";" ! Ceci est correct : <%= "coucou" %> . Alors que ceci ne l'est pas : <%= "coucou" ; %> . Nous verrons pourquoi dans la partie II.

V oil : vous venez de voir comment faire en sorte qu'une servlet dlgue l'affichage une page JSP ! Il reste encore un point voir pour pouvoir utiliser MVC : le modle. Comme je vous l'avais dit plus haut, le modle peut tre divers et vari. Pour nous simplifier cet apprentissage, dans un premier temps, nous allons utiliser un simple objet Java, aussi appel POJO. Qu'attendons-nous ? Je vous le demande !

Le modle
V oici un simple objet nous retournant une couleur de faon alatoire. Ce dernier est plac dans le package com.servlet.test.model . Code : Java package com.servlet.test.model; public class ColorModel { private String[] colors = new String[]{"red", "green", "yellow", "purple", "pink", "silver", "orange"}; private String color; public ColorModel(){ this.color = colors[Double.valueOf(Math.random()*7).intValue()]; } public String getColor(){ return this.color; }

www.siteduzero.com

Partie 1 : Prologue : les bases


}

48/158

Nous allons utiliser ce dernier lorsque vous appellerez une page. Tomcat va utiliser la servlet que nous aurons paramtre, elle va utiliser cet objet, le passer une JSP qui sera interprte et renvoye ! Il ne nous reste plus qu' crer une servlet, une JSP et mettre jour le fichier web.xml ! Fastoche ! V oici notre servlet : Code : Java package com.servlet.test; import java.io.IOException; import import import import javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

import com.servlet.test.model.ColorModel; public class ColorServlet extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ request.setAttribute("colorString", new ColorModel().getColor()); request.getRequestDispatcher("colorJsp.jsp").forward(request, response); } }

V ous passez des attributs votre JSP grce la mthode setAttribute(String name, Object value); de l'objet HttpServletRequest ! Lorsque vous devrez utiliser ces attributs, c'est via le nom pass en premier paramtre de la mthode que vous les rcuprerez !

Notre JSP : Code : JSP <%@ page import="com.servlet.test.model.ColorModel" %> <html> <body> <h1 style="color:<%=request.getAttribute("colorString") %>"> Rcupration de l'attribut "<em>colorString</em>" </h1> </body> </html>

V ous voyez bien comment on rcupre les attributs passs notre JSP depuis la servlet : request.getAttribute(String attributeName); . Et notre fichier web.xml :

www.siteduzero.com

Partie 1 : Prologue : les bases


Code : XML <web-app> <servlet> <servlet-class>com.servlet.test.DoIt</servlet-class> <servlet-name>firstServlet</servlet-name> </servlet> <servlet> <servlet-class>com.servlet.test.InvokeJsp</servlet-class> <servlet-name>invoke</servlet-name> </servlet> <servlet> <servlet-class>com.servlet.test.ColorServlet</servlet-class> <servlet-name>color</servlet-name> </servlet> <servlet-mapping> <servlet-name>firstServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>invoke</servlet-name> <url-pattern>/invoke</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>color</servlet-name> <url-pattern>/color</url-pattern> </servlet-mapping> </web-app>

49/158

V ous savez ce qu'il vous reste faire si vous voulez allez voir ce que a donne... V oici deux-trois screens de ce que j'ai pu obtenir :

Screen 1 :

Screen 2 :

V ous avez russit passer une chane de caractres en paramtre votre JSP depuis une servlet. Mais vous devez savoir que vous pouvez aussi passer des objets ! Ce que nous allons faire, c'est tout simplement garder notre exemple mais, en plus, passer un objet color et invoquer la mthode getColor() dans notre JSP. V oici le code de notre servlet : Code : Java

www.siteduzero.com

Partie 1 : Prologue : les bases

50/158

package com.servlet.test; import java.io.IOException; import import import import javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

import com.servlet.test.model.ColorModel; public class ColorServlet extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ request.setAttribute("colorObject", new ColorModel()); request.setAttribute("colorString", new ColorModel().getColor()); request.getRequestDispatcher("colorJsp.jsp").forward(request, response); } }

Et le nouveau code de notre JSP : Code : JSP <%@ page import="com.servlet.test.model.ColorModel" %> <html> <body> <h1 style="color:<%=((ColorModel)request.getAttribute("colorObject")).getColor() %>"> Rcupration de l'objet "<em>ColorModel</em>" </h1> <h1 style="color:<%=request.getAttribute("colorString") %>"> Rcupration de l'attribut "<em>colorString</em>" </h1> </body> </html>

Lorsque vous passez des objets en paramtre, la mthode getAttribute(String name) retourne un type Object : pensez caster vos attributs !

V oici ce que j'ai obtenu :

Screen 1 :

www.siteduzero.com

Partie 1 : Prologue : les bases

51/158

Screen 2 :

V ous l'aurez compris, vous pouvez passer les objets que vous souhaitez vos JSP. Celles-ci s'occuperont de l'affichage des donnes reues du contrleur via le modle ! V ous devez trouver a beaucoup plus plus clair... Quelle bouffe d'oxygne, ces JSP... Je ne vous le dirai jamais assez, mais entre chaque chapitre, pratiquez, pratiquez et pratiquez ! C'est comme ceci que les choses rentrent le mieux. En attendant, je vous attends au prochain chapitre. Attends une seconde ! Tu ne nous a toujours pas expliqu comment les servlets sont gres par Tomcat !

Je vois que vous tes avides de savoir. J'allais justement y venir, mais avant, vous avez encore une petite chose voir.

www.siteduzero.com

Partie 1 : Prologue : les bases

52/158

Utiliser des formulaires


Nous avons russi utiliser les trois composantes de la plateforme JEE : Modle : objets Java ; V ue : pages JSP ; Contrleur : nos servlets.

Il reste encore un point aborder avant de clore cette partie sur les notions de base : les formulaires ! Nous allons donc voir comment ceux-ci sont utiliss et comment rcuprer des informations saisies dans l'un d'eux.

Rappel
Je pense qu'un petit rappel s'impose, tout du moins sur le fonctionnement de ces chers formulaires ! Tout d'abord, dans des formulaires web, vous pouvez trouver plusieurs sortes de champs. Des champs de texte : <input type="text" name="nom" /> Des boutons (de type button ou submit) : <input type="button" name="nom" value="Valider" /> Des champs cachs : <input type="hidden" name="nom" value="je suis cach..." /> Des champs de mot de passe : <input type="password" name="nom" value="je suis cach..." /> Des cases cocher : <input type="checkbox" name="nom" value="OUI" /> <input type="checkbox" name="nom2" value="NON" /> Des boutons radio : <input type="radio" name="nom" value="OUI" /> <input type="radio" name="nom" value="NON" /> Des liste simples ou multiples : <select name="nom"> <option value="1">Choisissez</option> </select> Des zones de texte : <textarea name="nom"> Du texte </textarea>

Tous ces champs sont porteurs d'informations qui sont transmises vers une page web via un formulaire. Un formulaire, en HTML, c'est tout simplement ceci : Code : HTML <form name="formulaire" action="/traitement" method="post"> <!-- Diffrents champs de formulaires --> </form>

Ici, nous avons un formulaire : qui s'appelle " formulaire" ; qui envoie les donnes des champs vers la page " /traitement " ; et qui envoie ces informations via une requte de type " post ".

quoi sert tout ceci ?

Le nom du formulaire sert surtout en Javascript lorsque vous voulez vrifier les donnes de celui-ci... Les autres servent pour la communication avec le serveur : l'attribut action permet au navigateur de savoir vers quelle page envoyer les donnes ; l'attribut method , lui, permet de savoir comment on envoie les donnes.

www.siteduzero.com

Partie 1 : Prologue : les bases

53/158

Nous aborderons l'attribut action dans la sous-partie suivante ; pour le moment, nous allons nous atteler l'attribut method . V ous savez dj que, par dfaut, les informations entre pages web sont communiques en GET ; eh bien, pour les formulaires, c'est pareil : par dfaut, les informations envoyes via un formulaire sont envoys en GET ! J'ai fait un formulaire :

Son code source est le suivant : Code : JSP <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Insert title here</title> </head> <body> <form name="firstForm" action="firstFormAction.do" style="width:50%;margin:auto;background-color:#c1d9fc;paddingbottom:15px;"> <h2 style="text-align:center;color:white;backgroundcolor:#6683b1;">Formulaire HTML</h2> <p style="text-align:center;">Nom : <input type="text" name="nom" /></p> <p style="text-align:center;">Prnom : <input type="text" name="prenom" /></p> <p style="text-align:center;width:50%;margin:auto;"><input type="submit" name="Valider" value="Valider"/></p> </form> </body> </html>

La page qui reoit les informations ressemble a :

www.siteduzero.com

Partie 1 : Prologue : les bases

54/158

Nous verrons le code source de la page recevant les informations trs bientt... En fait, dans le sous-chapitre qui suit... Mais, pour le moment, le sujet n'est pas l ! Ce formulaire n'a pas de mthode de transit d'informations dclare, donc, les donnes passent en GET et en voici la preuve :

Et voici les en-ttes HTTP correspondantes la requte envoye :

V ous pouvez clairement voir que les donnes sont directement visibles dans l'URL du navigateur ainsi que dans l'URL de la requte HTTP... Par contre, voici ce que j'ai obtenu avec le mme formulaire ayant l'attribut method clairement renseign avec post :

www.siteduzero.com

Partie 1 : Prologue : les bases

55/158

Les donnes ont bien transit mais elles n'apparaissent plus dans l'URL du navigateur ni dans l'URL de la requte HTTP ! Ceci est la principale diffrence entre les requtes HTTP de type GET et celles de type POST, mais il en existe deux autres. La taille maximale d'une URL est d'environ 2 000 caractres ! Alors qu'elle est quasiment illimite avec une requte de type POST ! Par contre, avec une requte de type POST, lorsque vous tes sur la page ayant reue les informations, si vous rechargez la dite page avec F5 ou CTRL + F5, le navigateur vous demandera si vous souhaitez renvoyer les donnes ! Ceci peut engendrer des erreurs de taille : dupliquer des donnes par exemple... Donc, pour simplifier, si votre formulaire est destin faire de l'affichage, vous pouvez utiliser des requtes de type GET. Par contre, si votre formulaire est utilis afin de renseigner des champs vitaux pour l'application, mieux vaut utiliser les requtes de type POST : les utilisateurs ne voient pas le nom de vos champs, ni la valeur de ceux-ci et, en plus, la taille est quasiment illimite. Mais faites attention la rexpdition des donnes ! Et pour l'attribut " action " ? Il a aussi une valeur par dfaut ?

Oui ! Par dfaut, si vous ne renseignez pas cet attribut, les donnes de cette page seront envoyes elle-mme !

Les sources de notre formulaire


Les Zros les plus hardis auront dj devin que j'ai utilis le couple servlet - JSP pour afficher le formulaire et pour afficher les donnes de celui-ci. V oici les codes source de mon couple d'affichage de formulaires : Secret (cliquez pour afficher)

forms.jsp
Code : JSP

www.siteduzero.com

Partie 1 : Prologue : les bases


<%@ page language="java" contentType="text/html; charset=ISO-88591" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Insert title here</title> </head> <body> <form name="firstForm" action="firstFormAction.do" method="post" style="width:50%;margin:auto;background-color:#c1d9fc;paddingbottom:15px;"> <h2 style="text-align:center;color:white;backgroundcolor:#6683b1;">Formulaire HTML</h2> <p style="text-align:center;">Nom : <input type="text" name="nom" /></p> <p style="text-align:center;">Prenom : <input type="text" name="prenom" /></p> <p style="text-align:center;width:50%;margin:auto;"><input type="submit" name="Valider" /></p> </form> </body> </html>

56/158

Formulaire1.java
Code : Java package com.servlet.test; import java.io.IOException; import import import import javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

public class Formulaire1 extends HttpServlet { public void doGet( HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ request.getRequestDispatcher("forms.jsp").forward(request, response); } }

Et le code source des pages d'affichage des donnes de formulaire :

www.siteduzero.com

Partie 1 : Prologue : les bases


Secret (cliquez pour afficher)

57/158

formResult.jsp
Code : JSP <%@ page language="java" contentType="text/html; charset=ISO-88591" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Insert title here</title> </head> <body> <div style="width:50%;margin:auto;text-align:center;"> <p>Vous avez saisi : </p> <ul> <li>Nom : <%=request.getParameter("nom").toUpperCase() %></li> <li>Prnom : <%=request.getParameter("prenom").toUpperCase() %></li> </ul> <p>Pour retourner au formulaire, c'est <a href="form">par ici</a></p> </div> </body> </html>

FormulaireAction .java
Code : Java package com.servlet.test; import java.io.IOException; import import import import javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

public class FormulaireAction extends HttpServlet { public void doGet( HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ request.getRequestDispatcher("formResult.jsp").forward(request, response); } public void doPost( HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ doGet(request, response);

www.siteduzero.com

Partie 1 : Prologue : les bases


} }

58/158

web.xml
Code : XML <web-app> ... <servlet> <servlet-class>com.servlet.test.Formulaire1</servlet-class> <servlet-name>FirstForm</servlet-name> </servlet> <servlet> <servlet-class>com.servlet.test.FormulaireAction</servlet-class> <servlet-name>FormAction</servlet-name> </servlet>

... <servlet-mapping> <servlet-name>FirstForm</servlet-name> <url-pattern>/form</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>FormAction</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>

Bon, vous avez vu que je n'ai fait que de l'affichage, aucun contrle dans nos servlets, juste une dlgation de l'affichage : donc, vous savez faire. Euh, attends une seconde, c'est quoi a : <form name="firstForm" action="firstFormAction.do"...> ? Qu'est-ce que c'est que cette extension de fichier ? Je vois que vous avez un oeil de lynx... Moi qui voulait luder la question ! V ous avez donc aussi remarqu ceci : Code : XML <servlet> <servlet-class>com.servlet.test.FormulaireAction</servlet-class> <servlet-name>FormAction</servlet-name> </servlet> ... <servlet-mapping> <servlet-name>FormAction</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>

www.siteduzero.com

Partie 1 : Prologue : les bases


</web-app>

59/158

En fait, ce genre de nom fait aussi partie de la convention de nommage JEE. On appelle ce genre de noms des noms logiques. Comme la plupart des liens que vous trouverez dans les codes source de vos JSP, ce sont des noms totalement fictifs. Ils sont mapps au mme titre que les autres type de liens, dans le fichier web.xml ! La convention Java nous dit que pour les pages web faisant des traitements, il est prfrable d'utiliser des noms portant l'extension " .do " : comme a, un dveloppeur passant par l saura de suite qu'il s'agit d'une page de traitement ! Ensuite, vous avez sans doute remarqu que le mappage dans le fichier web.xml tait un peu particulier pour le nom logique. C'est juste que l, le mappage dit que la servlet ayant pour nom " FormAction " est charge de traiter TOUTES les requtes ayant un nom se terminant par ".do " Sinon, rien de sorcier, mis part le fait que les donnes que le serveur reoit sont dans l'objet HttpServletRequest. Ce que j'ai fait aussi. Dans la servlet qui se charge de rcuprer les donnes du formulaire, j'ai redfini deux mthodes : doGet(HttpServletRequest request, HttpServletResponse response) ; doPost(HttpServletRequest request, HttpServletResponse response).

La mthode doGet() est dfinie pour dlguer l'affichage une JSP et la mthode doPost() invoque la mthode doGet() . Comme a, la boucle est boucle... Ensuite, dans notre page JSP, nous affichons les donnes reues grce l'objet request (objet faisant partie des objets n'ayant pas besoin d'import dans les JSP... Idem pour response)... Nous utilisons la mthode <p>Nom : <%= request.getParameter("nom")%></p> afin de rcuprer la donne.

Rajoutons des champs


Code : JSP

Ce que je vous propose de voir maintenant, c'est ce que nous retournent les diffrents types de champs de formulaire HTML. Pour ce faire, nous allons toffer un peu notre formulaire. V oici le nouveau code source du formulaire de tout l'heure :

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Insert title here</title> </head> <body> <form name="firstForm" action="firstFormAction.do" method="post" style="width:50%;margin:auto;backgroundcolor:#c1d9fc;padding-bottom:15px;"> <div style="text-align:center;"> <h2 style="color:white;background-color:#6683b1;">Formulaire HTML</h2> <p>Nom : <input type="text" name="nom" /></p> <p>Prenom : <input type="text" name="prenom" /></p> <p>Sexe : <input type="radio" name="sexe" value="Masculin" />Masculin <input type="radio" name="sexe" value="Fminin" />Fminin</p> <p>Couleur de vos yeux : <select name="yeux"> <option value="Bleu">Bleu</option> <option value="Marron">Marron</option> <option value="Vert">Vert</option> </select> </p>

www.siteduzero.com

Partie 1 : Prologue : les bases


<p>Vous programmez en :<br > <input type="checkbox" name="C" />En C <input type="checkbox" name="C++" />En C++ <input type="checkbox" name="Java" />En Java <input type="checkbox" name=".NET" />En .NET <input type="checkbox" name="PHP" />En PHP </p> <p style="width:50%;margin:auto;"><input type="submit" name="Valider" value="Valider"/></p> </div> </form> </body> </html>

60/158

Nous allons galement modifier l'affichage des donnes. Pour ne pas trop alourdir le tout, nous nous contenterons d'afficher les donnes du formulaire via notre servlet : Code : Java package com.servlet.test; import import import import import import import import import java.io.IOException; java.io.PrintWriter; java.util.ArrayList; java.util.Enumeration; java.util.List; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

public class FormulaireAction extends HttpServlet { public void doGet( HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType("text/html"); PrintWriter out = response.getWriter(); //On rcupre la liste des noms de paramtres Enumeration<String> e = request.getParameterNames(); List<String> prog = new ArrayList<String>(); //On parcours cette liste while(e.hasMoreElements()){ String key = e.nextElement(); //On vrifie les valeurs des checkbox : 'on' signifie que la checkbox est coche if(request.getParameter(key).equals("on")){ prog.add(key); } else{ out.println("<p><strong>" + key + " : </strong>" + request.getParameter(key) + "</p>"); } } //Si nous avons au moins un langage de programmation if(prog.size() > 0) out.println("<p><strong>Je programme en : </strong>");

www.siteduzero.com

Partie 1 : Prologue : les bases


out.println("<ul>"); for(String str : prog) out.println("<li>" + str + "</li>"); out.println("</ul>"); //On n'utilise plus notre JSP... //request.getRequestDispatcher("formResult.jsp").forward(request, response); } public void doPost( HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ //Nous invoquons la mthode doGet avec les paramtres reu par la mthode doPost doGet(request, response); } }

61/158

Et le rsultat, sous vos yeux bahis :

Alors, vous avez vu que nous pouvions rcuprer les champs de nos formulaires dans nos servlets ainsi que dans nos JSP via l'objet HttpServletRequest. V ous aurez sans doute remarqu que tous les champs ne retournent pas leurs valeurs... Par exemple, les champs de type texte, les radio, les listes et les bouton retournent leurs valeurs ; par contre, les cases cocher ne retournent rien si elles ne sont pas coches et " on" dans le cas contraire ! On a cru remarquer que tu as utilis des liens HTML dans tes JSP. Ils ne sont pas un peu bizarres ? V ous avez russi voir a ? V ous tes en forme, aujourd'hui ! En effet, je me doutais que ceci allait piquer votre curiosit... J'ai bel et bien un lien sur ma page qui a l'air de pointer vers un endroit non mapp dans mon fichier web.xml ! Celui-ci : <a href="form">par ici</a> qui serait bien li cela : <url-pattern>/form</url-pattern> , mais un truc cloche ! Nous allons voir a tout de suite...

Tout est li
En fait, dites-vous bien qu'il y a deux endroits distincts pour accder des pages de notre application :

www.siteduzero.com

Partie 1 : Prologue : les bases


depuis le serveur ; depuis votre navigateur.

62/158

La diffrence entre ces deux acteurs est la suivante : ils n'interprtent pas les liens commenant par un " /" de la mme manire ! Pour le serveur, lorsque vous tes dans une application, le " /" signifie la racine de l'application tandis que pour le navigateur, cela signifie la racine du serveur !

Donc, pour faire un lien HTML pour faire en sorte que notre application puisse utiliser le mappage <urlpattern>/form</url-pattern> nous pouvons faire : soit a : <a href="form">par ici</a> aussi appel chemin relatif (car relatif l'application) ; soit a :<a href="/Test/form">par ici</a> aussi appel chemin absolu (car relatif au serveur) .

Il va de soit que "Test" est le nom de mon dossier contenant mon application.

Lequel utiliser alors ?

Rflchissez et regardez comment on utilise nos liens depuis le dbut pour accder nos pages. Que sert faire le fichier web.xml ? Rappelez-vous que, moins les utilisateurs en savent sur votre application, plus elle sera sre ! Nous devrions donc prfrer les liens relatifs ?

Tout fait ! Je crois que vous en avez assez vu pour le moment... Bon, ne me dites pas que ce chapitre tait compliqu, je ne vous croirais pas... Donc, tout ceux qui n'ont pas 100 % au QCM, je les flagelle !

www.siteduzero.com

Partie 1 : Prologue : les bases


Chapitre trs simple, en tous cas, pour ceux qui connaissaient dj le fonctionnement des formulaires web. Nous avons maintenant fait le tour des notions de base ncessaires au bon droulement du tuto. Cette partie est donc termine, mais avant de rellement clore cette dernire, un TP vous attend !

63/158

www.siteduzero.com

Partie 1 : Prologue : les bases

64/158

TP : la loterieZ
V ous voil rendus au premier TP de ce tuto. Il est assez simple, je vous rassure. Par contre, il mettra en oeuvre tout ce que vous aurez vu jusqu'ici, alors accrochez-vous bien !

Cahier des charges


Alors... La loterieZ est une loterie sous forme de page web que vous devrez coder ! Celle-ci vous demande de choisir deux chiffres DIFFRENTS dans deux listes de 1 10. Une fois ceci fait, vous devrez envoyer les informations au serveur (a sent bon les formulaires...). Une fois les informations reues, nous aurons un objet LoterieZ qui se charge de faire le tirage des numros, de voir si vous avez gagn (ou perdu) et qui retourne aussi les numros de ce tirage ! Par contre, vous devrez grer un message d'erreur si vous avez choisi deux fois le mme numro. Il serait de bon ton que vous leviez une exception de votre cru lors du contrle du tirage. Dans ce cas, vous utiliserez une page JSP diffrente de celle utiliser pour l'affichage normal. V oici un petit schma :

V ous avez carte blanche sur la faon de grer tout a... Mais je vais tout de mme vous fournir des copies d'cran... Histoire de vous diriger un peu.

Copies d'cran
V oici quelques copies d'cran de ce que j'ai pu obtenir.

Le formulaire

www.siteduzero.com

Partie 1 : Prologue : les bases

65/158

L'affichage en cas de victoire

L'affichage en cas de dfaite

La page d'erreur

www.siteduzero.com

Partie 1 : Prologue : les bases

66/158

Vu que je suis un vritable amour sur pattes, je vous fournis aussi un screenshot du contenu de ma classe LoterieZ :

V oil, les dernires recommandations ont t donnes, je n'ai plus qu' vous souhaiter bonne chance et bon courage ! Allez ! GGGGOOOOOO

Correction
Je me suis longtemps demand si je devais vous fournir une correction ou si je devais vous laisser chercher... Nan... Je plaisante. V ous avez bien cherch, j'espre. V ous ne vous ruez pas sur la correction comme a... Bon, voici les sources de mon projet : Secret (cliquez pour afficher)

Le modle
Classe IllegalGameException.java
Code : Java package com.sdz.model.exception; public class IllegalGameException extends Exception { public IllegalGameException(){ super("Vous avez choisi plusieurs fois le mme numro ! !"); } }

Classe LoterieZ.java
Code : Java package com.sdz.model;

www.siteduzero.com

Partie 1 : Prologue : les bases


import java.util.ArrayList; import com.sdz.model.exception.IllegalGameException; public class LoterieZ { /** * Liste des numros du tirage */ private ArrayList<Integer> listNumero = new ArrayList<Integer>(); /** * Constructeur */ public LoterieZ(){ for(int i=0; i < 2; i++){ int num = (int)(Math.random() * 10); while(listNumero.contains(num)){ num = (int)(Math.random() * 10); } listNumero.add(num); } } /** * Mthode qui permet de voir si on a gagn * @param val1 * @param val2 * @param val3 * @return * @throws IllegalGameException */ public boolean match(int val1, int val2) throws IllegalGameException{ if(val1 == val2 ) throw new IllegalGameException(); else{ return listNumero.contains(new Integer(val1)) && listNumero.contains(new Integer(val2)); } } /** * Mthode qui retourne la liste des numros du tirage * @return */ public ArrayList<Integer> getTirage(){ return this.listNumero; } }

67/158

Les vues
Fichier index.jsp
Code : JSP <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1">

www.siteduzero.com

Partie 1 : Prologue : les bases


<title>Insert title here</title> </head> <body style="width:50%; margin:auto;"> <h2 style="text-align:center;color:white;backgroundcolor:#787878">Bienvenue la loterieZ !</h2> <p style="text-align:center;border:1px dashed black; padding:5px;background-color:#efefef"> <span style="text-decoration:underline;font-style:italic;fontsize:1.1em"> Le but du jeu est simple : </span><br /> Vous devez choisir 3 numros diffrents dans les listes suivantes !<br /> Ensuite, vous n'avez plus qu' valider et voir si vous avez gagn...<br /> Bonne chance. :) </p> <form action="tirage.do" method="post" style="text-align:center"> <% //On gnre les champs. for(int i = 1; i < 3; i++){ out.println("Numro " + i + ": <select name=\"number"+i+"\">"); for(int j = 1; j <= 10; j++){ out.println("<option value=\""+j+"\">"+ j + "</option>"); } out.println("</select><br />"); } %> <br /> <input type="submit" value="Valider" /> </form> </body> </html>

68/158

Fichier show.jsp
Code : JSP <%@ page import="java.util.ArrayList" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Insert title here</title> </head> <body style="width:50%; margin:auto;"> <h2 style="text-align:center;color:white;backgroundcolor:blue;border:2px solid black"> Bienvenue au tirage de la loterieZ !<br /> Voici le tirage d'aujourd'hui : <br /> <span style="font-size:1.4em;"> <% //On rcupre les numros de la loterie et on les affiches ArrayList<Integer> list = (ArrayList<Integer>)request.getAttribute("tirage"); for(int i = 0; i < list.size();i++){ out.println(list.get(i)); if(i < list.size() -1 ) out.println(" - "); }

www.siteduzero.com

Partie 1 : Prologue : les bases


%> </span> </h2> <h2 style="text-align:center"> Vous aviez jou : <%=request.getAttribute("number1").toString() %> <%=request.getAttribute("number2").toString() %><br /> <%=request.getAttribute("message").toString() %> </h2> <h2 style="text-align:center"> Vous pouvez tenter nouveau votre chance en suivant <a href="home">ce lien</a> </h2>

69/158

</body> </html>

Fichier error.jsp
Code : JSP <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Insert title here</title> </head> <body style="width:50%; margin:auto;"> <h2 style="text-align:center;color:white;backgroundcolor:red;border:2px solid black"> Une erreur est survenue : <br /> <%=request.getAttribute("error").toString() %> </h2> <h2 style="text-align:center">Vous pouvez retenter votre chance en suivant <a href="home">ce lien</a></h2> </body> </html>

Les contrleurs
Servlet Index.java
Code : Java package com.sdz.control; import java.io.IOException; import javax.servlet.ServletException;

www.siteduzero.com

Partie 1 : Prologue : les bases


import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Index extends HttpServlet { public void doGet( HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ //Bon, l, c'est simple tout de mme... request.getRequestDispatcher("index.jsp").forward(request, response); } }

70/158

Servlet FormulaireAction.java
Code : Java package com.sdz.control; import java.io.IOException; import java.util.ArrayList; import import import import javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

import com.sdz.model.LoterieZ; import com.sdz.model.exception.IllegalGameException; public class FormulaireAction extends HttpServlet { public void doPost( HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ LoterieZ loto = new LoterieZ(); String message = ""; try { //On teste si le client a gagn ou non if(loto.match( Integer.parseInt(request.getParameter("number1")), Integer.parseInt(request.getParameter("number2")))){ message = "Flicitations, vous avez gagn ! ! ! "; } else{ message = "Quel dommage, vous avez perdu... "; } //On affecte des attributs notre JSP pour l'affichage request.setAttribute("message", message); request.setAttribute("number1", Integer.parseInt(request.getParameter("number1"))); request.setAttribute("number2", Integer.parseInt(request.getParameter("number2"))); request.setAttribute("tirage", loto.getTirage()); request.getRequestDispatcher("show.jsp").forward(request, response);

www.siteduzero.com

Partie 1 : Prologue : les bases


} catch (IllegalGameException e) { //Si le contrle lev une exception, on prend la JSP correspondante request.setAttribute("error", e.getMessage()); request.getRequestDispatcher("error.jsp").forward(request, response); } } }

71/158

Et le fichier web.xml
Code : XML <web-app> <servlet> <servlet-class>com.sdz.control.Index</servlet-class> <servlet-name>StartPage</servlet-name> </servlet> <servlet> <servlet-class>com.sdz.control.FormulaireAction</servlet-class> <servlet-name>FormAction</servlet-name> </servlet> <servlet-mapping> <servlet-name>StartPage</servlet-name> <url-pattern>/home</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>StartPage</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>FormAction</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>

V oil, vous avez toutes les informations pour comprendre ce code. Si vous avez du mal, je suis l, mais essayez d'abord de comprendre par vous-mmes, en relisant les chapitres par exemple. Car c'est comme a qu'on retient le mieux les choses ! Pour les Zros qui le souhaitent, je mets le contenu de mon application dans une archive. V ous pouvez la tlcharger ici ! Il ne vous restera plus qu' dcompresser celle-ci dans le dossier " webapps " de Tomcat et redmarrer celui-ci. V ous avez aim ce TP ? Quoi ? On a perdu des Zros dans la bataille ? Ouf ! C'tait une fausse alerte...

www.siteduzero.com

Partie 1 : Prologue : les bases


Bon, prenez bien le temps de digrer cette partie car la suite promet d'tre un chouilla plus complique... Bon, nous avons russi tant bien que mal poser les bases de la plateforme JEE.

72/158

V ous avez appris crer un projet, faire des servlets, combiner ces dernires avec des JSP tout en utilisant des objets mtiers ! Maintenant, vu que vous vous tes srement pos beaucoup de questions sur le fonctionnement de tout ceci, le moment est venu d'apporter quelques lments de rponses...

www.siteduzero.com

Partie 2 : Autour de nos servlets

73/158

Partie 2 : Autour de nos servlets


Dans la partie prcdente, nous avons fait un tour rapide de la plateforme JEE. Ceci dans le sens o nous avons cr une servlet lie une JSP tout en utilisant un objet mtier. Par contre, bon nombre de points doivent vous sembler obscurs. Ce que je vous propose dans cette partie n'est rien d'autre que de faire la lumire sur ce qu'il se passe dans notre conteneur et comment il gre nos servlets. Nous allons aussi voir diffrents points qui vous seront forts utiles comme les sessions, les cookies les filtres... V ous tes prt ? Alors allons-y !

Paramtres de servlets
Nous allons aborder un aspect bien pratique de nos chres servlets : les paramtres ! Nous allons voir que ceux-ci peuvent nous sauver la mise dans certains cas et nous vitent bien des tracas...

Paramtres d'initialisation
Imaginez que vous souhaitez attribuer un titre votre application et que celui-ci soit li vos servlets. Pour claircir la chose, vous savez qu'une page JSP est appele via une servlet : Comment feriez-vous pour affecter un titre diffrent votre JSP selon la servlet qui appellera cette JSP ?

Je suppose que la premire chose laquelle vous avez pens tait de mettre ce titre " en dur " dans le code de votre servlet... C'est--dire que ce nom est dfini et attribu votre page JSP dans une servlet ! Un peu comme ceci : Code : Java request.setAttribute("titre", "Titre de ma page");

Ou encore de dfinir une variable de classe initialise avec le titre... Ces mthodes fonctionnent trs bien, je vous rassure ! Par contre, il y a un autre moyen de faire ceci : en utilisant des paramtres d'initialisation de servlets . Les quoi ?

Les paramtres d'initialisation. C'est trs simple. Lorsque votre servlet vient la vie, vous pouvez lui dire qu'elle a, sa disposition, diffrents paramtres que vous lui aurez attribus ! Afin de vous montrer que nous pouvons initialiser plusieurs paramtres, je ne vais pas en crer un, mais deux ! Et comment tu fais a ?

Ceci se fait grce notre bon vieux fichier web.xml . Par exemple, pour affecter l'attribut " nomPage" ayant pour valeur " Nom de ma page" et un autre ayant pour nom " sousTitre" et comme valeur " Sous titre de la page" une servlet, vous n'avez qu' faire ceci : Code : XML <web-app> <servlet> <servlet-class>com.sdz.control.Index</servlet-class> <servlet-name>StartPage</servlet-name>

www.siteduzero.com

Partie 2 : Autour de nos servlets


<init-param> <param-name>titrePage</param-name> <param-value>Nom de la page</param-value> </init-param> <init-param> <param-name>sousTitre</param-name> <param-value>Sous titre de la page</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>StartPage</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>

74/158

C'est simple et clair ! La balise XML <servlet></servlet> encapsule autant de balises <init-param></initparam> qu'elle le souhaite (enfin, que vous le souhaitez... ). Comprenez bien que ces paramtres ne seront utilisables uniquement par la servlet concerne : ici, com.sdz.control.Index ! Et comment on les utilise ?

V oici la servlet lie au fichier web.xml sus-mentionn et qui utilise les paramtres : Code : Java package com.sdz.control; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import import import import import javax.servlet.ServletConfig; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

public class Index extends HttpServlet { public void doGet( HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ //Bon, l, c'est simple tout de mme... response.setContentType("text/html"); PrintWriter out = response.getWriter(); //La servlet a une mthode de rcupration des noms de ces paramtres Enumeration e = getInitParameterNames(); //On rcupre un objet de configuration de servlets ServletConfig conf = getServletConfig(); //Et on parcourt le tout while(e.hasMoreElements()){ String name = e.nextElement().toString(); //On appelle la mthode getInitParameter(String name) //afin de rcuprer la valeur

www.siteduzero.com

Partie 2 : Autour de nos servlets


out.println("<p><strong>" + name + " = " + conf.getInitParameter(name) + "</strong></p>"); } //Vous pouviez aussi y accder comme ceci //out.println(getServletConfig().getInitParameter("titrePage")); //out.println(getServletConfig().getInitParameter("sousTitre")); } }

75/158

Ce qui nous donne :

C'est trs simple d'utilisation et trs utile ! Bon, nous avons utilis une faon de faire un peu plus gnrique puisque nous avons rcupr tous les noms de paramtres afin de tous les afficher... Nous avons rcupr la liste des noms de paramtres grce l'instruction Enumeration e = getInitParameterNames(); puis nous avons affich le contenu des diffrents paramtres en les invoquant via cette instruction : getInitParameter(name); de l'objet ServletConfig. C'est sr, mais qu'est-ce que c'est que cet objet : ServletConfig ?

Dites-vous que votre conteneur, Tomcat, est trs sympa et qu'au moment de crer votre servlet, il cre un objet contenant tous les paramtres d'initialisation ! Et cet objet est le suivant :

Cet objet n'a pas beaucoup de mthodes, mais vous pouvez deviner ce que celles-ci font... Dis donc, la mthode getInitParameterNames() , tu n'as pas utilis cet objet pour l'invoquer tout l'heure ?

V otre sens de l'observation s'est grandement amlior depuis le dbut de ce tuto, ou c'est moi... En fait, dans nos servlets, il y a une mthode qui s'appelle ainsi et qui a le mme rle que la mthode de l'objet en question, et pour cause : la mthode prsente dans notre servlet invoque la mthode de l'objet ServletConfig... Par contre, que fait la mthode getServletContext() ?

Nous allons aborder ceci tout de suite... Par contre, mme si vous tes d'accord sur l'utilit de ces paramtres d'initialisation, imaginez un instant le cas contraire ce que je vous demandais plus haut : imaginez que vous ayez besoin d'un titre d'application commun chaque page ! Comment procderiez-vous ? O mettre ce titre ? Dans toutes nos servlets ? Dans toutes nos JSP ?

www.siteduzero.com

Partie 2 : Autour de nos servlets

76/158

Je vous laisse rflchir sur la marche suivre quelques instants avant de vous donner une rponse, mais ceci a un rapport avec le fameux objet ServletContext.

Tout dpend du contexte...


V oil un mot qui vous avait chatouills lors d'un prcdent chapitre... En fait, c'tait lorsque je vous avais expliqu quoi servait le fichier web.xml . Comme je vous le disais alors, ce fichier permet de dfinir le contexte de l'application ! V oyez un peu a comme l'environnement de l'application : ce dont l'application a besoin pour travailler. V ous savez dj que c'est grce ce contexte que le conteneur sait faire fonctionner l'application, mais ce que vous ignorez, c'est que vous pouvez aussi dfinir des paramtres ce contexte. Ah oui ?

En plus, a se fait quasiment comme la dclaration de paramtres pour une servlet, quelques diffrences prs. V ous l'aurez devin, a se passe encore dans le fichier web.xml ... Mais concrtement, en quoi cela va rpondre notre besoin concernant un titre commun chaque page ?

Hi hi ! C'est l que la magie s'opre : les paramtres de contexte sont globaux toute l'application ! Comprenez ceci dans le sens o tous ces paramtres seront accessibles toutes nos servlets ! Tout comme les paramtres d'initialisation de servlets, le conteneur va crer un objet, mais cette fois, il s'agira d'un objet ServletContext qui sera partag par toutes nos servlets ! La mthode getServletContext() de l'objet ServletConfig nous retourne donc cet objet ?

Tout fait ! Mais comme les concepteurs de la technologie JEE sont des gens super gentils, ils ont fait en sorte que nos servlets puissent invoquer une mthode getServletContext() sans passer par l'objet ServletConfig. V oyez a comme un raccourci au mme titre que la mthode getServletConfig() ! Bon, assez de blabla, voici comment on dclare des paramtres pour toute notre application : Code : XML <web-app> <servlet> <servlet-class>com.sdz.control.Index</servlet-class> <servlet-name>StartPage</servlet-name> <init-param> <param-name>titrePage</param-name> <param-value>Nom de la page</param-value> </init-param> <init-param> <param-name>sousTitre</param-name> <param-value>Sous titre de la page</param-value> </init-param> </servlet> <context-param> <param-name>contextParam</param-name> <param-value>Paramtre global l'application !</param-value> </context-param> <context-param> <param-name>contextParam2</param-name> <param-value>Paramtre global l'application ! (numro 2)</param-

www.siteduzero.com

Partie 2 : Autour de nos servlets


value> </context-param> <servlet-mapping> <servlet-name>StartPage</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>

77/158

V oici une servlet qui utilise les paramtres d'initialisation et des paramtres de l'application (vous pourrez comparer l'utilisation des deux types de paramtres) : Code : Java package com.sdz.control; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import import import import import import javax.servlet.ServletConfig; javax.servlet.ServletContext; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

public class Index extends HttpServlet { public void doGet( HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType("text/html"); PrintWriter out = response.getWriter(); Enumeration e = getInitParameterNames(); ServletConfig conf = getServletConfig(); while(e.hasMoreElements()){ String name = e.nextElement().toString(); out.println("<p><strong>" + name + " = " + conf.getInitParameter(name) + "</strong></p>"); } out.println("<h1>-------------------------------</h1>"); //Ici, on rcupre le contexte de l'application ServletContext context = getServletContext(); //De la mme manire que ci-dessus, nous rcuprons la liste de paramtres e = context.getInitParameterNames(); //Et on parcourt le tout while(e.hasMoreElements()){ String name = e.nextElement().toString(); //On appelle la mthode getInitParameter(String name) //afin de rcuprer la valeur out.println("<p><strong>" + name + " = " + context.getInitParameter(name) + "</strong></p>"); } } }

www.siteduzero.com

Partie 2 : Autour de nos servlets

78/158

Et le rsultat, sous vos yeux ptillants

Et l, vous pourrez faire autant de servlets que vous le souhaitez, ces paramtres seront accessibles toutes !

V ous avez vu que, mis part le nom de la balise, l'endroit o se trouvait la balise a son importance :

V ous voyez bien que les paramtres de la servlet se trouvent dans la balise <servlet></servlet> alors que les paramtres de l'application se trouvent dans la balise <web-app></web-app> . C'est vrai que l'utilisation est trs ressemblante aux paramtres d'initialisation de servlets...

www.siteduzero.com

Partie 2 : Autour de nos servlets

79/158

Oui, l o la plateforme est bien faite, c'est que, mis part le type d'objet utilis, la mthode invoque est la mme : Code : Java //Pour rcuprer un paramtre de la servlet getServletConfig().getInitParameter("nomParamter"); //Pour rcuprer un paramtre de l'application getServletContext().getInitParameter("nomParamter");

Par contre, ne confondez surtout pas les deux ! Il y a un objet ServletConfig par servlet et un objet ServletContext par application !

Pourtant l'objet ServletConfig nous retourne un objet ServletContext via la mthode getServletContext() ? Oui, bien sr ! Mais il s'agit d'un seul et mme objet ! Dans le chapitre suivant nous approfondirons ce point, mais pour le moment, sachez qu'il existe un ServletContext dans toute l'application alors qu'il y a un objet ServletConfig V oici un petit schma afin d'illustrer tout a :

et un seul objet par servlet !

www.siteduzero.com

Partie 2 : Autour de nos servlets

80/158

Un autre point important et que vous aurez sans doute remarqu : qu'il s'agisse de paramtres de servlet ou de paramtres de contexte, on ne peut utiliser que des String comme valeurs de nos paramtres ! Tu veux dire que nous ne pouvons pas utiliser d'objets ?

Si, mais par un moyen dtourn. En fait, nos servlets peuvent crer des paramtres prenant des objets comme valeurs ! V oyons a tout de suite...

Des objets en paramtres


Alors, dj, au cas o ne l'auriez pas remarqu, l'objet ServletConfig n'a pas de mthode permettant de dfinir des paramtres ; d'ailleurs, l'objet ServletContext non plus. Qu'est-ce que tu nous chantes ?

Je vous dis simplement que nous n'allons pas dfinir des paramtres d'initialisation, mais des attributs ! Et, en fait, ceci est logique puisque, dans nos servlets, la phase d'initialisation est termine depuis longtemps. Nous verrons ceci en dtail dans le prochain chapitre. Du coup, comment fait-on pour dfinir des objets en attribut de l'objet ServletContext ?

www.siteduzero.com

Partie 2 : Autour de nos servlets

81/158

De la mme faon que vous avez procd avec l'objet HttpServletRequest : avec la mthode setAttribute(String name, Object value). La diffrence de taille ici, c'est que, vu que nous travaillons avec l'objet ServetContext, ces attributs seront accessibles depuis une autre servlet que celle les ayant dfinis. Afin d'illustrer mes dires, je vous ai concoct un petit exemple. Nous allons dfinir trois attributs notre objet ServletContext dans une servlet : un objet Date ; deux objets ZColor (objet cr par mes soins).

Voici le fichier ZColor.java


Code : Java package com.sdz.model; public class ZColor { private String color = ""; public ZColor(String color){ this.color = color; } public String toString(){ return "COULEUR -> " + this.color; }

Nous utilisons donc ces objets dans une servlet de base dont voici le code.

Le fichier Index.java

Code : Java package com.sdz.control; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import import import import import import javax.servlet.ServletConfig; javax.servlet.ServletContext; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

public class Index extends HttpServlet { public void doGet( HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{

www.siteduzero.com

Partie 2 : Autour de nos servlets


response.setContentType("text/html"); PrintWriter out = response.getWriter(); //Ici, on rcupre le contexte de l'application ServletContext context = getServletContext(); //On ne dfinit pas de paramtres d'initialisation mais des attributs ! //Ceci en spcifiant un couple cl -> valeur context.setAttribute("obj", new java.util.Date()); context.setAttribute("obj2", new com.sdz.model.ZColor("Rouge")); context.setAttribute("obj3", new com.sdz.model.ZColor("Jaune")); out.println("<h2>obj : " + context.getAttribute("obj") + "</h2>"); out.println("<h2>obj2 : " + context.getAttribute("obj2") + "</h2>"); out.println("<h2>obj3 : " + context.getAttribute("obj3") + "</h2>"); out.println("<a href=\"context\">Lien vers une autre page</a>"); } }

82/158

La servlet ci-dessus va affecter et afficher les attributs que nous passons l'objet ServletContext. En plus de a, la servlet affiche un lien qui pointe vers une autre servlet, que voici :

Fichier TestContext.java
Code : Java package com.sdz.control; import java.io.IOException; import java.io.PrintWriter; import import import import import javax.servlet.ServletContext; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

public class TestContext extends HttpServlet{ public void doGet( HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ ServletContext context = getServletContext(); PrintWriter out = response.getWriter(); response.setContentType("text/html"); out.println("<h2>obj : " + context.getAttribute("obj") + "</h2>"); out.println("<h2>obj2 : " + context.getAttribute("obj2") + "</h2>"); out.println("<h2>obj3 : " + context.getAttribute("obj3") + "</h2>"); } }

Le tout mapp dans le fichier web.xml

www.siteduzero.com

Partie 2 : Autour de nos servlets

83/158

Code : XML <web-app> <servlet> <servlet-class>com.sdz.control.Index</servlet-class> <servlet-name>StartPage</servlet-name> </servlet> <servlet> <servlet-class>com.sdz.control.TestContext</servlet-class> <servlet-name>TestContext</servlet-name> </servlet> <servlet-mapping> <servlet-name>StartPage</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>TestContext</servlet-name> <url-pattern>/context</url-pattern> </servlet-mapping> </web-app>

Le rsultat de tout ceci est le suivant : Arrivs sur la page d'accueil, nous spcifions des attributs notre contexte et nous les affichons :

Le lien de la page prcdente nous envoie sur cette page :

V ous avez donc la preuve que les objets passs notre contexte sont toujours accessibles via une autre servlet !

www.siteduzero.com

Partie 2 : Autour de nos servlets


Bon, je crois que vous en avez assez vu pour aujourd'hui. Rendez-vous au QCM ! Pour commencer cette partie 2, ce n'tait pas un chapitre trs copieux et trs difficile assimiler. Par contre, les choses vont se compliquer avec le chapitre suivant...

84/158

Nous avons vu comment utiliser nos servlets, comment spcifier des paramtres celles-ci mais nous ne savons toujours rien sur ce qu'il se passe dans notre cher conteneur. Le chapitre suivant mettra quelques points au clair.

www.siteduzero.com

Partie 2 : Autour de nos servlets

85/158

Cycle de vie d'une servlet


V ous avez appris comment les applications JEE sont construites : servlet + JSP + objets Java ! Dans ce chapitre vous apprendrez comment une servlet vient la vie ! Comment Tomcat cre, utilise, initialise et invoque nos servlets. V ous allez voir que ce dernier est vraiment trs fort et qu'il nous soulage de beaucoup de travail.

Initialisation de la servlet
Alors ! Accrochez-vous bien car il y aura beaucoup de choses apprendre et assimiler ! Dj, vous aurez sans doute remarqu que nos servlets ne possdent pas de constructeur. Donc, comment sont-elles construites ?

Et je vous rponds : oui, nos servlets ont toutes un constructeur ! Mais il est invoqu automatiquement par le conteneur ! En gros, le conteneur, au moment de son lancement, va initialiser toutes les servlets en invoquant leurs constructeurs. Mais avant toute chose, le conteneur va aller lire le fichier web.xml . Les choses se passent un peu comme a :

V oil ; dans un premier temps, le conteneur construit un objet ServletContext contenant tous les couples " cl - valeur" spcifis dans le fichier web.xml correspondant aux paramtres d'initialisation de contexte. Ensuite, le conteneur continue son investigation et va construire puis initialiser les servlets prsentes. Lors de l'instanciation d'une servlet par le conteneur, il se passe beaucoup de choses que vous ne souponnez mme pas... V oyons un peu. En fait, lors de l'appel au constructeur de l'objet, le conteneur va aussi crer un objet ServletConfig contenant les paramtres d'initialisation de la servlet (couple cl - valeur). Cet objet contiendra aussi l'objet ServletContext. V ous savez dj que ceci : Code : Java ServletContext context = getServletContext();

est quivalent ceci : Code : Java ServletContext context = getServletConfig().getServletContext();

Mais ce n'est rellement utile que si votre servlet n'hrite pas de HttpServlet ou de GenericServlet...

www.siteduzero.com

Partie 2 : Autour de nos servlets


En effet, la mthode que vous avez utilise plus haut provient de la classe GenericServlet dont hrite la classe HttpServlet ! V oici un petit diagramme de classe comme vous les aimez :

86/158

V ous pouvez voir que ladite mthode n'est prsente qu' partir du deuxime niveau de cette hirarchie... Mais ne vous en faites pas trop, vous pouvez utiliser la premire mthode que je vous ai montre sans risque. Oui, on voit bien, mais qu'est-ce que c'est que toutes ces mthodes init(ServletConfig config) ou service(HttpServletRequest request, HttpServletResponse response) ... Ne vous en faites pas, nous y arrivons... V ous voyez une mthode init(ServletConfig config) prsente au plus haut niveau de la hirarchie. Dans le constructeur, le conteneur cre l'objet ServletConfig et invoque ladite mthode. Ceci pourrait tre schmatis comme ceci :

www.siteduzero.com

Partie 2 : Autour de nos servlets


La mthode init(ServletConfig config) qu'utilise le conteneur ne doit pas tre redfinie !

87/158

Si vous souhaitez faire quelques traitements avant d'utiliser votre servlet, comme l'initialisation d'objets, vous avez une autre mthode init() qui, elle, ne prend pas de paramtre. Cette mthode vous est offerte afin que vous puissiez y mettre ce que vous voulez. Du coup, comment cette mthode est-elle appele ?

C'est simple, c'est la mthode init(ServletConfig config) invoque par le constructeur qui appelle la mthode init() que vous pouvez redfinir. V oici comment vous pouvez utiliser ceci : Code : Java package com.servlet.test; import java.io.IOException; import java.io.PrintWriter; import import import import javax.servlet.ServletContext; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

public class DoIt extends HttpServlet{ String str = ""; public void init(){ str = "<p>Paramtre initialis dans la mthode init !</p>"; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{ response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<h1>Servlet d'exemple ! </h1>"); out.println(str); } }

Bon, tout ceci fait, votre servlet est initialise et prte tre utilise par le conteneur. Donc voici ce qu'il se passe lorsque le conteneur crer la servlet. Et a chaque fois que le conteneur reoit une requte HTTP ? NON ! MON DIEU NON ! Je crois qu'il faut que je vous fasse aussi un petit topo sur la faon dont la servlet est utilise...

Utilisation de la servlet
V ous pensiez que les servlets taient des objets instancis chaque requte HTTP, eh bien non ! Je sais que vous pourrez entendre ce genre de chose " Blablabla... chaque instance de ma servlet... Blablabla ". Ceci est faux ! Il n'existe qu'une et une seule instance d'une servlet dans le conteneur ! Ce qu'il se passe c'est que pour chaque requte HTTP, un thread est cr pour satisfaire la requte et proposer une rponse ! Que se passe-t-il exactement ?

C'est simple et compliqu la fois... Le conteneur reoit une requte HTTP. V ous savez dj que ce dernier cre deux objets pour traiter la demande du client :

www.siteduzero.com

Partie 2 : Autour de nos servlets


un objet HttpServletRequest ; un objet HttpServletResponse.

88/158

V ous savez aussi que la servlet sait quelle mthode utiliser (doGet, doPost...) mais ne vous tes-vous jamais demand comment nos servlets savent faire a ? Si, bien sr que si... Eh bien c'est grce la mthode service(HttpServletRequest request, HttpServletResponse response) que tout ceci est possible ! C'est dans cette dernire que le code permettant la servlet de savoir quelle mthode utiliser se trouve ; par consquent, il est trs vivement dconseill de redfinir cette mthode ! Si je reprends la vie de notre servlet partant du principe que la servlet est initialise, voici ce que a donnerait : la servlet reoit une requte HTTP ; elle cre les deux objets que vous connaissez ; elle alloue un nouveau thread cette requte ; elle invoque la mthode service(HttpServletRequest request, HttpServletResponse response) en passant les deux objets en paramtres ; ladite mthode invoque la bonne mthode de traitement (doGet, doPost...) ; le traitement se fait ; la rponse est renvoye au client.

Je sais que vous tes attachs mes schmas... Donc je vous en ai prpar un pour reprendre mes dires :

V ous devez y voir plus clair, non ? Euh, tu nous disais que Tomcat cre un thread pour chaque requte...

Oui, chaque fois que celui-ci reoit une requte HTTP, il cre les objets requte et rponse puis, il cre un thread afin d'invoquer la mthode service(HttpServletRequest req, HttpServletREsponse rep) . La suite, vous la

www.siteduzero.com

Partie 2 : Autour de nos servlets


connaissez...

89/158

Je vous ai fait un petit schma rsumant ce qu'il se passe lorsque deux personnes envoient une requte vers la mme ressource sur le serveur :

C'est assez explicite je pense... Par contre, vous devez savoir encore une chose sur notre conteneur : il vous permet d'espionner vos applications...

Le retour des listeners


Nous venons de voir comment sont construites et initialises nos servlets mais il reste une notion, que j'approfondirai au fil du tuto et que vous devez connatre. En fait, votre conteneur favori vous permet d'couter toute la phase de construction de nos servlets et plus encore. Au long du chapitre prcdent, nous avons vu comment dfinir des objets dans notre contexte mais, parce qu'il y a un mais, ceux-ci taient dfinis par une servlet... Pas terrible !... Comment vous y prendriez-vous pour initialiser un objet au lancement de l'application ? (Une connexion SQL par exemple, mais un bte objet fera l'affaire.) En dfinissant cet attribut notre contexte dans la mthode init() de la servlet correspondant notre page d'accueil. Ah oui ? Et comment ferez-vous si je passe outre la page d'accueil, en saisissant une URL connue par exemple ? V ous n'allez tout de mme pas mettre cette instruction dans la mthode init() de toutes vos servlets ! Dans ces moments-l, la mthode public static void main(String[] args) vous manque rellement... Avoir un endroit o on peut faire ce que l'on veut avant le rel dmarrage de l'application. Cependant, comme je vous le disais dans le chapitre prcdent, les concepteurs de la technologie sont de gentils concepteurs : ils vous ont donn le moyen d'initialiser des objets en dehors de toute servlet ! Et comment on fait a ?

Avec de bons vieux vnements, comme en programmation vnementielle. Durant toute la phase d'initialisation de notre application, le conteneur vous offre la possibilit d'couter des vnements afin de pouvoir faire des actions spcifiques ce moment-l. Bon : partir de maintenant, tous les ZrOs qui ne savent pas comment les vnements graphiques sont grs en Java sont pris d'aller faire un tour sur le tuto concernant le pattern observer ! Alors, le but du jeu est de pouvoir initialiser un objet avant qu'une seule servlet ne soit instancie, ceci afin que ce qui est fait

www.siteduzero.com

Partie 2 : Autour de nos servlets

90/158

ce moment (l'initialisation de l'application) puisse tre utile toute l'application. Dj, avec ma phrase, vous avez d comprendre que l'vnement que nous allons utiliser tait attach au contexte de notre application : une seule chose est commune l'application, le contexte. Alors qui dit vnement, dit interface implmenter et, concernant le contexte, nous allons implmenter l'interface : ServletContextListener.

V ous pouvez voir que cette interface nous donne la possibilit d'agir lors de la cration du contexte ou lors de sa destruction. Alors, vu que vous tes friands d'exemples en tout genre, nous allons faire un test. Nous allons faire une servlet qui appelle un attribut attach l'objet ServletContext mais dfini lors de la cration dudit objet. Pour faire ceci, nous allons avoir besoin : d'une servlet ; d'un objet servant couter l'vnement ; d'un objet cod par nos soins.

J'ai fait un nouveau projet Tomcat et voici ce que j'y ai mis. Un objet mtier que vous avez dj vu tout l'heure, l'objet ZColor.

Fichier ZColor.java
Code : Java package com.sdz.test; public class ZColor { private String color = ""; public ZColor(String color){ this.color = color; } public String toString(){ return "COULEUR -> " + this.color; }

Bon, vous connaissez cet objet, rien ajouter son sujet... Maintenant, nous allons ajouter un objet ZColor notre contexte lors de sa cration, ceci via la classe qui suit. Il s'agit de notre classe qui va se charger d'couter aux portes de notre conteneur... Une fois le contexte cr, la mthode contextInitialized(ServletContextEvent event) sera invoque.

Fichier ContextListener.java
Code : Java package com.sdz.test; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener;

www.siteduzero.com

Partie 2 : Autour de nos servlets


public class ContextListener implements ServletContextListener{ public void contextDestroyed(ServletContextEvent event) {} public void contextInitialized(ServletContextEvent event) { //Nous avons accs l'objet ServletContext via l'objet ServletContextEvent event.getServletContext().setAttribute("color", new ZColor("ROUGE")); } }

91/158

Maintenant, construisons une servlet qui aura pour rle d'utiliser l'objet initialis dans le contexte.

Fichier Index.java
Code : Java package com.sdz.test; import java.io.IOException; import java.io.PrintWriter; import import import import javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

public class Index extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<h2>Alors le contexte ?</h2>"); out.println("<p> " + getServletContext().getAttribute("color") + " </p>"); } }

V oil, nous avons presque termin, nous n'avons plus qu' configurer le contexte de notre application avec le fichier web.xml .

Fichier web.xml
Code : XML <web-app> <servlet> <servlet-class>com.sdz.test.Index</servlet-class> <servlet-name>IndexServlet</servlet-name> </servlet> <servlet-mapping> <servlet-name>IndexServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>

www.siteduzero.com

Partie 2 : Autour de nos servlets


<listener> <listener-class>com.sdz.test.ContextListener</listener-class> </listener> </web-app>

92/158

Oh ! Une nouveaut !

Oui, difficile de ne pas la voir... V ous l'aurez compris, ces balises servent dire Tomcat que des classes sont utiliser comme des listeners . Alors dmarrez Tomcat et allez sur notre test, et voici ce que vous devriez avoir sous les yeux :

Pratique, n'est-ce pas ? V ous venez de crer des attributs pour toute votre application sans ajouter une ligne de code vos servlets. En effet, en plus ce n'est pas trop dur...

Ah, je peux compliquer la tche alors !

Des listeners, encore des listeners


Puisque vous tes chauds, c'est le bon moment pour vous dire que vous avez plusieurs listeners votre disposition. V ous venez de voir comment utiliser celui qui est invoqu lorsque le contexte est initialis, mais il y en a d'autres ! En voici une liste : ServletContextListener ; ServletContextAttributeListener ; ServletRequestListener ; SerlvetRequestAttributeListener ; HttpSessionListener ; HttpSessionAttributeListener ; HttpSessionBindingListener ; HttpSessionActivateListener.

Je ne vous parlerai que des quatre premiers pour le moment puisque les autres concernent les sessions : nous n'avons pas encore parl des sessions. Par contre, pour les premiers, voici quoi ils correspondent : ServletContextListener : invoqu lorsque l'objet ServletContext est cr ; ServletContextAttributeListener : invoqu lorsqu'un attribut est ajout l'objet ServletContext ; ServletRequestListener : invoqu lorsque l'objet ServletRequest est cr ; SerlvetRequestAttributeListener : invoqu lorsqu'un attribut est ajout l'objet ServletRequest .

V oici le dtail de ces interfaces avec leurs mthodes :

www.siteduzero.com

Partie 2 : Autour de nos servlets

93/158

En rouge vous pouvez voir les vnements relatifs au contexte et en vert les vnements relatifs la requte. Nous allons raliser un petit exemple. Nous allons donc utiliser ces vnements, ceci avec des classes qui auront pour rle de compter le nombre d'attributs affects nos diffrents objets. V oici ci-dessous les objets qui auront cette fonction.

Fichier CountContext.java
Code : Java package com.sdz.test; public class CountContext { private static int count = 0; public static void incremente(){++count;} public static int getCount(){return count;}

Fichier CountContextAttribute.java
Code : Java package com.sdz.test; public class CountContextAttribute { private static int count = 0; public static void incremente(){++count;} public static int getCount(){return count;}

Fichier CountRequest.java
Code : Java package com.sdz.test; public class CountRequest {

www.siteduzero.com

Partie 2 : Autour de nos servlets


private static int count = 0; public static void incremente(){++count;} public static int getCount(){return count;}

94/158

J'ai fait trois objets pour tre sr que vous ne m'accuseriez pas de tricherie. Rien de compliqu ici, parce que, si vous ne comprenez pas la fonction de ces objets, retour au tuto Java illico presto ! Maintenant, voici les objets implmentant les interfaces mentionnes plus haut (je ne les ai pas toutes mises).

Fichier ContextListener.java
Code : Java package com.sdz.test; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class ContextListener implements ServletContextListener{ public void contextDestroyed(ServletContextEvent event) {} public void contextInitialized(ServletContextEvent event) { event.getServletContext().setAttribute("color", new ZColor("ROUGE")); CountContext.incremente(); } }

Fichier ContextAttributeListener.java
Code : Java package com.sdz.test; import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; public class ContextAttributeListener implements ServletContextAttributeListener{ public void attributeAdded(ServletContextAttributeEvent event) { CountContextAttribute.incremente(); } public void attributeRemoved(ServletContextAttributeEvent event) {} public void attributeReplaced(ServletContextAttributeEvent event) {} }

Fichier RequestListener.java
Code : Java

www.siteduzero.com

Partie 2 : Autour de nos servlets


package com.sdz.test; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; public class RequestListener implements ServletRequestListener{ public void requestDestroyed(ServletRequestEvent event) { CountRequest.incremente(); } public void requestInitialized(ServletRequestEvent event) {}

95/158

Il ne manque plus que la servlet de test ainsi que le fichier web.xml . J'ai modifi un peu la servlet afin d'isoler notre test. J'ai aussi ajout les listeners dans le fichier web.xml .

Fichier Index.java
Code : Java package com.sdz.test; import java.io.IOException; import java.io.PrintWriter; import import import import javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

public class Index extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<p>Nombre d'objet(s) ServletContext : " + CountContext.getCount() + "</p>"); out.println("<p>Nombre d'attribut(s) du contexte : " + CountContextAttribute.getCount() + "</p>"); out.println("<p>Nombre d'objet(s) HttpServletRequest : " + CountRequest.getCount() + "</p>"); } }

Fichier web.xml
Code : XML <web-app> <servlet> <servlet-class>com.sdz.test.Index</servlet-class> <servlet-name>IndexServlet</servlet-name> </servlet> <servlet-mapping> <servlet-name>IndexServlet</servlet-name>

www.siteduzero.com

Partie 2 : Autour de nos servlets


<servlet-name>IndexServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <listener> <listener-class>com.sdz.test.ContextListener</listener-class> <listener-class>com.sdz.test.ContextAttributeListener</listenerclass> <listener-class>com.sdz.test.RequestListener</listener-class> </listener> </web-app>

96/158

Ceci fait, il ne vous reste plus qu' relancer Tomcat et de retourner sur notre test. V ous devriez obtenir ceci (j'ai appuy quelquefois sur F5 ) :

Notre systme de listeners fonctionne merveille, vous avez appris couter les vnements d'initialisation et les utiliser pour paramtrer votre application : mes compliments ! Bon, je crois que vous en avez assez vu pour l'instant. Rendez-vous au QCM ! V oil, maintenant vous tes incollables sur la vie d'une servlet ! V ous pourrez mme crire un livre l-dessus. Eh bien ne vous en dplaise, le conteneur vous cache encore pas mal de choses ! Il offre encore beaucoup de fonctionnalit et d'outils afin de vous faciliter la vie. D'ailleurs, dans le prochain chapitre, je vous propose d'aborder une notion que vous allez beaucoup utiliser : les sessions.

www.siteduzero.com

Partie 2 : Autour de nos servlets

97/158

Les sessions
Le titre de ce chapitre est assez vocateur, nous parlerons des sessions. Mais d'abord, qu'est-ce que c'est qu'une session ? quoi a sert ? C'est comestible ? Ces questions doivent vous brler les lvres : eh bien je m'engage y rpondre, ici et maintenant. V ous verrez que cet objet - car, oui, il s'agit d'un objet que le conteneur nous offre - est trs pratique et permet votre application d'avoir une mmoire... enfin, faon de parler.

Qu'est-ce qu'une session ?


Tout d'abord, rappelez-vous le fonctionnement du web : un client envoie une requte HTTP en direction d'un serveur, celui-ci traite l'information et renvoie la rponse au client. V oici un schma rsumant la situation :

En fait, imaginez que votre serveur n'a pas de mmoire : chaque requte, le serveur renverra une rponse sans savoir si c'est la mme personne qui redemande la page. Les sessions permettent votre serveur de garder un certain nombre d'informations de son ct afin de pouvoir les rutiliser ultrieurement. Sans le savoir, vous naviguez sur des sites qui utilisent des sessions, vous tes d'ailleurs sur un de ceux-ci. Le meilleur exemple d'utilisation de session reste encore la page de connexion d'un site comme le SDZ. V ous avez pu constater qu'une fois connect vous n'avez plus saisir de nouveau vos identifiants. Ceux-ci sont conservs et rutiliss tout au long de votre navigation sur le site grce aux sessions. a a l'air merveilleux ton truc, mais comment a fonctionne ?

C'est justement ce que je vous propose de voir.

Crer et utiliser une session


Comme je vous le disais plus tt, les sessions s'utilisent grce un objet. Les mthodes les plus couramment utilises permettent de dposer et rcuprer des valeurs dans notre objet. Ces valeurs sont stockes sous la forme " cl - valeur". En fait, nous ordonnons notre objet session de stocker une valeur que nous allons ranger grce une cl, un peu comme ceci :

Dans le cas du tableau ci-dessus, nous devrons, pour rcuprer la valeur " monLogin ", interroger notre objet de session en lui demandant de nous fournir la valeur de la cl " login ". En fait, vous pouvez voir que son utilisation est trs simple : nous allons pouvoir faire un premier essai, mais avant, voici une description succincte de notre objet : HttpSession.

www.siteduzero.com

Partie 2 : Autour de nos servlets

98/158

Je vous propose un petit exemple afin de nous faire les dents Celui-ci sera trs simple, une page HTML qui demande un " login - mot de passe" via un formulaire (jusqu'ici, rien de spcial), une servlet qui va rcuprer les informations du formulaire pour les mettre en session ; enfin, cette mme servlet va rediriger la requte vers une autre servlet qui aura pour rle d'afficher le contenu de notre session et d'y ajouter un objet qui aura pour rle compter le nombre de fois que la page a t appele (un bte incrment, quoi ). Allez, un petit schma s'impose.

V oici les codes sources utiliss.

connexion.jsp
Code : JSP <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Connexion l'application</title> </head> <body> <form name="session" method="POST" action="session.do" />

www.siteduzero.com

Partie 2 : Autour de nos servlets


<table> <tr> <td>Login : </td> <td><input type="text" name="login" /> </td> </tr> <tr> <td>Mot de passe : </td> <td><input type="password" name="password" /> </td> </tr> <tr> <td colspan="2" style="text-align:center"><input type="submit" name="valider" /></td> </tr> </table> </form> </body> </html>

99/158

Servlet 1 : TestSession.java
Code : Java package com.sdz.session; import java.io.IOException; import import import import import import javax.servlet.RequestDispatcher; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse; javax.servlet.http.HttpSession;

public class TestSession extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //On rcupre les identifiants et on les stocke dans notre objet de session String login = req.getParameter("login"); String password = req.getParameter("password"); HttpSession session = req.getSession(); session.setAttribute("login", login); session.setAttribute("password", password); //Maintenant, nous allons utiliser cet objet dans une autre servlet resp.sendRedirect("result.do"); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } doGet(req, resp);

Servlet 2 : ResultatSession.java
Code : Java

www.siteduzero.com

Partie 2 : Autour de nos servlets


package com.sdz.session; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import import import import import javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse; javax.servlet.http.HttpSession;

100/158

public class ResultatSession extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); PrintWriter out = resp.getWriter(); //On rajoute un attribut s'il n'existe pas //Et s'il existe, on incrmente cet attribut Object increment = session.getAttribute("increment"); if(increment == null){ session.setAttribute("increment", new Integer(1)); } else{ int value = ((Integer)increment).intValue(); session.setAttribute("increment", ++value); } //On affiche l'identifiant de session unique out.println("<h2>Numro de la session en cours : " + session.getId() + "</h2>"); //On parcourt maintenant le contenu de notre objet session Enumeration e = session.getAttributeNames(); while(e.hasMoreElements()){ String key = (String)e.nextElement(); out.println("<p>Cl : " + key + " - Valeur : " + session.getAttribute(key) + "</p>"); } } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }

Le descripteur de dploiement : web.xml


Code : XML <web-app> <servlet> <servlet-class>com.sdz.session.TestSession</servlet-class> <servlet-name>firstSession</servlet-name> </servlet> <servlet> <servlet-class>com.sdz.session.ResultatSession</servlet-class>

www.siteduzero.com

Partie 2 : Autour de nos servlets


<servlet-name>resultSession</servlet-name> </servlet> <servlet-mapping> <servlet-name>firstSession</servlet-name> <url-pattern>/session.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>resultSession</servlet-name> <url-pattern>/result.do</url-pattern> </servlet-mapping> </web-app>

101/158

V oil ce que j'ai obtenu avec ces codes :

Dans notre exemple, nous avons utilis une servlet pour afficher le contenu de notre objet session. V ous auriez aussi pu utiliser une page JSP : votre objet est accessible directement via la variable session. Elle fait partie des variables prcharges et peut tre directement utilisable depuis une page JSP.

sendRedirect ou RequestDispatcher ?
Une petite nouveaut s'est glisse ici, c'est la notion de redirection. Ceci peut s'avrer trs pratique lorsqu'on souhaite rorienter une requte vers une servlet particulire ou vers une JSP. Ceci se fait via l'objet HttpResponse en invoquant la mthode

www.siteduzero.com

Partie 2 : Autour de nos servlets


sendRedirect(String urlName). Cette mthode a une petite cousine qui, elle, est invoquer via l'objet HttpRequest, vous la connaissez dj et vous l'avez dj utilise, rappelez-vous, lorsque vous faites ceci : Code : Java RequestDispatcher dispatch = request.getRequestDispatcher("firstJsp.jsp"); dispatch.forward(request, response);

102/158

La principale diffrence rside dans la faon de travailler de ces deux mthodes. Imaginez-vous sur un chantier de maonnerie avec plusieurs ouvriers. Utiliser la mthode sendRedirect() reviendrait demander quelqu'un d'autre de faire le travail votre place alors qu'utiliser l'objet RequestDispatcher reviendrait demander un coup de main un collgue, vous tes toujours en charge de la tche mais quelqu'un vient en soutien. Lorsque l'objet RequestDispatcher fait travailler quelqu'un d'autre, sendRedirect() simule une requte de la part d'un client. D'ailleurs, il vous suffit de tester les deux mthodes ; vous verrez dans la barre d'adresse que l'URL est diffrente selon le cas et, donc, que la servlet en charge de traiter la requte HTTP n'est pas la mme :

Avec la mthode requestDispatcher

Avec la mthode sendRedirect Fin de l'apart. V ous pouvez voir qu'avec cet exemple (aprs plusieurs appuis sur F5 dans la page rcapitulative), notre application se rappelle de vous en conservant des informations. C'est trs simple d'utilisation et trs pratique car ce sont des objets qui sont mmoriss : vous pouvez donc trs bien mettre ce qui vous chante dans votre session. V ous aurez aussi remarqu que l'identifiant de session, qu'on rcupre avec la mthode getId(), retourne toujours la mme chane de caractres. C'est ce qu'on appelle le sessid. C'est grce cet identifiant que notre serveur sait qui il parle et qu'il retrouve les informations : en fait, ce ne sont pas vraiment vos informations, mais les informations de la session car, si vous le souhaitez, vous pouvez avoir plusieurs sessions dans une mme application. Dans notre exemple, faites la mme chose sous deux navigateurs diffrents (Firefox et IE, par exemple) avec des donnes diffrentes et vous devriez obtenir ceci :

Du coup, une question doit germer dans vos esprits : comment le conteneur fait pour reconnatre telle ou telle session ? Allez, je suis sympa, je vais vous expliquer.

Comment a fonctionne
Lorsqu'un client met une requte vers un serveur, ledit serveur vrifie s'il connat l'metteur de la demande : le navigateur du

www.siteduzero.com

Partie 2 : Autour de nos servlets

103/158

client retourne l'identifiant qui lui a t attribu automatiquement ; sinon, il n'envoie rien. Dans ce cas, le serveur cre et retourne au client un nouvel identifiant de session. Cet identifiant est envoy par le serveur et le navigateur s'il existe, c'est par ce biais que le serveur et le client semblent se connatre. Notre serveur conserve en mmoire les identifiants qu'il gnre. Il envoie vers chaque client leurs identifiants de session ; ainsi, lorsqu'un client renvoie un identifiant, le conteneur arrive retrouver les informations qui lui taient affectes. V oici un petit schma rsumant la situation, vous y verrez plus clair je pense :

Mais comment le navigateur retourne l'identifiant ? Via les enttes HTTP ?

Il y a deux cas de figure. Par dfaut, les navigateurs acceptent ce qu'on appelle vulgairement des cookies . Un cookie est un petit fichier texte contenant diffrentes informations, dont votre identifiant de session. Si vous souhaitez voir le contenu de votre cookie, Firefox propose un module complmentaire, Edit Cookie qui permet de voir et d'diter les cookies de votre navigateur. Pour l'installer, cliquez sur " Outils, Modules complmentaires " et recherchez ledit module dans le catalogue. Installez-le et redmarrez le navigateur. Maintenant, un nouveau point de menu est disponible dans Firefox, dans le menu " Outils ". Il ne vous reste plus qu' chercher les cookies du site localhost et vous devriez tomber dessus. Lorsque votre navigateur accepte les cookies, le contenu de ceux-ci est automatiquement encapsul dans les enttes HTTP par votre navigateur, l'id de session est donc retourn automatiquement vers le serveur. Par contre, il arrive que les cookies ne soient pas accepts ; dans ce cas, vous pouvez faire quelque chose ct serveur afin d'encoder l'id de session dans l'URL de votre site. Ceci fait, l'id de session transitera dans les enttes HTTP en tant que paramtre GET, le conteneur saura retrouver la session attache. Pour ce faire, il vous suffit d'utiliser la mthode encodeURL(String url) de l'objet HttpResponse. Ainsi, si dans notre servlet TestSession.java nous remplaons la ligne resp.sendRedirect("result.do"); par celle-ci : resp.sendRedirect(resp.encodeURL("result.do"));, lorsque vous testerez nouveau notre code, l'URL aura cette forme :

www.siteduzero.com

Partie 2 : Autour de nos servlets

104/158

V oil, vous savez maintenant comment votre conteneur prfr arrive communiquer avec votre navigateur et vice et versa. Je vous propose prsent de voir quelques listeners qui peuvent tre utiliss sur les sessions.

Encore des listeners


Comme je vous l'avais mentionn dans un prcdent chapitre, il existe des couteurs qui ont pour rle de surveiller vos sessions. Pour rappel, les voici :

HttpSessionListener : c'est un couteur au niveau de l'application. Il peut servir contrler les crations ou destructions de sessions afin de connatre le nombre d'utilisateurs actuellement connects par exemple ; HttpSessionAttributeListener : sert contrler les lments qui sont ajouts, modifis ou retirs de nos sessions ; HttpSessionBindingListener : est utilis par un objet souhaitant tre averti lorsqu'il est insr dans une session. En fait, c'est un objet qui implmente cette interface, objet qui doit ncessiter une action particulire lorsqu'il est mis en session ; HttpSessionActivateListener : dans des environnements d'entreprise, il n'est pas rare d'avoir ce qu'on appelle un rpartiteur de charge. Celui-ci s'occupe d'envoyer les requtes HTTP vers tels ou tels serveurs ; dans ce cas, il peut y avoir plusieurs JVM utilises pour grer une application : cet couteur est appel lorsqu'une session est envoye d'une JVM une autre.

V oici deux classes vous montrant comment utiliser deux des listeners mentionns ci-dessus, les plus utiliss en ralit. Nous

www.siteduzero.com

Partie 2 : Autour de nos servlets


avons rajout notre exemple deux classes couteurs codes par nos soins

105/158

Fichier SessionCounter.java
Code : Java package com.sdz.session; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class SessionCounter implements HttpSessionListener{ private int countSession = 0; public void sessionCreated(HttpSessionEvent event) { System.out.println("Nombre de session(s) " + (++countSession)); } public void sessionDestroyed(HttpSessionEvent event) { System.out.println("Nombre de session(s) " + (--countSession)); }

Fichier SessionAttribute.java
Code : Java package com.sdz.session; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; public class SessionAttribute implements HttpSessionAttributeListener{ public void attributeAdded(HttpSessionBindingEvent event) { System.out.println("L'attribut " + event.getName() + " qui a pour valeur " + event.getValue() + " a t rajout dans une session"); } public void attributeRemoved(HttpSessionBindingEvent event) { System.out.println("L'attribut " + event.getName() + " qui a pour valeur " + event.getValue() + " a t retir dans une session"); } public void attributeReplaced(HttpSessionBindingEvent event) { System.out.println("L'attribut " + event.getName() + " qui a pour valeur " + event.getValue() + " a t remplac dans une session"); } }

Le fichier web.xml
Code : XML <web-app> <servlet>

www.siteduzero.com

Partie 2 : Autour de nos servlets


<servlet-class>com.sdz.session.TestSession</servlet-class> <servlet-name>firstSession</servlet-name> </servlet> <servlet> <servlet-class>com.sdz.session.ResultatSession</servlet-class> <servlet-name>resultSession</servlet-name> </servlet> <servlet-mapping> <servlet-name>firstSession</servlet-name> <url-pattern>/session.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>resultSession</servlet-name> <url-pattern>/result.do</url-pattern> </servlet-mapping> <listener> <listener-class> com.sdz.session.SessionCounter </listener-class> <listener-class> com.sdz.session.SessionAttribute </listener-class> </listener> </web-app>

106/158

Euh tu as d te tromper. Tu as utilis des System.out.println(""), a ne va s'afficher nulle part !

En fait, si. Lorsque vous contrlez le serveur Tomcat depuis Eclipse, si vous utilisez ce genre d'instructions, elles s'afficheront dans la console EClipse. La preuve en image en testant sur deux navigateurs, comme prcdemment :

Dure d'une session


V ous devez savoir une dernire chose sur les sessions : celles-ci ont une dure de vie limite. En fait, au bout d'un certain temps d'inactivit, la session est dtruite : par dfaut, le temps maximum d'inactivit est de 30 minutes. Comment sais-tu a ?

www.siteduzero.com

Partie 2 : Autour de nos servlets

107/158

C'est simple : Tomcat, comme beaucoup de conteneurs JEE, a un fichier de configuration qui lui permet de rgler ce genre de choses. Celui-ci s'appelle aussi web.xml , mais il se trouve dans le dossier " conf " de Tomcat. Si vous ouvrez ce fichier, avec Notepad++ par exemple, vous pourrez voir qu'aprs toutes les dfinitions de servlets de ce fichier, vous avez cette dclaration : Code : XML <session-config> <session-timeout>30</session-timeout> </session-config>

V ous pouvez donc redfinir cette dure dans le fichier web.xml de vos applications afin d'offrir vos sessions une dure de vie qui convienne vos besoins. V oil ! Je pense que les sessions n'ont plus beaucoup de secrets pour vous. Je vous propose donc, aprs avoir effectu le QCM, d'approfondir cette notion de cookie dont nous avons parl auparavant. V oil, encore un chapitre riche en nouveauts. J'espre que vous arrivez toujours suivre et que je ne m'gare pas dans d'obscures explications inintelligibles Si vous tes toujours d'attaque, je vous propose de voir une notion troitement lie aux sessions : les cookies.

www.siteduzero.com

Partie 2 : Autour de nos servlets

108/158

Les cookies
Nous avons vu dans le chapitre prcdent qu'un cookie n'tait en fait qu'un fichier texte contenant des informations qu'un serveur web peut utiliser pour charger ou afficher les informations qu'il contient. Nous avons vu plus prcisment que les cookies permettaient de stocker l'identifiant de session, utile tout serveur web afin de pouvoir reconnatre ses clients. Dans ce chapitre nous allons voir ce que nous pouvons y stocker et comment rcuprer les informations. Allez, en avant.

Utiliser des cookies


Avant de commencer, vous devez vous douter que nous allons utiliser un objet. V oici une liste non exhaustive de ses mthodes :

Et vous allez voir, c'est vraiment trs simple d'utilisation. Je vous propose d'ailleurs de reprendre l'exemple du prcdent chapitre, lgrement modifi afin qu'il travaille avec des cookies plutt qu'avec une session.

connexion.jsp
Code : JSP <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ page import="java.util.HashMap" %> <% //On rcupre la liste des cookies Cookie[] cookies = request.getCookies(); HashMap map = new HashMap(); //S'il y a au moins un cookie, on stocke les cls-valeurs dans une map if(cookies != null){ for(Cookie cookie : cookies){ map.put(cookie.getName(), cookie.getValue()); } } //Ainsi, si des donnes existent, on pourra prremplir les champs de notre formulaire %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Connexion l'application</title> </head> <body> <form name="session" method="POST" action="Cookie.do" /> <table>

www.siteduzero.com

Partie 2 : Autour de nos servlets


<tr> <td>Login : </td> <td><input type="text" name="login" value="<%=((map.get("login") != null) ? map.get("login") : "") %>"/> </td> </tr> <tr> <td>Mot de passe : </td> <td><input type="password" name="password" value="<%=((map.get("password") != null) ? map.get("password") : "") %>"/> </td> </tr> <tr> <td colspan="2" style="text-align:center"><input type="submit" name="valider" /></td> </tr> </table> </form> </body> </html>

109/158

TestCookie.java
Code : Java package com.sdz.session; import java.io.IOException; import import import import import javax.servlet.ServletException; javax.servlet.http.Cookie; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

public class TestCookie extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //On rcupre les identifiants String login = req.getParameter("login"); String password = req.getParameter("password"); //On cre des cookies en consquence Cookie cookie1 = new Cookie("login", login); Cookie cookie2 = new Cookie("password", password); //On informe l'objet rponse qu'il devra envoyer des cookies au navigateur resp.addCookie(cookie1); resp.addCookie(cookie2); //Maintenant, nous allons utiliser cet objet dans une autre servlet resp.sendRedirect(resp.encodeURL("result.do")); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } doGet(req, resp);

www.siteduzero.com

Partie 2 : Autour de nos servlets

110/158

ResultCookie.java
Code : Java package com.sdz.session; import import import import import import import import import import import java.io.IOException; java.io.PrintWriter; java.util.HashMap; java.util.Iterator; java.util.Map; java.util.Set; javax.servlet.ServletException; javax.servlet.http.Cookie; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

public class ResultatCookie extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter(); Cookie[] cookies = req.getCookies(); HashMap map = new HashMap(); for(Cookie cookie : cookies){ map.put(cookie.getName(), cookie.getValue()); } //On va rajouter un attribut s'il n'existe pas //Et, s'il existe, on va l'incrmenter Object increment = map.get("increment"); if(increment == null){ Cookie cook = new Cookie("increment","1"); resp.addCookie(cook); } else{ int value = Integer.valueOf(increment.toString()); ++value; Cookie cook = new Cookie("increment", ((Integer)value).toString()); resp.addCookie(cook); } //On parcourt maintenant le contenu de notre tableau de cookies : for(Cookie cookie : cookies){ out.println("<p>Nom : " + cookie.getName() + "<br />"); out.println("<ul>"); out.println("<li>Temps de vie : " + cookie.getMaxAge() + "</li>"); out.println("<li>Valeur : " + cookie.getValue() + "</li>"); out.println("</ul>"); out.println("</p>"); } } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); }

www.siteduzero.com

Partie 2 : Autour de nos servlets


}

111/158

web.xml
Code : Java <web-app> <servlet> <servlet-class>com.sdz.session.TestCookie</servlet-class> <servlet-name>firstCookie</servlet-name> </servlet> <servlet> <servlet-class>com.sdz.session.ResultatCookie</servlet-class> <servlet-name>resultCookie</servlet-name> </servlet> <servlet-mapping> <servlet-name>firstCookie</servlet-name> <url-pattern>/Cookie.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>resultCookie</servlet-name> <url-pattern>/result.do</url-pattern> </servlet-mapping> </web-app>

V oil ce que a donne, pour le premier passage sur la page de formulaire :

Lorsque vous validez la page, voici ce que nous obtenons :

www.siteduzero.com

Partie 2 : Autour de nos servlets

112/158

Et maintenant, si vous retournez sur la page de formulaire, vous pouvez voir que les champs sont prchargs :

C'est la magie des cookies ! V ous pouvez voir que nous avons aussi notre JSESSID, je ne vous avais donc pas menti Mais attends une seconde, -1 en dure de vie, ce n'est pas bizarre ?

Si, je vous l'accorde. C'est juste que, par dfaut, c'est cette valeur qui est mise dans le cookie. Elle signifie que le cookie reste actif tant que le navigateur est ouvert, ce qui signifie qu'il est dtruit lorsqu'on ferme ce dernier. Afin de donner une dure de validit nos cookies, il suffit d'invoquer la mthode setMaxAge(int age). Le paramtre correspond un nombre de secondes ; donc, pour attribuer une dure de vie de 10 heures, il suffit de faire : Code : Java setMaxAge((3600 * 10));

Session ou cookie
V ous vous demandez peut-tre ce que vous devrez utiliser : des sessions ou des cookies ? En fait, la question ne se pose pas puisque, dans la majeure partie des cas, ils travaillent ensemble et remplissent des rles complmentaires. Une session a une dure de vie beaucoup plus courte qu'un cookie : du coup, avec ce dernier, vous allez stocker des informations qui permettront, aprs coup (des heures, des jours ou des semaines aprs) de pouvoir prcharger des informations.

www.siteduzero.com

Partie 2 : Autour de nos servlets

113/158

Reprenons l'exemple du SDZ : lorsque vous vous connectez, vous pouvez voir une checkbox vous demandant si vous voulez mmoriser ces identifiants. Si vous l'avez coche, il y a un cookie quelque part qui contient vos identifiants et, lorsque vous revenez plus tard sur le site tellement tard que votre session a expir le site rcupre les informations via le cookie, vous connecte automatiquement et redmarre une nouvelle session avec un nouvel identifiant. V oil : je pense qu'un tout petit QCM suffira car ce ft un chapitre plutt court V oil un chapitre de plus qui vous permet de mieux matriser la plate-forme JEE et ce qu'offrent les conteneurs. Dans le prochain chapitre, je vous propose de voir quelque chose qui devrait vous plaire : les filtres.

www.siteduzero.com

Partie 2 : Autour de nos servlets

114/158

Les filtres
Dj, les filtres en JEE n'ont pas grand-chose voir avec les filtres au sens o vous l'entendez (si vous entendez filtre caf). En fait, les filtres permettent d'intercepter les requtes faites au serveur et d'y assigner des tches communes une, plusieurs ou toutes les servlets. Ceci peut s'avrer trs utile par exemple pour encapsuler l'identification, faire des statistiques sur votre application ou encore d'autres choses intressantes. Bon, je me doute que tout ceci doit vous paratre trs flou, je vous propose donc de voir tout a et de mettre un exemple en place.

Fonctionnement
Afin que vous puissiez comprendre comment fonctionnent les filtres, je vous ai prpar un schma :

Dans le cas prsent, le client demande d'accder l'adresse " http://monsite.fr/index ". Ce chemin revient, sur le serveur, invoquer la servlet nomme ServletIndex. Au pralable, via le fichier web.xml , nous avons inform Tomcat que cette servlet utilisera un filtre (qui est une classe java, vous vous en doutiez j'en suis sr). Ce qu'il se passe alors est simple : la requte est reue par le conteneur ; le conteneur sait qu'il doit utiliser un filtre pour la servlet demande ; il invoque le filtre ; ensuite, pendant l'excution du filtre, le contenu de la servlet est excut ; on finit l'excution du filtre ; la rponse est retourne.

On passe deux fois dans le filtre ?

En fait, non C'est l'invocation de la servlet qui est, dans ce cas, encapsule dans le filtre. Maintenant, je vous disais dans l'introduction que les filtres peuvent tre cumuls avant l'invocation d'une servlet, voici un schma vous montrant ce qui peut arriver :

Cette fois, la ressource demande est l'adresse " http://monsite.fr/panier". La servlet associe est ServletPanier laquelle nous avons attach plusieurs filtres (dans un certain ordre dans le fichier web.xml ). Ceux-ci sont excuts tour de rle pour, enfin, invoquer notre servlet et obtenir la rponse. Le plus beau dans l'histoire, c'est que tout est automatique Euh comment le tout est invoqu ?

www.siteduzero.com

Partie 2 : Autour de nos servlets

115/158

En fait, vous devez savoir que ce mode de fonctionnement est li au pattern Interceptor. Celui-ci permet d'ajouter des actions effectuer dans un environnement, sans modifier le fonctionnement de cet environnement. C'est un peu flou, j'en conviens mais, avec les deux exemples ci-dessus, vous devriez comprendre o je veux en venir : le pattern permet d'ajouter du code excuter sans avoir modifier nos objets existants ni leurs faons de travailler. Avant d'aller plus loin dans l'explication, voici les objets que nous allons utiliser et comment ils sont lis entre eux :

En fait, voici ce qu'il se passe dans notre conteneur pour le cas d'une servlet ayant plusieurs filtres : le conteneur cre un objet FilterChain ; il cre un objet concret par filtre et l'ajoute, dans l'ordre, dans l'objet FilterChain. C'est lui qui a la tche d'invoquer les filtres dans l'ordre ; le conteneur appelle, tour de rle et dans l'ordre, la mthode doFilter() des objets implmentant l'interface Filter ; lorsque le dernier filtre a t invoqu (les mthodes doFilter() sont empiles les unes sur les autres), la servlet est son tour appele.

Les mthodes de filtres sont empiles jusqu' l'invocation de la servlet. Ensuite, les invocations se dpilent. V oici un schma reprsentant ce que je viens de dire :

Maintenant que vous savez comment les filtres fonctionnent, nous allons voir un exemple.

Utiliser les filtres


Afin d'avoir une exemple parlant et facile mettre en place, je vous propose de reprendre l'exemple que nous avons utilis dans le chapitre sur les sessions

www.siteduzero.com

Partie 2 : Autour de nos servlets


Nous allons cependant ajouter des filtres tout ceci : un filtre la servlet rcuprant les donnes du formulaire ; deux filtres la servlet affichant les donnes mises en session.

116/158

connexion.jsp
Code : JSP <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Connexion l'application</title> </head> <body> <form name="session" method="POST" action="session.do" /> <table> <tr> <td>Login : </td> <td><input type="text" name="login" /> </td> </tr> <tr> <td>Mot de passe : </td> <td><input type="password" name="password" /> </td> </tr> <tr> <td colspan="2" style="text-align:center"><input type="submit" name="valider" /></td> </tr> </table> </form> </body> </html>

TestFilter.java
Code : Java package com.sdz.session; import java.io.IOException; import import import import import import javax.servlet.RequestDispatcher; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse; javax.servlet.http.HttpSession;

public class TestFilter extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

www.siteduzero.com

Partie 2 : Autour de nos servlets


System.out.println("Traitement dans la servlet : " + this.getServletName() + "."); //On rcupre les identifiants et on les stocke dans notre objet de session String login = req.getParameter("login"); String password = req.getParameter("password"); HttpSession session = req.getSession(); session.setAttribute("login", login); session.setAttribute("password", password); //Maintenant, nous allons utiliser cet objet dans une autre servlet resp.sendRedirect(resp.encodeURL("result.do")); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } doGet(req, resp);

117/158

ResultatFilter.java
Code : Java package com.sdz.session; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import import import import import import javax.servlet.ServletException; javax.servlet.http.Cookie; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse; javax.servlet.http.HttpSession;

public class ResultatFilter extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("Traitement dans la servlet : " + this.getServletName() + "."); HttpSession session = req.getSession(); PrintWriter out = resp.getWriter(); //On va rajouter un attribut s'il n'existe pas //Et, s'il existe, on va l'incrmenter Object increment = session.getAttribute("increment"); if(increment == null){ session.setAttribute("increment", new Integer(1)); } else{ int value = ((Integer)increment).intValue(); session.setAttribute("increment", ++value); } //On affiche l'identifiant de session unique

www.siteduzero.com

Partie 2 : Autour de nos servlets


out.println("<h2>Numro de la session en cours : " + session.getId() + "</h2>"); //On parcourt maintenant le contenu de notre objet session Enumeration e = session.getAttributeNames(); while(e.hasMoreElements()){ String key = (String)e.nextElement(); out.println("<p>Cl : " + key + " - Valeur : " + session.getAttribute(key) + "</p>"); } }

118/158

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }

FirstFilter.java
Code : Java package com.sdz.filter; import java.io.IOException; import import import import import import javax.servlet.Filter; javax.servlet.FilterChain; javax.servlet.FilterConfig; javax.servlet.ServletException; javax.servlet.ServletRequest; javax.servlet.ServletResponse;

public class FirstFilter implements Filter{ private FilterConfig config; public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("Premier filtre."); //C'est via cette instruction que les filtres suivants et la servlet seront invoqus chain.doFilter(request, response); System.out.println("Fin du premier filtre.\n"); } public void init(FilterConfig config) throws ServletException { this.config = config; } }

SecondFilter.java

www.siteduzero.com

Partie 2 : Autour de nos servlets


Code : Java package com.sdz.filter; import java.io.IOException; import import import import import import javax.servlet.Filter; javax.servlet.FilterChain; javax.servlet.FilterConfig; javax.servlet.ServletException; javax.servlet.ServletRequest; javax.servlet.ServletResponse;

119/158

public class SecondFilter implements Filter{ private FilterConfig config; public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("Second filtre."); //C'est via cette instruction que les filtres suivants et la servlet seront invoqus chain.doFilter(request, response); System.out.println("Fin du second filtre.\n"); } public void init(FilterConfig config) throws ServletException { this.config = config; } }

ThirdFilter.java
Code : Java package com.sdz.filter; import java.io.IOException; import import import import import import javax.servlet.Filter; javax.servlet.FilterChain; javax.servlet.FilterConfig; javax.servlet.ServletException; javax.servlet.ServletRequest; javax.servlet.ServletResponse;

public class ThirdFilter implements Filter{ private FilterConfig config; public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("Troisime filtre."); //C'est via cette instruction que les filtres suivants et la servlet seront invoqus chain.doFilter(request, response); System.out.println("Fin du troisime filtre."); }

www.siteduzero.com

Partie 2 : Autour de nos servlets


public void init(FilterConfig config) throws ServletException { this.config = config; } }

120/158

web.xml
Code : XML <web-app> <servlet> <servlet-class>com.sdz.session.TestFilter</servlet-class> <servlet-name>firstFilter</servlet-name> </servlet> <servlet> <servlet-class>com.sdz.session.ResultatFilter</servlet-class> <servlet-name>resultFilter</servlet-name> </servlet> <servlet-mapping> <servlet-name>firstFilter</servlet-name> <url-pattern>/session.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>resultFilter</servlet-name> <url-pattern>/result.do</url-pattern> </servlet-mapping> <filter> <filter-name>firstFilter</filter-name> <filter-class>com.sdz.filter.FirstFilter</filter-class> </filter> <filter> <filter-name>secondFilter</filter-name> <filter-class>com.sdz.filter.SecondFilter</filter-class> </filter> <filter> <filter-name>thirdFilter</filter-name> <filter-class>com.sdz.filter.ThirdFilter</filter-class> </filter> <filter-mapping> <filter-name>firstFilter</filter-name> <servlet-name>firstFilter</servlet-name> </filter-mapping> <filter-mapping> <filter-name>secondFilter</filter-name> <url-pattern>/result.do</url-pattern> </filter-mapping> <filter-mapping> <filter-name>thirdFilter</filter-name> <url-pattern>/result.do</url-pattern> </filter-mapping> </web-app>

www.siteduzero.com

Partie 2 : Autour de nos servlets

121/158

L'affichage nous donne la mme chose que dans le chapitre sur les sessions :

Aprs avoir valid le formulaire :

Et voici ce qui s'affiche dans la console d'Eclipse :

V ous constatez que les filtres sont bien invoqus et que la servlet est bien appele pendant l'excution de la mthode doFilter(). Je vais vous expliquer ce que j'ai fait. Les classes qui servent de filtres doivent implmenter l'interface Filter et, par consquent, redfinir les mthodes de l'interface ; a, vous l'aviez devin, j'en suis sr. Dans la mthode init(FilterConfig config), nous avons initialis une variable d'instance que nous avons ajoute nos filtres. Ceci juste au cas o nous aurions besoin d'accder aux informations vhicules dans cet objet lorsque nous serons dans les mthodes doFilter() ou destroy(). Puis nous avons dfini ce qui devait tre fait dans les mthodes doFilter() de chaque filtre en prenant soin d'invoquer la mthode doFilter() de l'objet FilterChain. Si cette instruction est absente, la pile d'invocation est stoppe et, par consquent, les filtres suivants (s'il y en a) et finalement la servlet ne seront JAMAIS appels : donc, on se retrouve avec une page blanche Essayez de commenter cette ligne de code et vous verrez !

Une fois que toutes les classes sont dfinies, il ne reste plus qu' tout relier via le descripteur de dploiement (le fichier web.xml ). Ceci se fait grce au bloc XML : Code : XML

www.siteduzero.com

Partie 2 : Autour de nos servlets


<filter> <filter-name>nomDuFiltre</filter-name> <filter-class>mon.package.MonFiltre</filter-class> </filter>

122/158

Avec ce bloc, nous informons le conteneur qu'un filtre existe. Maintenant, avec ce bloc : Code : XML <filter-mapping> <filter-name>nomDuFiltre</filter-name> <servlet-name>nomDeLaServlet</servlet-name> </filter-mapping>

ou celui-ci : Code : XML <filter-mapping> <filter-name>nomDuFiltre</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping>

... nous dfinissons sur quel critre appliquer le (ou les) filtre(s) : sur un nom de servlet ; sur une page spcifique ou un sous-ensemble d'URL.

Qu'est-ce que tu veux dire par un sous-ensemble ?

Dans notre exemple utilisant un mapping d'URL, nous avons utilis le critre result.do, mais si nous avions mapp notre servlet avec un sous-nom, comme ceci : Code : XML <servlet-mapping> <servlet-name>resultFilter</servlet-name> <url-pattern>/RESULT/result.do</url-pattern> </servlet-mapping>

... il nous serait alors possible d'ordonner au conteneur d'utiliser le filtre pour les servlets qui ont un chemin contenant le terme " RESULT" : Code : XML <filter-mapping> <filter-name>secondFilter</filter-name> <url-pattern>/RESULT/*</url-pattern> </filter-mapping>

www.siteduzero.com

Partie 2 : Autour de nos servlets

123/158

IMPORTANT : pour dterminer l'ordre des filtres, le conteneur prend en priorit les filtres mapps sur une URL. Une fois tous ces filtres trouvs et crs, le conteneur regarde ensuite les filtres ligibles via un nom de servlet.

a ressemble beaucoup aux blocs utiliss pour dfinir et mapper nos servlets

N'est-ce pas ? C'est tellement vrai que vous avez aussi la possibilit d'affecter des paramtres d'initialisation vos filtres, comme ceci : Code : XML <filter> <filter-name>firstFilter</filter-name> <filter-class>com.sdz.filter.FirstFilter</filter-class> <init-param> <param-name>param</param-name> <param-value>Valeur du paramtre de filtre</param-value> </init-param> </filter>

Ces paramtres sont accessibles via l'objet FilterConfig, objet que nous avons ajout en variable d'instance, vous comprenez mieux pourquoi. V ous aurez pu constater que je n'ai rien mis de particulier dans la mthode destroy(), ceci juste parce qu'il n'y avait rien de spcial mettre Pour tre honnte, il y a fort parier que vous ne vous en servirez jamais.

Filtres et RequestDispatcher
Pourquoi tu veux nous parler de a ?

Je vous demande, dans la servlet TestFilter, de remplacer cette ligne de code : Code : Java resp.sendRedirect(resp.encodeURL("result.do"));

par celle-ci : Code : Java req.getRequestDispatcher("result.do").forward(req, resp);

Maintenant, lorsque vous testez nouveau notre code, vous devriez avoir ceci dans la console :

www.siteduzero.com

Partie 2 : Autour de nos servlets

124/158

Comment a se fait ? Le deuxime filtre ne marche plus !

Ce n'est pas tout fait a Le filtre fonctionne toujours, c'est juste qu'utiliser l'objet RequestDispatcher ne simule pas une nouvelle requte vers la ressource demande (la deuxime servlet dans notre cas), elle se contente de travailler avec. Ce que je ne vous avais pas encore dit propos des filtres, c'est que le dclencheur par dfaut est une requte faite au serveur. En fait, le mapping des filtres prend un paramtre par dfaut qui est celui-ci : Code : XML <filter-mapping> <filter-name>secondFilter</filter-name> <url-pattern>/result.do</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping>

tant donn que c'est la valeur par dfaut, il n'est pas utile de mettre cet attribut. Par contre, vu que nous passons par un RequestDispatcher et que nous souhaitons tout de mme appliquer le filtre, il va falloir complter la dfinition du mapping. Les valeurs autorises pour l'attribut " dispatcher" sont les suivantes : REQUEST : c'est la valeur par dfaut. Cela signifie que le filtre est appliqu : ds qu'il y a une requte faite au serveur ; FORWARD : active le filtre lorsque la mthode forward(request, response) de l'objet RequestDispatcher est invoque ; INCLUDE : active le filtre lorsque la mthode include(request, response) de l'objet RequestDispatcher est invoque ; ERROR : active le filtre lorsqu'il y a une redirection vers une page d'erreurs.

V ous connaissez dj REQUEST et FORWARD, vous vous demandez donc ce que fait la mthode include(request, response). En fait, elle est trs similaire forward(request, response) et afin que vous puissiez en voir clairement la diffrence, je vous invite modifier la servlet TestFilter comme ceci : Code : Java package com.sdz.session; import java.io.IOException; import java.io.PrintWriter; import import import import import javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse; javax.servlet.http.HttpSession;

public class TestFilter extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp)

www.siteduzero.com

Partie 2 : Autour de nos servlets


throws ServletException, IOException { System.out.println("Traitement dans la servlet : " + this.getServletName() + "."); //On rcupre les identifiants et on les stocke dans notre objet de session String login = req.getParameter("login"); String password = req.getParameter("password"); HttpSession session = req.getSession(); session.setAttribute("login", login); session.setAttribute("password", password); PrintWriter out = resp.getWriter(); out.println("<h2>include</h2>"); //Maintenant, nous allons utiliser cet objet dans une autre servlet req.getRequestDispatcher("result.do").forward(req, resp); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } doGet(req, resp);

125/158

On a juste crit quelque chose dans la rponse avant d'invoquer la deuxime servlet. Lorsque vous testez votre code, rien ne change. Maintenant, la place de forward, mettez include, comme ceci req.getRequestDispatcher("result.do").include(req, resp);, testez nouveau votre code et voici ce que a nous donne :

La voil, la diffrence ! L'instruction include n'efface pas ce que vous avez crit dans la rponse alors que forward, oui ! ERROR, lui, est utilis lorsque nous capturons une erreur. Qu'est-ce que tu entends par l ?

Ne vous en faites pas, nous allons aborder ce point dans le prochain chapitre, mais sachez que JEE offre un moyen de grer des erreurs, que ce soit des erreurs du serveur WEB ou des exceptions de Java. Maintenant, pour rgler notre problme de filtre, c'est trs simple, il suffit d'ajouter le (ou les) type(s), comme ceci : Code : XML <filter-mapping> <filter-name>secondFilter</filter-name> <url-pattern>/result.do</url-pattern> <dispatcher>REQUEST</dispatcher>

www.siteduzero.com

Partie 2 : Autour de nos servlets


<dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping>

126/158

Par contre, le contenu de la console d'Eclipse a quelque peu chang :

Et c'est tout fait normal puisqu'il n'y a pas de renvoi de requte et que les servlets se suivent dans le traitement. Bon : je crois qu'il est temps de faire un petit QCM. Rien de bien sorcier l encore. Mais vous conviendrez que a peut s'avrer fort utile.

www.siteduzero.com

Partie 2 : Autour de nos servlets

127/158

Gestion des erreurs et page d'accueil


Je vous l'avais dit dans le prcdent chapitre : la plate-forme JEE offre une gestion des erreurs qui vous permet, entre autres, d'appliquer des filtres. En plus de a, vous pouvez aussi afficher des pages spcifiques selon que l'erreur provienne d'un problme de page non trouve, d'une exception Java Ce chapitre ne sera pas trs dur et sera relativement court, mais il n'en sera pas moins intressant.

Erreurs HTTP
V ous vous en souvenez peut-tre, je vous avais fait un tat des lieux des messages HTTP dans la partie I. Allez, je suis sympa, les voici de nouveau : Code 1XX, rponse provisoire : 100 : OK pour continuer, 101 : le serveur a chang de protocole ; Code 2XX, russite : 200 : (ok) la requte a t traite avec succs, 201 : (object created, reason = new URI) document cr, 202 : (async completion (TBS)) requte acheve de manire asynchrone, 203 : (partial completion) requte acheve de manire incomplte, 204 : (no info to return) aucune information retourner, 205 : (request completed, but clear form) requte termine mais formulaire vide, 206 : (partial GET furfilled) requte GET incomplte ; Code 3XX, redirection : 300 : (server couldn't decide what to return) code de retour impossible dterminer par le serveur, 301 : (object permanently moved) document dplac dfinitivement, 302 : (object temporarily moved) document dplac temporairement, 303 : (redirection with new access method) redirection avec nouvelle mthode d'accs, 304 : (if-modified-since was not modified) le champ 'if-modified-since' n'tait pas modifi, 305 : (redirection to proxy, location header specifies proxy to use) redirection vers un proxy spcifi par l'entte, 307 : (HTTP/1.1: keep same verb) HTTP/1.1 ; Code 4XX, erreur de requte client : 400 : (invalid syntax) erreur de syntaxe, 401 : (access denied) pas d'autorisation d'accs au document, 402 : (payment required) accs au document payant, 403 : (forbidden) la ressource demande existe mais vous n'avez pas le droit d'y accder, 404 : (page not found) la ressource demande n'existe pas sur le serveur, 405 : (method is not allowed) mthode de requte du formulaire non autorise, 406 : (no response acceptable to client found) requte non accepte par le serveur, 407 : (proxy authentication required) autorisation du proxy ncessaire, 408 : (server timed out waiting for request) temps d'accs la page demande expir, 409 : (user should resubmit with more info) l'utilisateur doit soumettre nouveau avec plus d'infos, 410 : (the resource is no longer available) cette ressource n'est plus disponible, 411 : (the server refused to accept request w/o a length) le server a refus la requte car elle n'a pas de longueur, 412 : (precondition given in request failed) la prcondition donne dans la requte a chou, 413 : (request entity was too large) l'entit de la requte tait trop grande, 414 : (request URI too long) l'URI de la requte tait trop longue, 415 : (unsupported media type) type de mdia non gr ; Code 5XX, erreur du serveur : 500 : (internal server error) erreur interne du serveur, 501 : (required not supported) requte faite au serveur non supporte,, 502 : (error response received from gateway) mauvaise passerelle d'accs, 503 : (temporarily overloaded) service non disponible, 504 : (timed out waiting for gateway) temps d'accs la passerelle expir, 505 : (HTTP version not supported) version HTTP non gre.

Rappelez-vous, les erreurs correspondent aux codes commenant par 4 (erreur du client) ou 5 (erreur du serveur) et ce sont celles-ci que nous allons capturer et grer. En fait, depuis quelques chapitres, nous utilisons toujours le mme code d'exemple et, sauf si vous tapez l'URL entire chaque fois pour accder la page de connexion, vous devez voir systmatiquement s'afficher une belle erreur 404. Ceci est normal car,

www.siteduzero.com

Partie 2 : Autour de nos servlets

128/158

lorsque vous saisissez une requte ne pointant pas vers une page spcifique, par dfaut, le serveur regarde si une page s'appellant index est prsente dans l'arborescence dans laquelle vous vous trouvez. Dans le cas contraire, le serveur interprte la demande du client comme une erreur d'URL provenant du client et renvoie donc l'erreur 404. Si nous reprenons l'application utilise dans le chapitre prcdent, lorsque vous cliquez sur le lien permettant d'y accder dans Tomcat Manager, vous devriez obtenir ceci :

V ous l'aurez sans doute devin, c'est dans le fichier web.xml que nous allons grer ces cas de figure. Ce que nous allons faire, c'est afficher une page que nous aurons code au pralable. Appelons-la 404.jsp et mettons-la la racine de notre application. V oici son code source (j'y ai ajout un peu de fantaisie... Code : JSP <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ page import="java.awt.Color" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>ERREUR 404 : page non trouve</title> </head> <body> <% Color tab[] = { new Color(Color.lightGray.getRGB()), Color.gray, Color.darkGray, Color.black, Color.red, Color.pink, Color.orange, Color.yellow, Color.green, Color.magenta, Color.cyan, Color.blue }; String titre = "ERREUR 404"; String message = "La page demande n'est pas disponible ! "; char tabTitre[] = titre.toCharArray(); out.print("<h1>"); for(int i = 0, j = 0; i < tabTitre.length; i++, j++){ if(j == tab.length) j = 0; out.print("<span style=\"color:rgb(" + tab[j].getRed() + ", " + ):

www.siteduzero.com

Partie 2 : Autour de nos servlets


tab[j].getGreen() + ", " + tab[j].getBlue() + ")\">" + tabTitre[i] + "</span>"); } out.print("</h1>"); char tabMessage[] = message.toCharArray(); out.print("<p>"); for(int i = 0, j = 0; i < tabMessage.length; i++, j++){ if(j == tab.length) j = 0; out.print("<span style=\"color:rgb(" + tab[j].getRed() + ", " + tab[j].getGreen() + ", " + tab[j].getBlue() + ")\">" + tabMessage[i] + "</span>"); } out.print("</p>"); %> </body> </html>

129/158

Nous allons bientt voir quoi ressemble cette page, mais il nous reste maintenant configurer notre application afin que celleci affiche notre page la place de celle fournie par Tomcat. Ceci se fait, dans le fichier web.xml , grce au bloc suivant : Code : XML <error-page> <error-code>code de l'erreur intercepter</error-code> <location>URL de la page afficher lorsque cette erreur survient</location> </error-page>

Dans le bloc <error-code></error-code>, nous n'avons qu' insrer le code intercepter, dans notre cas : 404. Ensuite, dans le bloc <location></location>, pour que Tomcat sache, en toute circonstance, trouver la page afficher, il faut mettre le chemin absolu menant celle-ci ; donc, le chemin DOIT commencer par un " /" ! Ce qui nous donne : Code : XML <error-page> <error-code>404</error-code> <location>/404.jsp</location> </error-page>

Redmarrez Tomcat, retournez dans Tomcat Manager et cliquez de nouveau sur le lien menant l'erreur 404. V ous devriez maintenant obtenir ceci :

www.siteduzero.com

Partie 2 : Autour de nos servlets

130/158

V oil : c'est tout simple. Maintenant, si vous souhaitez intercepter une autre erreur, il vous suffit de ritrer ce que nous venons de faire et le tour est jou. Je vous propose prsent de voir comment grer les erreurs pendant les traitements.

Grer les exceptions


Vu que vous pourriez avoir besoin d'afficher une page spcifique lorsqu'une exception Java est leve, nous allons aborder ce point tout de suite. Le principe est le mme que pour les erreurs HTTP sauf que, cette fois, nous allons dire Tomcat d'afficher une page spcifique lorsque une exception d'un certain type est leve. Prenons comme exemple une bte servlet qui, malheureusement, fait une division par zro. V oici ce que pourrait donner l'excution de celle-ci (je ne vous la fournis pas, vous tes capables de la faire tout seul maintenant ):

V ous pouvez voir l'exception qui est leve : ArithmeticException. Comme prcdemment, nous allons crer une page spcifique afin de l'afficher en cas d'exception. La voici : Code : JSP <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>ArithmeticException</title> </head> <body> <p>Une exception de type :

www.siteduzero.com

Partie 2 : Autour de nos servlets


<strong>java.lang.ArithleticException</strong> a t dtecte !</p> </body> </html>

131/158

Il ne nous reste plus qu' insrer le bloc de configuration dans le fichier web.xml . V oici celui que j'ai utilis : Code : XML <error-page> <exception-type>java.lang.ArithmeticException</exception-type> <location>/arithmetic.jsp</location> </error-page>

La seule diffrence avec le bloc vu prcdemment, c'est ce qu'on dclare : une classe Java au lieu d'une erreur HTTP. Par contre, n'omettez pas le nom de package, sinon a ne fonctionnera pas... Une fois ceci fait, voil ce que j'ai obtenu en lieu et place de l'erreur renvoye par Tomcat :

Alors ? Je ne vous avais pas dit que c'tait vraiment enfantin ? Petite question : dans ton exemple, le serveur retourne une erreur HTTP 500. Si nous avions aussi configur une page pour cette erreur en plus de la page pour l'exception, que se passerait-il ?

Je vous invite essayer : vous aurez votre rponse ; vous verrez que la page mappe sur une exception est prioritaire sur la page d'erreur HTTP. Une dernire chose, vous ne pouvez pas cumuler les types dans le bloc XML, ainsi ceci : Code : XML <error-page> <error-code>404</error-code> <exception-type>java.lang.ArithmeticException</exception-type> <location>/arithmetic.jsp</location> </error-page>

... n'est pas permis ! Alors, attention. Bon : nous avons vu comment grer des erreurs ; maintenant, je vais vous montrer comment paramtrer la page par dfaut lorsqu'on arrive sur l'application.

Configurer vos pages par dfaut


Un petit rappel est de mise avant de parler de ceci... V ous devez savoir que lorsque vous naviguez sur un site, quand vous arrivez l'accueil ou, plus globalement, lorsque l'URL renseigne ne pointe pas vers un fichier mais vers un dossier, vous avez tout de mme, en rgle gnrale, une page qui s'affiche. Prenons un exemple concret. Lorsque vous arrivez sur le Site du Zro, l'URL dans votre navigateur est la suivante : http://www.siteduzero.com/ . Normalement, vous avez tout de mme une page devant les yeux. Pourtant, aucun fichier n'est spcifi... Comment c'est possible ?

www.siteduzero.com

Partie 2 : Autour de nos servlets

132/158

En fait, c'est comme si vous aviez tap http://www.siteduzero.com/index.html . Sur votre site prfr, la page d'accueil par dfaut est index.html sauf que, vu que c'est celle par dfaut, il n'est pas ncessaire de la spcifier : le serveur le fait de faon implicite. Ce dernier ne voit pas de nom de fichier, il regarde donc s'il y a une page du nom de la page par dfaut ; si oui, il l'affiche et dans le cas contraire : erreur ! Ce mode de fonctionnement s'applique tous les dossiers d'un site. Regardez ce schma :

Sur ce schma, vous pouvez voir que, sur notre site, seul le dossier la racine de notre application et le dossier " dossier2 " ont une page par dfaut ; appelons-la, pour l'exemple, default.jsp. De ce fait, voici les adresses qui vous afficheront une page : http://www.monsite.com ; http://www.monsite.com/default.jsp ; http://www.monsite.com/dossier2/ ; http://www.monsite.com/dossier2/default.jsp.

Par contre, si on saisit l'adresse http://www.monsite.com/dossier1/ , deux cas de figure sont possibles : le serveur autorise la navigation dans les dossiers ; dans ce cas, vous verrez une liste de fichiers et/ou de dossiers, comme ceci :

www.siteduzero.com

Partie 2 : Autour de nos servlets

133/158

le serveur n'autorise pas la navigation dans les dossiers et l, vous aurez une erreur vous indiquant que vous n'avez pas le droit d'accs, comme sur cette image :

On comprend, mais comment fait le conteneur pour savoir qu'une page est dfinie comme tant une page par dfaut ?

C'est simple, c'est configur dans le fichier <rpertoire d'installation de Tomcat>/conf/web.xml et, tout au bout de ce fichier vous trouverez ceci : Code : XML <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list>

Maintenant, vous savez quel nom doivent avoir les pages pour qu'elles soient considres comme pages par dfaut. La bonne nouvelle, c'est que vous pouvez redfinir ceci dans le fichier web.xml de votre application, et, ainsi, dfinir vos propres noms de fichiers comme page par dfaut. Dans les exemples prcdents, nous n'accdions pas directement la page connexion.jsp. Maintenant, c'est le moment d'ajouter une petite dfinition dans notre fichier web.xml : Code : XML

www.siteduzero.com

Partie 2 : Autour de nos servlets


<welcome-file-list> <welcome-file>connexion.jsp</welcome-file> </welcome-file-list>

134/158

Une fois ces lignes ajoutes, je vous invite redmarrer Tomcat et retourner dans Tomcat Manager afin d'aller dans notre exemple... Magie ! V ous accdez directement la page de connexion, sans spcifier explicitement son nom : connexion.jsp fait maintenant partie des noms de fichiers que Tomcat prend comme fichier par dfaut. Deux prcisions avant de terminer ce chapitre. V ous aurez remarqu que les noms de fichiers, dans le descripteur de dploiement, ne commencent pas par un " / " ; ensuite, lorsque vous redfinissez les pages par dfaut, la configuration au niveau de Tomcat est supplante : n'oubliez pas de mettre les fichiers standard (index.html , index.jsp et index.htm) si vous souhaitez les utiliser. Une petite question : comment se passeraient les choses s'il y avait, dans un mme dossier, deux fichiers portant des noms de fichiers par dfaut ? C'est trs simple : Tomcat prendrait le premier nom de fichier et le considrerait comme prioritaire. Par exemple, si nous avons ceci dans notre descripteur de dploiement : Code : XML <welcome-file-list> <welcome-file>index.jsp</welcome-file> <welcome-file>connexion.jsp</welcome-file> </welcome-file-list>

et si les deux fichiers se trouvaient dans le mme rpertoire que vous appelez, c'est index.jsp qui sera affich. Essayez et vous verrez (n'hsitez pas inverser l'ordre des fichiers dans le descripteur de dploiement...). V oil : vous venez d'apprendre pas mal de choses, je vous propose donc un QCM. Alors ? Je vous avais dit qu'il ne serait pas mchant, ce chapitre. Avant de passer la partie III, je crois qu'il est maintenant temps de mettre tout a en pratique.

www.siteduzero.com

Partie 2 : Autour de nos servlets

135/158

TP : un espace de connexion
Dans ce TP, nous allons utiliser tout ce que nous avons vu dans cette partie... Je vous souhaite bon courage car il va y avoir du travail.

Cahier des charges


Je veux que vous fassiez une page de connexion ouvrant l'accs trois pages (JSP). Trop simple ? Attendez. Il faut : qu'on vous demande de vous connecter en saisissant un login et un mot de passe avec, en plus, la possibilit de stocker les donnes en cookie ; que la page de connexion ne s'appelle pas index mais que vous soyez automatiquement dirig vers elle ; la validation du formulaire de connexion, que vous utilisiez un filtre afin de dterminer si la servlet devant grer la session doit tre appele ou non ; dans le cas o il manque l'un des deux paramtres, qu'une exception de votre cru soit leve dans le filtre, ce qui aura pour consquence d'afficher une page spcifique cette exception ; dans le cas o tout se passe bien, que vous stockiez les informations saisies en session et, le cas chant, en cookie ; si tout s'est bien pass, que la servlet de connexion oriente votre navigation vers une page JSP offrant la possibilit de naviguer vers deux autres JSP mais aussi de se dconnecter ; que toute mauvaise URL saisie affiche une page d'erreur 404 personnalise si vous tes connect ; sinon, qu'elle affiche la page de connexion.

V oil grosso modo le fonctionnement de votre application :

Ceci dit, j'ai de petites recommandations et astuces vous fournir.

www.siteduzero.com

Partie 2 : Autour de nos servlets

136/158

L'exception personnalise
Le filtre que vous aller dvelopper devra lever une exception en cas de problme. Par contre, la mthode doFilter() lve soit une IOException soit une ServletException. Je vous recommande de faire hriter votre exception de la classe ServletException.

Accder la session dans un filtre


Attention : dans un objet de type Filter, ce ne sont pas des objets HttpServletRequest et HttpServletResponse que nous avons en paramtres. Donc, afin de pouvoir rcuprer notre session, il faudra caster...

Dtruire une session


Pour dtruire une session, il suffit d'invoquer la mthode invalidate() de l'objet HttpSession.

Copies d'cran

V ous trouverez ci-dessous diffrentes copies d'cran de ce que j'ai obtenu.

La page de connexion

La page d'erreur en cas de manque d'information

Les trois pages JSP dans lesquelles vous pourrez naviguer

www.siteduzero.com

Partie 2 : Autour de nos servlets

137/158

Ce que vous pouvez obtenir aprs avoir cliqu sur "se dconnecter" si vous avez un cookie

La page d'erreur 404

Bon : maintenant, vos crayons claviers.

Correction
Bon, accrochez-vous car il y a pas mal de fichiers. Secret (cliquez pour afficher)

www.siteduzero.com

Partie 2 : Autour de nos servlets

138/158

Les JSP
connection.jsp
Code : JSP <%@ page language="java" contentType="text/html; charset=ISO-88591" pageEncoding="ISO-8859-1"%> <%@ page import="java.util.HashMap" %> <% //On rcupre la liste des cookies Cookie[] cookies = request.getCookies(); HashMap map = new HashMap(); //S'il y a au moins un cookie, on stocke les cls-valeurs dans une Map if(cookies != null){ for(Cookie cookie : cookies){ map.put(cookie.getName(), cookie.getValue()); } } //Ainsi, si des donnes existent, on pourra prremplir les champs de notre formulaire %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Connexion l'application</title> </head> <body> <form name="session" method="POST" action="connexion.do" /> <table style=" margin:auto; margin-top:50px; border-collapse:collapse; width:350px; text-align:right"> <thead> <tr> <td colspan=2 style=" background-color:#404AA4; color:white; font-weight:bold; text-align:center" >Connexion</td> </tr> </thead> <tbody style=" background-color:#AAB0DF; border-radius-bottom-left:5px; border-radius-bottom-right:5px;" > <tr> <td>Login : </td> <td style="text-align:left;padding-left:20px"> <input type="text" name="login" value="<%=((map.get("login")

www.siteduzero.com

Partie 2 : Autour de nos servlets


!= null) ? map.get("login") : "") %>"/> </td> </tr> <tr> <td>Mot de passe : </td> <td style="text-align:left;padding-left:20px" > <input type="password" name="password" value="<%=((map.get("login") != null) ? map.get("password") : "") %>"/> </td> </tr> <tr> <td>Connexion automatique</td> <td style="text-align:left;padding-left:20px" > <input type="checkbox" name="auto_connect" value="Y" <%=(((map.get("login") != null) && (map.get("login") != null)) ? "checked" : "") %>/> </td> </tr> <tr> <td colspan="2" style="text-align:center"> <input type="submit" name="valider" /></td> </tr> </tbody> </table> </form> </body> </html>

139/158

page1.jsp
Code : JSP <%@ page language="java" contentType="text/html; charset=ISO-88591" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Page 1</title> </head> <body> <table style=" margin:auto; margin-top:50px; border-collapse:collapse; width:350px; text-align:right"> <thead> <tr> <td style=" background-color:white; color:#404AA4; font-weight:bold; text-align:center" >Page 1 </td>

www.siteduzero.com

Partie 2 : Autour de nos servlets


<td style=" background-color:#404AA4; color:white; font-weight:bold; text-align:center; border:1px solid black" > <a href="http://localhost:8080/TP2 CONNEXION/pages/page2.jsp" style="color:white;textdecoration:none">Page 2</a> </td> <td style=" background-color:#404AA4; color:white; font-weight:bold; text-align:center; border:1px solid black" > <a href="http://localhost:8080/TP2 CONNEXION/pages/page3.jsp" style="color:white;textdecoration:none">Page 3</a> </td> <td style=" background-color:#404AA4; color:white; font-weight:bold; text-align:center; border:1px solid black" > <a href="http://localhost:8080/TP2 - CONNEXION/disconnect.do" style="color:white;text-decoration:none">Se dconnecter</a> </td> </tr> </thead> <tbody style=" background-color:#AAB0DF; height:150px; text-align:center; border:1px solid black " > <tr> <td colspan=4>Vous tes sur la page 1.</td> </tr> </tbody> </table> </body> </html>

140/158

page2.jsp
Code : JSP <%@ page language="java" contentType="text/html; charset=ISO-88591" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head>

www.siteduzero.com

Partie 2 : Autour de nos servlets


<meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Page 2</title> </head> <body> <table style=" margin:auto; margin-top:50px; border-collapse:collapse; width:350px; text-align:right"> <thead> <tr> <td style=" background-color:#404AA4; color:white; font-weight:bold; text-align:center; border:1px solid black" > <a href="http://localhost:8080/TP2 CONNEXION/pages/page1.jsp" style="color:white;textdecoration:none">Page 1</a> </td> <td style=" background-color:white; color:#404AA4; font-weight:bold; text-align:center" > Page 2 </td> <td style=" background-color:#404AA4; color:white; font-weight:bold; text-align:center; border:1px solid black" > <a href="http://localhost:8080/TP2 CONNEXION/pages/page3.jsp" style="color:white;textdecoration:none">Page 3</a> </td> <td style=" background-color:#404AA4; color:white; font-weight:bold; text-align:center; border:1px solid black" > <a href="http://localhost:8080/TP2 - CONNEXION/disconnect.do" style="color:white;text-decoration:none">Se dconnecter</a> </td> </tr> </thead> <tbody style=" background-color:#AAB0DF; height:150px; text-align:center; border:1px solid black

141/158

www.siteduzero.com

Partie 2 : Autour de nos servlets


" > <tr> <td colspan=4>Vous tes sur la page 2.</td> </tr> </tbody> </table>

142/158

</body> </html>

page3.jsp
Code : JSP <%@ page language="java" contentType="text/html; charset=ISO-88591" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Page 3</title> </head> <body> <table style=" margin:auto; margin-top:50px; border-collapse:collapse; width:350px; text-align:right"> <thead> <tr> <td style=" background-color:#404AA4; color:white; font-weight:bold; text-align:center; border:1px solid black" > <a href="http://localhost:8080/TP2 CONNEXION/pages/page1.jsp" style="color:white;textdecoration:none;">Page 1</a> </td> <td style=" background-color:#404AA4; color:white; font-weight:bold; text-align:center; border:1px solid black; " > <a href="http://localhost:8080/TP2 CONNEXION/pages/page2.jsp" style="color:white;textdecoration:none">Page 2</a> </td> <td style=" background-color:white;

www.siteduzero.com

Partie 2 : Autour de nos servlets


color:#404AA4; font-weight:bold; text-align:center" > Page 3 </td> <td style=" background-color:#404AA4; color:white; font-weight:bold; text-align:center; border:1px solid black" > <a href="http://localhost:8080/TP2 - CONNEXION/disconnect.do" style="color:white;text-decoration:none">Se dconnecter</a> </td> </tr> </thead> <tbody style=" background-color:#AAB0DF; height:150px; text-align:center; border:1px solid black " > <tr> <td colspan=4>Vous tes sur la page 3.</td> </tr> </tbody> </table> </body> </html>

143/158

error.jsp
Code : JSP <%@ page language="java" contentType="text/html; charset=ISO-88591" pageEncoding="ISO-8859-1"%> <%@ page import="java.awt.Color" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Erreur de connexion</title> </head> <body> <table style=" margin:auto; margin-top:50px; border-collapse:collapse; width:350px; text-align:right"> <thead> <tr> <td

www.siteduzero.com

Partie 2 : Autour de nos servlets


style=" background-color:#404AA4; color:white; font-weight:bold; text-align:center" >Erreur lors de la connexion ! </td> </tr> </tr> </thead> <tbody style=" background-color:#AAB0DF; border-radius-bottom-left:5px; border-radius-bottom-right:5px;" > <tr> <td style="text-align:left;padding-left:20px"> Des paramtres manquent afin de pouvoir vous connecter. Veuillez ressayer en cliquant sur <a href="connexion.jsp">ce lien</a>. </td> </tr> </tbody> </table> </body> </html>

144/158

404.jsp
Code : JSP <%@ page language="java" contentType="text/html; charset=ISO-88591" pageEncoding="ISO-8859-1"%> <%@ page import="java.awt.Color" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>ERREUR 404 : page non trouve</title> </head> <body> <% Color tab[] = { new Color(Color.lightGray.getRGB()), Color.gray, Color.darkGray, Color.black, Color.red, Color.pink, Color.orange, Color.yellow, Color.green, Color.magenta, Color.cyan, Color.blue }; String titre = "ERREUR 404"; String message = "La page demande n'est pas disponible ! "; char tabTitre[] = titre.toCharArray();

www.siteduzero.com

Partie 2 : Autour de nos servlets


out.print("<h1>"); for(int i = 0, j = 0; i < tabTitre.length; i++, j++){ if(j == tab.length) j = 0; out.print("<span style=\"color:rgb(" + tab[j].getRed() + ", " + tab[j].getGreen() + ", " + tab[j].getBlue() + ")\">" + tabTitre[i] + "</span>"); } out.print("</h1>"); char tabMessage[] = message.toCharArray(); out.print("<p>"); for(int i = 0, j = 0; i < tabMessage.length; i++, j++){ if(j == tab.length) j = 0; out.print("<span style=\"color:rgb(" + tab[j].getRed() + ", " + tab[j].getGreen() + ", " + tab[j].getBlue() + ")\">" + tabMessage[i] + "</span>"); } out.print("</p>"); %> </body> </html>

145/158

Les servlets
ConnexionServlet.java
Code : Java package com.sdz.servlet; import java.io.IOException; import import import import import import javax.servlet.ServletException; javax.servlet.http.Cookie; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse; javax.servlet.http.HttpSession;

public class ConnexionServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ String login = (String)request.getParameter("login"); String password = (String)request.getParameter("password"); HttpSession session = request.getSession(); session.setAttribute("login", login); session.setAttribute("password", password); //La gestion du cookie if(request.getParameter("auto_connect") != null){ System.out.println("Cration des cookies.");

www.siteduzero.com

Partie 2 : Autour de nos servlets


Cookie loginCookie = new Cookie("login", login); Cookie passwordCookie = new Cookie("password", password); response.addCookie(loginCookie); response.addCookie(passwordCookie);

146/158

request.getRequestDispatcher("pages/page1.jsp").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ doGet(request, response); } }

DisconnectServlet.java
Code : Java package com.sdz.servlet; import java.io.IOException; import import import import javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

public class DisconnectServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ request.getSession().invalidate(); request.getRequestDispatcher("connexion.jsp").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ doGet(request, response); } }

Le filtre et l'exception
ConnexionException.java
Code : Java package com.sdz.exception; import javax.servlet.ServletException;

www.siteduzero.com

Partie 2 : Autour de nos servlets


public class ConnexionException extends ServletException { public ConnexionException(){} public ConnexionException(String message){ super(message); }

147/158

ConnexionFilter.java
Code : Java package com.sdz.filter; import java.io.IOException; import import import import import import import import javax.servlet.Filter; javax.servlet.FilterChain; javax.servlet.FilterConfig; javax.servlet.ServletException; javax.servlet.ServletRequest; javax.servlet.ServletResponse; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpSession;

public class ConnexionFilter implements Filter{ private FilterConfig config; public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("Contrle des identifiants de connexion."); //On contrle l'existence de la session HttpSession session = ((HttpServletRequest)request).getSession(); if(session.getAttribute("login") != null && session.getAttribute("password") != null){ //Si on a des donnes en session, c'est qu'on est connect chain.doFilter(request, response); } else{ String login = request.getParameter("login"); String password = request.getParameter("password"); //On vrifie ensuite si on a pas de formulaire de connexion valid if(login != null && password != null){ //Si on a des donnes en session, c'est qu'on est connect System.out.println("Il y a des donnes : " + login + " - " + password + " !"); if(login.trim().equals("") || password.trim().equals("")) { throw new com.sdz.exception.ConnexionException("Vous devez renseigner au moins l'un des champs du formulaire"); } chain.doFilter(request, response);

www.siteduzero.com

Partie 2 : Autour de nos servlets


} else{ //Sinon, on retourne la page de connexion System.out.println("Pas de session, on oriente donc vers la page de connexion."); request.getRequestDispatcher("/connexion.jsp").forward(request, response); } } } public void init(FilterConfig config) throws ServletException { this.config = config; } }

148/158

Le fichier web.xml
Code : XML <web-app> <servlet> <servlet-class>com.sdz.servlet.ConnexionServlet</servlet-class> <servlet-name>connexionServlet</servlet-name> </servlet> <servlet> <servlet-class>com.sdz.servlet.DisconnectServlet</servlet-class> <servlet-name>deconnexionServlet</servlet-name> </servlet> <servlet-mapping> <servlet-name>connexionServlet</servlet-name> <url-pattern>/connexion.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>deconnexionServlet</servlet-name> <url-pattern>/disconnect.do</url-pattern> </servlet-mapping> <error-page> <error-code>404</error-code> <location>/404.jsp</location> </error-page> <error-page> <exceptiontype>com.sdz.exception.ConnexionException</exception-type> <location>/error.jsp</location> </error-page> <filter> <filter-name>connexionFilter</filter-name> <filter-class>com.sdz.filter.ConnexionFilter</filter-class> </filter> <filter-mapping> <filter-name>connexionFilter</filter-name> <servlet-name>*</servlet-name> </filter-mapping>

www.siteduzero.com

Partie 2 : Autour de nos servlets


<welcome-file-list> <welcome-file>connexion.jsp</welcome-file> </welcome-file-list> </web-app>

149/158

Bien sr, vous aurez remarqu que la gestion des liens n'tait pas trs lgante, que les pages JSP ont beaucoup de code dupliqu, etc. Grce la partie suivante, nous aurons plus de nettet : encore un peu de patience... Bon, nous avons approfondi l'utilisation des servlets et leur environnement. Cette partie a t riche en nouveauts mais rien de bien mchant. Dans la partie suivante, nous allons nous focaliser sur nos JSP. Comment le conteneur les gre, ce qu'on peut faire avec... V ous vous rendrez trs vite compte que le conteneur les traite de la mme faon que nos servlets, et pour cause. Maintenant que nous avons pu voir plus en dtail les servlets, il est temps de passer aux JSP... Encore un gros morceau en perspective.

www.siteduzero.com

Partie 3 : Autour de nos JSP

150/158

Partie 3 : Autour de nos JSP


Dans cette partie, nous allons approfondir nos connaissances sur les JSP et ce qui les entourent. V ous allez voir qu'il y a encore beaucoup de choses apprendre : - la faon dont elle sont gres; - leur langage d'expression; - les bibliothques JSTL;

Je vous propose donc de ne pas perdre plus de temps en bavardage et de nous y mettre ds maintenant.

Cycle de vie d'une JSP


Dans ce chapitre, vous allez apprendre comment cela se passe chez notre ami le conteneur. V ous en saurez un peu plus sur la vie de ces pages web dynamiques que l'on appelle communment JSP. Certains vieux conteneurs, dont vous avez peut-tre dj entendu parler, ne supportent pas l'un des deux lments de base de la plate-forme JEE. Cet lment est-il une servlet ou une JSP ? Beaucoup pensent qu'il s'agit des servlets. Eh bien ils ont tort ! Ce sont les JSP qui ne sont pas supportes ! Pourquoi ?

Tout simplement parce que les JSP ont un cycle de vie un peu plus compliqu que nos servlets... Cependant, aussi complexe soit ce cycle de vie, toutes nos JSP sortiront de leurs chrysalides afin de se transformer en servlets et tre utilises par le conteneur !

Que savons-nous ?
Avant de vous narrer la vie d'une JSP, faisons un peu le point sur ce que nous savons. Tout d'abord, vous avez appris qu'une JSP est une page web dans laquelle du code Java a t insr, ceci, via les balises <% %> ou par <%= %>. V ous savez aussi que c'est l'intrieur de ces balises que vous insrez votre code Java. Tout code prsent entre ces balises s'appelle un scriptlet !

Lorsque, dans vos JSP, vous utilisez des objets ncessitant un import, vous avez le choix de faire cet import ou d'utiliser le nom complet de l'objet (avec le nom de package) afin de pouvoir l'instancier et l'utiliser. Donc, faire ceci : Code : JSP <%@ page import="java.util.Date" %> <!-- Code HTML --> <p> <%= new Date() %> </p>

Ou ceci : Code : JSP <!-- Code HTML --> <p> <%= new java.util.Date() %> </p>

www.siteduzero.com

Partie 3 : Autour de nos JSP


Nous approfondirons la balise d'import d'ici peu de temps, mais pas tout de suite... V ous n'ignorez pas qu'il existe des objets dont l'import n'est pas ncessaire. V ous en connaissez dj trois : (PrintWriter) out ; (HttpServletRequest) request ; (HttpServletResponse) response.

151/158

Mais il y en a d'autres, nous y viendrons bientt, je vous rassure... Bon, vous voyez d'autres choses ? Euh... Non...

Ah oui ! C'est tout ! Je pensais vous en avoir dit plus que a... Le moment est venu d'en apprendre davantage sur nos chres JSP !

De JSP servlet
Je vous l'ai dj dit dans l'introduction mais nos JSP se transforment en servlets ! Non, vous ne rvez pas et vous m'avez bien compris. D'ailleurs, afin d'appuyer mes dires, je vous invite crer une simple JSP sans code spcial. Nous l'appellerons index.jsp et nous la mettrons la racine de notre projet, nouveau projet que nous allons appeler " CONTENEUR". V oici le code de cette dernire : Code : JSP <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Titre de notre JSP</title> </head> <body> </body> </html>

Il s'agit tout bonnement du code gnr par Eclipse lorsque vous faites " file/new/web/jsp". Je vous invite aller, dans votre navigateur, voir notre page l'adresse http://localhost:8080/CONTENEUR/index.jsp. Celle-ci n'affiche rien du tout ; par contre, quelque part dans votre projet, cette page JSP toute simple est devenue une servlet. O a ?

Allez faire un tour dans le dossier "work" de votre projet, vous pouvez d'ailleurs y accder depuis Eclipse :

www.siteduzero.com

Partie 3 : Autour de nos JSP

152/158

Dj, vous aurez remarqu qu'il y a un package nomm org.apache.jsp et que dans celui-ci, il y a une classe Java qui a un nom trangement familier : index_jsp.java. C'est un nom qui ressemble normment index.jsp, n'est-ce pas ? V oici son contenu : Code : Java package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory(); private static java.util.List _jspx_dependants; private javax.el.ExpressionFactory _el_expressionfactory; private org.apache.AnnotationProcessor _jsp_annotationprocessor; public Object getDependants() { return _jspx_dependants; }

public void _jspInit() { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpre _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor } public void _jspDestroy() { } public void _jspService(HttpServletRequest request, HttpServletResponse response throws java.io.IOException, ServletException { PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this;

www.siteduzero.com

Partie 3 : Autour de nos JSP


JspWriter _jspx_out = null; PageContext _jspx_page_context = null; try { response.setContentType("text/html; charset=ISO-8859-1"); pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out;

153/158

out.write("\r\n"); out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n"); out.write("<html>\r\n"); out.write("<head>\r\n"); out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-88 out.write("<title>Titre de notre JSP</title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n"); out.write("\r\n"); out.write("</body>\r\n"); out.write("</html>"); } catch (Throwable t) { if (!(t instanceof SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { out.clearBuffer(); } catch (java.io.IOException e) {} if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); } } finally { _jspxFactory.releasePageContext(_jspx_page_context); } } }

Mais ce n'est pas une servlet ! Cette classe hrite de HttpJspBase

Eh bien si, justement parce que cette classe hrite directement de HttpServlet, classe que je ne vous prsente plus. Ceci signifie bien que cette classe est une pure servlet. D'ailleurs, vous pouvez constater que le nom des mthodes prsentes ici ressemble beaucoup celles qu'on trouve dans nos servlets : - _jspService(HttpServletRequest request, HttpServletResponse response) ressemble beaucoup la mthode service(HttpServletRequest request, HttpServletResponse response) de nos servlets ; - _jspInit() ressemble la mthode init() ; - _jspDestroy() ressemble la mthode destroy().

Intressons-nous plus particulirement au contenu de la mthode _jspService(HttpServletRequest request, HttpServletResponse response). V ous aurez sans doute constat que nous retrouvons le contenu de notre JSP, crit comme nous aurions pu le faire dans une servlet et, en plus, nous savons maintenant pourquoi certains objets n'ont pas besoin d'tre imports, comme le montre la figure ci-dessous :

www.siteduzero.com

Partie 3 : Autour de nos JSP

154/158

V ous pouvez voir, dans l'encadr du dessus, qu'un certain nombre d'objets sont initialiss et sont donc utilisables directement . ensuite, vous pouvez voir l'criture du code HTML de notre JSP. En fait, c'est pourquoi les objets du premier encadr n'ont pas besoin d'tre importS : ils sont initialiss automatiquement par le conteneur. Ce sont les objets suivants : HttpServletRequest request : permet de rcuprer les paramtres de la requte HTTP ; HttpServletResponse response : permet de rcuprer la rponse renvoye avec les informations gnres par le traitement de la requte. Nous avons dj utilis ceci prcdemment... JspWriter out : permet d'crire dans le flux de sortie et ainsi ajouter du contenu votre page web ; Object page : peu utilise, cette variable permet de faire rfrence la servlet cre depuis la page JSP, a revient utiliser this ; ServletConfig config : joue le mme rle que l'objet ServletConfig ; ServletContext application : joue le mme rle que l'objet ServletContext ; - PageContext pageContext : permet de centraliser et d'obtenir les attributs de la page JSP ; - HttpSession session : permet d'accder aux informations mises en session.

Et comment se fait-il que ces objets soient utilisables sans import ni dclaration ?

Tout simplement car le code Java que vous mettez dans vos JSP se retrouve dans la mthode _jspService(), crit comme si vous l'aviez fait vous-mme. Le mieux est de voir ce que nous donne une JSP avec des imports, du code Java, etc. Modifiez le fichier index.jsp pour qu'il corresponde au code suivant : Code : JSP

www.siteduzero.com

Partie 3 : Autour de nos JSP


<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ page import=" java.text.SimpleDateFormat, java.util.Date" %> <%! int global = 10; %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Cycle de vie d'une JSP</title> </head> <body> <% out.println("<h1>Nous sommes le : " + new SimpleDateFormat("dd/MM/yyyy").format(new Date()) + "</h1>"); %> <h1>il est : <%=new SimpleDateFormat("HH:mm:ss").format(new Date()) %></h1> <% out.println("<p>Nous allons voir comment notre conteneur gre nos JSP.</p>"); String[] list = new String[]{"Et d'un", "Et de deux", "Et de trois"}; out.println("<ul>"); for(String str : list) out.println("<li>" + str + "</li>"); out.println("</ul>"); %> </body> </html>

155/158

Et la servlet correspondant cette JSP est : Code : Java package org.apache.jsp; import import import import import javax.servlet.*; javax.servlet.http.*; javax.servlet.jsp.*; java.text.SimpleDateFormat; java.util.Date;

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { int global = 10; public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null;

www.siteduzero.com

Partie 3 : Autour de nos JSP


Object page = this; JspWriter _jspx_out = null; PageContext _jspx_page_context = null; try { response.setContentType("text/html; charset=ISO-8859-1"); pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; out.write("\r\n"); out.write(" \r\n"); out.write(" \r\n"); out.write(" "); out.write("\r\n"); out.write(" \r\n"); out.write("<html>\r\n"); out.write("\r\n"); out.write("<head>\r\n"); out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\r\n"); out.write("<title>Cycle de vie d'une JSP</title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n"); out.println("<h1>Nous sommes le : " + new SimpleDateFormat("dd/MM/yyyy").format(new Date()) + "</h1>"); out.write("\r\n"); out.write("<h1>il est : "); out.print(new SimpleDateFormat("HH:mm:ss").format(new Date()) ); out.write("</h1>\r\n"); out.write("\r\n"); out.println("<p>Nous allons voir comment notre conteneur gre nos JSP.</p>"); String[] list = new String[]{"Et d'un", "Et de deux", "Et de trois"}; out.println("<ul>"); for(String str : list) out.println("<li>" + str + "</li>"); out.println("</ul>"); out.write("\r\n"); out.write("</body>\r\n"); out.write("</html>"); } catch (Throwable t) { if (!(t instanceof SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { out.clearBuffer(); } catch (java.io.IOException e)

156/158

{}

if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); } } finally { _jspxFactory.releasePageContext(_jspx_page_context); } } }

www.siteduzero.com

Partie 3 : Autour de nos JSP

157/158

Comparatif entre notre JSP et la servlet associe :

V ous comprenez mieux comment les pages JSP fonctionnent, prsent, et vous savez pourquoi il existe des objets utilisables sans import. Explicitons tout de mme le schma ci-dessus. V ous pouvez voir que les imports sont automatiquement ajouts au-dessus de la dclaration de la servlet associe notre JSP. Le code Java, lui, est concatn dans la mthode _jspService(). Ainsi, ledit code est interprt et effectif lorsque le conteneur invoque ladite mthode. Ensuite, vous avez vu une nouvelle instruction : <%! int global = 10; %>. Celle-ci permet de dclarer une variable d'instance de notre servlet : celle-ci sera donc commune tous les threads utilisant notre JSP sans la rinitialiser.

En rsum
En fait, vu que je vous ai habitu des schmas, je pense qu'il serait de bon ton de vous en fournir un pour le cycle de vie d'une JSP :

www.siteduzero.com

Partie 3 : Autour de nos JSP

158/158

V ous pouvez mieux vous reprsenter ce qu'il se passe dans Tomcat, maintenant. Il en fait des choses, notre petit matou Allez, examinons un peu ce schma. Quelqu'un appelle une page JSP, via une URL ou en cliquant sur un lien. La requte est dirige vers le serveur de notre application. Tomcat prend en charge la requte et s'aperoit qu'une page JSP est demande. Il trouve ladite page et la convertit en fichier source java, en servlet pour tre exact. Ladite servlet est compile et mise en mmoire, enfin prte l'utilisation. La mthode _jspInit() est invoque. Tomcat cre un nouveau thread pour traiter la demande et invoque dans ce thread la mthode _jspService(). Le rsultat, une page entirement constitue de code HTML, est retourne par Tomcat au demandeur de dpart, le client. V ous pouvez voir que ce cycle ressemble trs fortement celui de la vie d'une servlet standard, quelques diffrences mineures prs, mais l'essentiel est l. Bon : avant d'aborder une nouvelle notion, elle aussi gre par notre conteneur favori, je vous propose un QCM. Je sens que vous tes un peu frustr parce que a fait deux chapitres que nous n'avons pas vraiment cod... Cependant, dites-vous bien que tout ceci vous permettra une meilleurs comprhension des choses et donc, vous permettra de mieux apprhender la programmation avec JEE. Allez, nous allons retourner vers des choses plus concrtes... Partie encore en cours d'dition... Revenez y faire un tour. Ce tuto est encore en cours d'dition mais j'espre sincrement qu'il vous aura permis de dcouvrir les mandres de JEE avec convivialit et humour !

www.siteduzero.com