Вы находитесь на странице: 1из 50

Servlets&

JavaServerPages

Essentiel

www.supinfo.com
CopyrightSUPINFO.Allrightsreserved
CampusBoosterID:
Version1.0

Sommaire
1.INTRODUCTION

.....................................................................................................................................

3
1.1.PRSENTATION

.............................................................................................................................................

3
2.LESSERVEURSDAPPLICATIONSJ2EE

..........................................................................................

5
2.1.PRSENTATION

.............................................................................................................................................

5
2.2.FONCTIONNEMENT

........................................................................................................................................

5
2.2.1.Lesrequtes

........................................................................................................................................

5
2.2.2.Configuration

.....................................................................................................................................

7
2.2.3.Compilationdeservletsettests

..........................................................................................................

7
3.LESSERVLETS

......................................................................................................................................

10
3.1.PRSENTATION

...........................................................................................................................................

10
3.1.1.Avantages

.........................................................................................................................................

10
3.1.2.Inconvnients

....................................................................................................................................

11
3.2.IMPLMENTATIONDEBASE

...........................................................................................................................

11
3.2.1.Structurefondamentale

....................................................................................................................

11
3.2.2.Cycledevie

......................................................................................................................................

12
3.2.3.Lirelarequte

..................................................................................................................................

14
3.2.4.crirelarponse

..............................................................................................................................

15
3.3.IMPLMENTATIONAVANCE

..........................................................................................................................

16
3.3.1.Lescookies

.......................................................................................................................................

16
3.3.2.Lessessions

......................................................................................................................................

19
3.3.3.LinterfaceSingleThreadModel

........................................................................................................

20
3.3.4.UtilisationduServletContext

............................................................................................................

21
4.LESJAVASERVERPAGES

................................................................................................................

22
4.1.PRSENTATION

...........................................................................................................................................

22
4.2.ELMENTSDEBASEDUSCRIPTING

..................................................................................................................

22
4.3.LESOBJETSIMPLICITESENJSP

.....................................................................................................................

23
4.4.EXEMPLEDUTILISATIONAVECUNFORMULAIRE

...............................................................................................

24
4.5.ELMENTSDACTION:INCLUSIONSDESCRIPTSETBALISESJSP:

....................................................................

26
4.6.DIRECTIVES

...............................................................................................................................................

29
4.6.1.Directivesdepages

..........................................................................................................................

29
4.6.2.Directivesdinclusions

.....................................................................................................................

29
4.6.3.Directivesdestaglibs

......................................................................................................................

30
4.7.LESBALISESPERSONNALISES(TAGLIB)

.........................................................................................................

30
4.7.1.Prsentation

.....................................................................................................................................

30
4.7.2.Utilisationdetaglibprdfinies

.......................................................................................................

31
4.7.3.LAPIJSPCustomTag

.....................................................................................................................

35
5.INTERACTIONSENTREJSPETSERVLET

....................................................................................

46
5.1.POURQUOIFAIREDESINTERACTIONSENTRELESJSPETSERVLET

........................................................................

46
5.2.APARTIRDUNESERVLET

...........................................................................................................................

46
5.3.APARTIRDUNSCRIPTJSP

.........................................................................................................................

47
5.4.TRANSMISSIONDESDONNESSUPPLMENTAIRES

...............................................................................................

47
5.5.APPLICATIONDUMODLEMVC

.................................................................................................................

48
6.HBERGEURSGRATUITS

..................................................................................................................

50

EssentielServlets&JavaServerPages

3/50

1.Introduction
1.1.Prsentation
De nos jours, les sites Internet ne se limitent plus des contenus statiques, identiques dun
utilisateur lautre. Il devient ncessaire de pouvoir mettre disposition des internautes un
contenu personnalis variant en fonction de leurs besoins, leur permettant ainsi daccder
linformationdemandeetdepouvoirinteragiraveccellecietcellesdesautresutilisateurs.
LesServletsetlesJSPconstituentlasolutionofferteparSunencequiconcernelacration
dapplicationsWebdynamiques.
Contrairementauxlangagesdescriptssimplesosemlangentcouchesmtier,prsentationet
accs aux donnes, les Servlets/JSP permettent ici une architecture plus claire, dtache et
modulaireenincitantleprogrammeursparercescouches.
Pouruneprogrammationoptimise,uneapplicationWebdoittrefondesurunearchitecture
MVC(ModelViewController).

Lacoucheprsentation(View)correspondauxpagesWebaffichesauniveauduclient(browser,
applet,applicationpropritaire).
Cespagespeuventtrestatiquesoudynamiques.Danslederniercas,ellessontlersultatdun
codeexcutctserveur.Laprogrammationdecettecouchepeuttreraliseparunserveur
dapplicationJ2EElaidedescomposantssuivants:

LesServletsJava

LesJavaServerPages

LesJavaBeans

EssentielServlets&JavaServerPages

LesTagLibrairies

4/50

EssentielServlets&JavaServerPages

5/50

2.LesserveursdapplicationsJ2EE
2.1.Prsentation
Ilexistedenombreuxserveursdapplicationsmaischacundeuxprsentedesavantagesetdes
inconvnients.Ilssont,eneffet,adaptsdiffrentesutilisations.
CertainssontexclusivementspcialissdansledveloppementdeServlet/JSP(Tomcat,Resin,
Jetty,WebSphereExpressetWeblogicExpress)tandisquedautresenglobentlensembledes
spcifications J2EE (JBoss, Jonas, Oracle 9iAS, WebSphere Application Server, Weblogic
Platform).
Lors du choix dun serveur applicatif, on va videmment prendre en compte son prix. Si la
majoritdentreeuxsontpayants,ilenexistetoutdemmequisonttoutfaitcomptitifsenopen
source;Tomcat,Jetty,JBoss,JonasouOrion.
Robusteetstable,TomcatestleserveurstandardpourledveloppementServlet/JSP.Nouslavons
doncchoisipourlesdiffrentsexemplesducours.

2.2.Fonctionnement
2.2.1.Lesrequtes

UnerequteHTTPdebase
UnerequteHTTPesteffectueparunnavigateurWeb(appelaussiclient)auprsdunserveur
WebafindercuprerlecontenudunepageWeb.
Lesdiffrentestapesduprocessussontlessuivantes:

Lenavigateurseconnecteauserveur
Lenavigateurenvoiesarequteauserveur
Leserveurcherchelapagedemande(larponse)
Leserveurcommenceenvoyerlecontenudelapagerponse(ouunepagederreur)
Lenavigateuraffichelapageaufuretmesurequillareoit
Unefoisletransferttermin,lenavigateurfermelaconnexion

Remarque:Danslecasdunerequtesimple(versunepagehtmlparexemple)aucunmoteurde
servletnintervientpourlagnrationdursultat.

UnerequtesurunserveurJava
LeserveurWebdoitsaccompagnerdunmodulesupplmentairequigreralesservlets.Celuici
est appel moteur de servlets ou conteneur de servlets. Ce module est soit intgr
directementauserveurWebsoitsousformedemoteurindpendant.Nousexpliqueronsciaprsla

EssentielServlets&JavaServerPages

6/50

diffrenceentrecesdeuxtechnologies.Dansnotreexemple,nousallonsprendrelecasonotre
moteurdeservletsestindpendant(afindemieuxcomprendreladistributiondestchesentreles
deuxcomposants).
Lesdiffrentestapesduprocessussontlessuivantes:

Lenavigateurseconnecteauserveuretenvoiesarequte
Leserveurdtectequelonveutunaccsuneservletettransfredonclarequteau
moteurdeservlets
Lemoteurvrifiequelaservletestinstancie
Sicestlepremierappel,lemoteurcreuneinstancedelaservletetappellelamthode
init()decelleci
Lemoteurappelleensuitelamthodeservice() delaservlet.Cettemthodereoitdeux
objetsenparamtres:
o Lepremierreprsentantlarequteduclient
o Ledeuximereprsentantlarponsedonnerceclient
Lemoteurretournelersultatgnrauserveurwebquilerenvoieauclient.
Leclientaffichelapageetfermelaconnexion

Lorsdesappelssuivantsaucuneinstanceneseracrepuisquelemoteurutilisetoujourslamme.
Danslecasdeplusieursappelssynchrones(etduneservletgnrique)lemoteurcrpourchaque
appelunthreadparticulierquignreralersultatpourlappelassoci.

MoteurdeServlets
o ModeAutonome
Unmoteurdeservletautonomeestunmoteurquiesttotalementindpendant,c'estdirequil
contientgalementunserveurWeb.Touteslesrequtespassentparlemoteurdeservlet,quelles
appellentunepagestatiquebasiqueouuneservlet.
Cemodeestsurtoututilislorsquelonutiliseuniquementdesservletsouquelonsouhaiteles
tester(lorsdedveloppementenlocalparexemple).

ModeLiauserveurweb
LemoteurdeservletestleplussouventliauserveurWeb.Eneffet,danslamajoritdescas,les
servletssontcouplesaveclesJSPoutoutautretypedepagesaccessiblesviaceserveurWeb.Le
faitquelemoteursoitindpendantduserveurWebpermetdoptimiserlestempsderponsescar
lemoteurnestsollicitquepourletraitementdesservlets(etnonpourtouteslesrequtes).
Cependantlaplupartdesmoteursdeservletpeuventtreutilissaussibienenmodeautonome
quenmodeli.

EssentielServlets&JavaServerPages

7/50

2.2.2.Configuration

ApacheTomcat
PourindiquerquelsdossierssontpartagssurleserveurvousdevezcrerunContextPathsur
lefichierdeconfigurationduserveur:server.xml.
Cefichierpermetdespcifierunemultitudedinformationsconcernantleparamtrageduserveur,
cependantnousnenousattarderonsquesurlesspcificationsdebasepourlutilisationdeservlet
etJSP.
Il vous permet notamment de configurer diffrents noms dhtes (host) afin de spcifier
diffrentsparamtrespourchacundeux.
Voicilecontenudunebalisehostdebasepourlaconfigurationdelocalhost(htepardfaut).
<Hostname="localhost"debug="0"appBase="webapps"
unpackWARs="true"autoDeploy="true"
xmlValidation="false"xmlNamespaceAware="false">
<LoggerclassName="org.apache.catalina.logger.FileLogger"
directory="logs"prefix="localhost_log."suffix=".txt"
timestamp="true"/>
<Contextpath="/localhost"reloadable="true"
docBase="C:\www_root\localhost\"
workDir="C:\www_root\localhost\work"/>
<Contextpath="/localhost2"reloadable="true"
docBase="C:\www_root\localhost2\"
workDir="C:\www_root\localhost2\work"/>
</Host>

Llmentprincipalreteniriciestlabalise:Context.Eneffetcestellequivapermettrede
dfinirdesContextPathetdoncdepartagerdesdossiersdevotredisquedur.
Danslexemplecidessusnousdfinissons2Contextquisontmappssurdesdossierslocaux.
Lepremier:localhostestmappsur:C:\www_root\localhost\.
Lesecond:localhost2estmappsur:C:\www_root\localhost2\.
Vous pourrez accder ces deux context depuis votre navigateur web via les adresses:
http://localhost:port/localhost/ethttp://localhost:port/localhost2/.
Leportestdfinidanslefichierdeconfigurationduserveur(pardfautilestgal:8080).

2.2.3.Compilationdeservletsettests
Nousallonsdanscettepartieutiliseruneservletlaplusbasiquequipuisseexister.Elleaffichera
simplementunHelloWorldlorsdesonappelparleclient.
Voicisoncode:

EssentielServlets&JavaServerPages

8/50

importjava.io.IOException;
importjava.io.PrintWriter;
importjavax.servlet.GenericServlet;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
publicfinalclassHelloServletextendsGenericServlet{
publicvoidservice(ServletRequestreq,ServletResponseres)
throwsIOException{
res.setContentType("text/html");
PrintWriterpageWriter=res.getWriter();
pageWriter.println("<html>");
pageWriter.println("<body>");
pageWriter.println("HelloWorld");
pageWriter.println("</body>");
pageWriter.println("</html>");
}
}

Compilation
Sivoussouhaitezexcuterlacompilationpartirdunelignedecommandeetducompilateur
javacduJDKvousdevrezvrifierquevotrevariabledenvironnement:CLASSPATHcontient
bienuncheminpointantverslesfichiersJARdesservletsstandard(librairies).
Ensuitevousnavezquexcuterlacommande:
javacHelloServlet.java

Lecompilateurvouscreunfichierdeclassequilfaudramettreunendroitprcisenfonctiondu
moteurdeservletsquevousutilisez.

Dploiement
Pourutiliservotreservletilfautmaintenantladployer.

o ApacheTomcat
Nousallonsdployerlaservletbasiquepourlexemple.
Toutdabord,ilfautquevousayezaumoinsuncontextpathsurvotreserveur(nousutiliserons
lecontext:localhost).
Voicilarborescencequelondoitutiliserpourfairefonctionnerlesservlets:
/=>Racineducontext
/.classpath=>Fichierdedfinissionsdescheminsauxlibrairies
/WEBINF/classes=>Dossierquicontientlespackagesetservlets
/WEBINF/lib=>Dossierquipeutcontenirdeslibrairiesexternes
/WEBINF/web.xml=>Fichierdeconfigurationdelapplication
/work/=>Dossierdetravailpourlemoteurdeservlet
Nousplaonsdoncnotrefichier:HelloServlet.classdansledossier:/WEBINF/classes/.

EssentielServlets&JavaServerPages

9/50

Nousdevonsmaintenantindiqueraumoteurdeservletquenoussouhaitonsutilisercecontexten
tantquewebapplication.Celasefaitvialefichierweb.xml.
Voicicequedoitcontenirauminimumnotrefichierpourquenotreservletpuissefonctionner:
<?xmlversion="1.0"encoding="ISO88591"?>
<!DOCTYPEwebapp
PUBLIC"//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"
"http://java.sun.com/dtd/webapp_2_3.dtd">
<webapp>
<displayname>Web.xmldebase</displayname>
<description>
FichierxmldedfinitionduneapplicationWebappsdebase.
</description>
<!Dfinitiondesservletsprsentesdanslapplication>
<servlet>
<servletname>HelloServlet</servletname>
<servletclass>HelloServlet</servletclass>
</servlet>
<!Mappagedenomspourlesservlets>
<servletmapping>
<servletname>HelloServlet</servletname>
<urlpattern>/servlet/Hello</urlpattern>
</servletmapping>
</webapp>

Nouspouvonsremarquerquenousspcifionsquecestunewebappparlebiaisdelabalise:
<webapp></webapp>
NousindiquonsalorsquecettewebappcontientlaservletHelloServletquicorrespondlaclasse
HelloServlet(.class).
Et finalement nous mappons le path: servlet/Hello la servlet. Cela nous permet alors
daccderaursultatdelaservletvialadresse:http://localhost:8080/localhost/servlet/Hello
Remarque:ilfautbienrespecterlordredesbalises,celasignifiequevousnepouvezpasmettre
unebalise<servlet>suiviedunebalise<servletmapping>puisnouveauunebalise<servlet>.
Eneffet,ilnestpascertainquetouslesserveursparsentcorrectementcegenredefichier.

EssentielServlets&JavaServerPages

10/50

3.LesServlets
3.1.Prsentation
LesservletsreprsententlalternativedanslemondeJavalaprogrammationdesCGI(Common
GatewayInterface).CestuneclasseJavaqui,chargedynamiquement,permetdaccrotreles
capacits dun serveur Web et de rpondre des requtes dynamiquement. Le fait quelles
sexcutentdansunemachinevirtuelleJava(JVM)surle serveur, leur assure une portabilit
complteetunescuritaccrue.
Contrairementauxapplets,lesservletsnimposentpasauclientdavoirlesupportdeJavacarelles
sexcutentctserveur.

3.1.1.Avantages
LesservletsontnormmentdavantagescomparsauxsimplesCGI.Eneffet,lesservletspeuvent
tretoutesgrespardesthreadssparsauseindummeprocessusoupardesthreadsdans
plusieursprocessusrpartissurdiffrentsserveurs.
Lautregrosavantagedesservletsestquellessontportablesdunsystmedexploitationlautre
maisaussidunserveurWeblautre.
Voiciunelistenonexhaustivedesavantages:
Efficacit
o Semicompiles
o Rsidentes
o Multithreads
o Gestionducache
o Connexionspersistantes(pourlesbasesdedonnesparexemple)

Pratique
o Gestiondescookies
o Suividesession
o SimplificationpourlamanipulationduprotocoleHTTP
o Portables(surtouslessystmesdexploitationssupportantJava)
o Ilexisteungrandnombredesolutionsgratuites

Puissance
o CommunicationbidirectionnelleavecleserveurWeb
o changededonnesviaURI
o Partagededonnesentreservlets
o Chanagedeservlet(inclusiondeservletdansuneautre)

EssentielServlets&JavaServerPages

11/50

3.1.2.Inconvnients
Leseulinconvnientdesservletsestquellessontlimitesenmatiredinterfacegraphiquecar
elles sexcutent ct serveur. Cependant il est tout fait possible de les coupler des
technologiestellesqueFlash,AppletAfinderendrelecontenuetlesdonnesbeaucoupplus
interactives.

3.2.Implmentationdebase
3.2.1.Structurefondamentale
NousavonsvuprcdemmentcommentinstalleretconfigurerunserveurWebetunmoteurde
servlets. Nous allons maintenant nous attarder sur le concept mme des servlets avec leur
conceptionproprementdite.

InterfaceServlet
Pourquuneclassereprsenteuneservlet,ilfautimprativementquelleimplmentelinterface
Servlet (du package javax.servlet) directement ou indirectement. Cette interface oblige
implmenterlesmthodessuivantes:

Lamthodepublicvoidinit(ServletConfigcfg)
Lamthodepublicvoidservice(ServletRequestreq,ServletResponseres)
Lamthodepublicvoiddestroy()
LamthodepublicServletConfiggetServletConfig()
LamthodepublicStringgetServletInfo()

Noustudieronscesmthodesendtailcidessous.
Remarque:lestroispremiresmthodesreprsententlecycledevieduneservlet.
LutilisationdelinterfaceServletnestpastrscourante.Eneffetdiffrentesclassesabstraitesont
tdveloppesafindesimplifierlatcheaudveloppeur.

ClasseGenericServlet
Cettepremireclasseestlaplusbasique.Elleappartientelleaussiaupackage javax.servlet.Il
vous suffit tout simplement, dans une classe fille, dimplmenter la mthode: public
voidservice(ServletRequestreq,ServletResponseres).
Voiciunexempledeservletimplmentantcetteclasse:
importjava.io.IOException;
importjava.io.PrintWriter;
importjavax.servlet.GenericServlet;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;

EssentielServlets&JavaServerPages

12/50

publicfinalclassHelloServletextendsGenericServlet{
publicvoidservice(ServletRequestreq,ServletResponseres)
throwsIOException{
res.setContentType("text/html");
PrintWriterpageWriter=res.getWriter();
pageWriter.println("<html>");
pageWriter.println("<body>");
pageWriter.println("Coucou");
pageWriter.println("</body>");
pageWriter.println("</html>");
}
}

ClasseHttpServlet
CetteclasseestunpeuplusvolueetdavantageorientedveloppementWeb.Elleestcependant
incluedanslepackage:javax.servlet.http.Demmequepourlaclasseprcdente,nouspouvons
simplementimplmenterlamthode: publicvoidservice(ServletRequestreq,ServletResponse
res)cependantunealternativesouvrenous.CommeleprotocoleHTTPpermetdetransmettre
des donnes de diffrentes manires (GET ou POST), cette classe possde les mthodes sy
rapportant. Cela permet dimplmenter les mthodes indpendamment des mthodes que lon
souhaiteutiliser.

LamthodepublicdoGet(HttpServletRequestreq,HttpServletResponseres)estappele
lorsdunerequtedetypeGET.

La mthode public doPost(HttpServletRequest req, HttpServletResponse res) est


appelelorsdunerequtedetypePOST.

Vous pouvez galement trouver dautres mthodes public doXxx(HttpServletRequest req,


HttpServletResponseres)avecXxx=(Put,Delete,Options)
Remarque:sivousnesouhaitezpasdiffrencierletypedemthodeutilisepourlarequte,vous
pouvezsoitutiliserlaclasse GenericServlet,soitnimplmenterquelamthode service() dans
votreservlet.
DeplusvouspouvezremarquerquenousutilisonslobjetHttp[ServletResponse/ServletRequest]
laplacedeServletResponse/ServletRequest.

3.2.2.Cycledevie
Nousavonspuvoirquelemoteurdeservletnutilisequuneseuleinstanceparservletetque
chaquerequteclienteapourrsultatunnouveauthreadquiesttransmisdoGet()oudoPost()
oubienservice()(selonlescas).Nousallonsiciexaminercommentlesservletssontinitialises,
utilisesetdtruites.CestapessappellentleCycledevieduneservlet.

EssentielServlets&JavaServerPages

13/50

Lamthodeinit()
Lamthodeinit()estappeleuniquementlorsdupremierappellaservlet(soitviaunappelclient
soitlorsdudmarrageduserveurenfonctiondevotreconfigurationserveur).Parconsquent,elle
estemployepoureffectuerlesoprationsdeparamtrageetdinitialisationdelaservlet.
Ilexistedeuxprototypesdelamthodeinit().

Lepremierneprendaucunargumentetestutilislorsquelaservletnapaslirede
paramtrevariantdunserveurlautre.
Ladfinitiondecelleciressemblececi:
publicvoidinit()throwsServletException{
//InitialisationCode
}

La seconde version de init() est utilise lorsque le servlet a besoin daccder aux
paramtresdeconfigurationduserveurafindesadapterauserveursurlaquelleelleest
lance.Onpeuttrsbienpenserrcuprerlesparamtresdeconnexionunebasede
donnesparexemple,unfichierdemotsdepassesoubiendautreschosesencore.
Lesecondprototyperessemblececi:
publicvoidinit(ServletConfigcfg)throwsServletException{
super.init(cfg);
//InitialisationCode
}

CettemthodeadmetunargumentdetypeServletConfigquipermetdercuprerlesvaleursdes
diffrentsparamtresdeconfigurationgrcelamthode getInitParameter() quidemandeen
entrelenomduparamtreetretourne,ensortie,savaleur.
Lapremireligneducorpsdelamthodefaitappel super.init().Cettelignenedoitpastre
oublie,eneffetlamthodeinit()delaclasseparentenregistrelobjetServletConfigunendroit
prcisdanslaservletquiestutilisparlasuite.
Remarque: si vous dcidez de surcharger la mthode init(), noubliez surtout pas lappel
super.init()carvousrisquezdavoirdesproblmes

Lamthodeservice
Cettemthodeestappelepourchaquerequtereue.Cettemthodevrifieletypederequteet
appelleautomatiquementsoitdoGet(),doPost(),doTrace()Dansuneservlet,quidoittraiterles
requtesPOSTetGETdelammemanire,vouspourrieztretentdesurchargerservice()mais
cenestpaslabonnesolution!Eneffet,celarisqueraitdenuirelvolutiondevotreservlet.Il
vautmieuxdanscecasappelerdoPost()viadoGet()ouinversement.
Grcecettemthode,vouspourrez,parlasuite,surchargerlesmthodes doPut(), doTrace(),
doOptions()soitdirectementdanslaservletsoitdanslesservletsfilles.

EssentielServlets&JavaServerPages

14/50

Voicileprototypedecettemthode:
publicvoidservice(ServletRequestreq,ServletResponseres)throwsIOException

Lamthodedestroy
Leserveurpeutdemanderlasuppressiondelinstancedelaservlet,soitpardemandeexplicitede
ladministrateur(redmarrageduserveurparexemple),soitparcequelaservletdemeureinactif
pendantunetroplonguepriode.Leserveurappellealorslamthodedestroy()delaservletafin
quecellecieffectuetouteslesoprationsdedestruction.Vouspouvezretrouverdesoprationsde
fermeturedeconnexionunebasededonnes,dinterruptiondethreadslancsentchesdefond,
fermerunfichier
Remarque:unserveurWebpeuttrsbiensinterromprecausedunbugouautreproblme
technique(unepersonnepeuttrsbiendbrancherlaprisedecourant!)cestpourcelaquilne
fautpasfaireconfiance100%lappelautomatiquedecettemthodeetfairedessauvegardes
dlmentsprincipauxdurantlexcutiondelaservlet.
Voicileprototypedecettemthode:
publicvoiddestroy()

3.2.3.Lirelarequte
LalecturedesdonnesdelarequtesefaitvialinstancedelobjetHttpServletRequestpassen
paramtredesmthodesdoGet(),doPost()
Depuislarequte,ilestpossibledercuprertouslesparamtrespasssauserveurwebparle
client:
Ilexistequatremthodespourcela:

LamthodegetParameter(Stringname):retournelavaleurdunparamtrepartirde
sonnom

La mthode getParameterValues(String name): retourne une liste de valeurs dun


paramtrepartirdesonnom(utilisparexempledansunelistechoixmultiples)

Lamthode getParameterMap():retourneunelistedassociationsdeparamtresetde
valeurs

Lamthode getParameterNames():retournelalistedetouslesnomsdesparamtres
passsauserveurweb

Cetobjetpermetgalementdercuprerdesinformationsconcernantleclient:

LamthodegetRemoteAddr():retourneladresseIPduclient
LamthodegetRemoteHost():retournelenomcompletdelhteclient

EssentielServlets&JavaServerPages

15/50

Delammefaon,nouspouvonsrcuprerdesinformationsconcernantleserveur:

LamthodegetServerName():retournelenomcompletduserveur
LamthodegetServerPort():retournelenumroduportutilisparleserveur

Vouspouvezgalementaccderlensembledesvariablesdenvironnementduserveur(comme
pourlesscriptsCGI).
Voiciuntableaurcapitulatifdesmthodesutiliser:
VariabledenvironnementCGI

MthodesduneservletHTTP

SERVER_NAME
SERVER_PROTOCOLE
SERVER_PORT
REQUEST_METHOD
PATH_INFO
PATH_TRANSLATED
SCRIPT_NAME
DOCUMENT_ROOT
QUERY_STRING
REMOTE_HOST
REMOTE_ADDR
AUTH_TYPE
REMOTE_USER
CONTENT_TYPE
CONTENT_LENGTH
HTTP_ACCEPT
HTTP_USER_AGENT
HTTP_REFERER

getServerName()
getProtocole()
getServerPort()
getMethod()
getPathInfo()
getPathTranslated()
getServletPath()
getServletContext().getRealPath("/")
getQueryString()
getRemoteHost()
getRemoteAddr()
getAuthType()
getRemoteUser()
getContentType()
getContentLength()
getHeader("Accept")
getHeader("UserAgent")
getHeader("Referer")

3.2.4.crirelarponse
Larponselarequtesefaitvialinstancedelobjet:HttpServletResponsepasseenparamtre
desmthodesdoGet(),doPost()(Nousnoteronslinstancedecetobjet:res).

Typedecontenu
Lapremirechosefaireestdindiquerlaservletletypededonnesquellevarenvoyer.En
effetvouspouveztrsbienretournerduhtml,uneimagegnre
Lamthode:setContentType()vouspermettradeffectuercela.Elleprendenparamtreletypede
contenu.Voiciquelquesexemplesdutilisationdecettemthode:
res.setContentType("text/html") //pageHTML
res.setContentType("text/xml")
//pageXML
res.setContentType("image/jpeg") //imageJPEG

EssentielServlets&JavaServerPages

16/50

IlestpossiblederenvoyertouttypedecontenuenspcifiantexactementlebontypeMIME1.

criture
Lcrituredesdonnesdetypetextedanslarponsesefaitparlobjet:PrintWriterquelonpeut
rcuprerparlamthode:getWriter().
PrintWriterout=res.getWriter();
out.println("<HTML>");
out.println("<BODY>");
out.println("Bonjourlemonde");
out.println("</BODY>");
out.println("</HTML>");
out.close();

Si votre rponse renvoie des donnes binaires, il est prfrable dutiliser lobjet
ServletOutputStreamdontuneinstanceestretourneparlamthode:getOutputStream()
Voiciunexemplepourretourneruneimagepartirduneimagelocale:
res.setContentType("image/gif");
ServletOutputStreamout=res.getOutputStream();
FileInputStreamfis=newFileInputStream(newFile("./logo.gif"));
while(fis.available()>0){
fis.read(buf,0,buf.length);
out.write(buf);
out.flush();
}
fis.close();
out.close();

3.3.Implmentationavance
Nousavonsvu,danslapartieprcdente,lesbasespourledveloppementdeservlet.Nousallons
prsentnousattardersurdesconceptsplusavancs.

3.3.1.Lescookies

Principe
Lescookiessontdepetitesinformationstextuellesenvoyesparleserveuretrenvoyparleclient,
sansmodificationdesapart,chaquevisiteultrieure.Cettetechniquepeuttretrsintressante
pourgarderunetracedesvisiteurs(savoirsilestdjvenusurlesiteounon).

Avantages
Lescookiespermettredegarderunlienentreleclientetsasessionsurunserveurparlebiaisdun
identifiantdesessionparexemple.

MultipurposeInternetMailExtensions

EssentielServlets&JavaServerPages

17/50

Lutilisationdescookiesesttrssimplemettreenplaceetpermetdegrerunensemblede
fonctionnalitsintressantespourlevisiteur.

Inconvnients
Lescookiessonttransmischaquerequte,celapeutalourdirlesdemandesetrponsesduclientsi
cescookiessontutilissabusivement.
Lutilisationdecookiesnestpasprconiserpouruneutilisationscurise,eneffetlesvaleursde
chaqueparamtresontpassesenclairdanslarequteetpeuventtrercupresparunpirate
assezfacilement.
Lescookiesnesontpastoujours acceptsparleclient,celapeutposerun norme problme
lorsquunsystmenapasdemoyenenparalllemisenplace.

Crationdecookies
LesservletsontleurpropreAPIdecookies.LescookiessontreprsentsparlobjetCookie.Voici
unedescriptiondecetteclasse:

LeconstructeurCookie(Stringname,Stringvalue):constructeurquiprendenparamtre
lenomducookieetsavaleurassigne.

Unefoislobjetcookieinstanci,vouspouvezspcifiercertainsattributsdeceluici(cesontdes
setters)ourcupreruneinformationduncookievialegettercorrespondant:

LamthodeStringgetComment():retournelecommentaire
LamthodesetComment(String):assigneuncommentaire

LamthodeStringgetDomain():retourneledomaine
LamthodesetDomain(StringdomainPattern):assigneundomaine

Lamthode intgetMaxAge():retourneladureensecondesavantquelecookiesoit
prim
LamthodesetMaxAge(intlifetime):indiqueladureensecondesavantquelecookie
soitprime,lavaleur0indiquequelecookiedoittresupprim.

LamthodeStringgetName():retournelenomducookie
LamthodesetName(Stringname):assigneunnomaucookie

LamthodeStringgetPath():retournelecheminduncookie
LamthodesetPath(Stringpath):assigneuncheminaucookie(permetdindiquerquele
cookienestutilisquepourcertainsniveauxdanslesite)

Lamthode booleangetSecure():retourne true silecookieesttransmisquepourles


connexionsscurises
La mthode setSecure(boolean secureFlag): positionne le drapeau dindication de
transmission.

LamthodeStringgetValue():retournelavaleurducookie

EssentielServlets&JavaServerPages

18/50

LamthodesetValue(StringcookieValue):assigneoumodifielavaleurducookie

Unefoislecookieparamtrilfautlerajouterlenttehttp:SetCookie.Pourcelavousavez
justeappelerlamthodeaddCookie()delobjetderponsedevotreservlet.
Voiciunexempledecrationdecookie:
CookiecookieDejaVenu=newCookie("dejaVenu","1");
cookieDejaVenu.setMaxAge(60*60*24*365);//1an
res.addCookie(cookieDejaVenu);

Lecturedescookies
Lescookiesreussontstocksdansuntableauquelonpeutrcuprerparlinstancedelobjet
HttpServletResquestvialamthodegetCookies().Cellecirenvoieuntableaudontlalongueur
reprsentelenombredecookieenvoy(silalongueurestgalenulle,aucuncookienat
envoy).Pourobteniruncookieenparticulierspartirdesonnomvousdevezparcourirletableau
enappelantpourchaquelmentlamthodegetName()jusqutempsdarriversurlecookiequi
vousintresse.
UnefoisrcuprervousavezjusteappelerlamthodegetValue()pourrcuprersoncontenu.
Voiciunexempledecrationdecookie:
publicvoiddoGet(HttpServletRequestreq,HttpServletResponseres)
throwsServletException,IOException{
//Initialisation
PrintWriterout=res.getWriter();
res.setContentType("text/html");
Cookie[]tabCookies=req.getCookies();
Cookiecookie;
//Bouclequiaffichetouslescookies
for(inti=0;i<tabCookies.length;i++){
cookie=tabCookies[i];
out.println("Cookie:"+i+"<br>"+
"Nom:"+cookie.getName()+"<br>"+
"Valeur:"+cookie.getValue()+"<br>");
}
out.flush();
out.close();
}

Sivousvoulezsupprimeruncookie,ilsuffitdattributuneduredevie0votreobjetcookie:
c1.setMaxAge(0);

EssentielServlets&JavaServerPages

19/50

3.3.2.Lessessions

Prsentation
Nousavonsvuprcdemmentcommentgarderdesinformationschezleclientparlebiaisde
cookie.Cependantcemcanismeesttrslimit,cestdoncpourcelaquelesystmedesessiona
tmisenplace.
Lorsquelonparledesession,lactivitsepassectServeuretnonClient(contrairementaux
cookies).Lessessionssonttrsutilisesdanslesapplicationswebetplusparticulirementdansles
sitesebusinessEllespermettentdestockerdesinformationspourchaqueclientctserveur.

Avantages
Lessessionssontexcutesctserveurcequileurpermetdtrebeaucoupplusscurisesqueles
cookies.
Unseulidentifiantestncessairepourlierleserveuretleclientcarlesdonnessontstockessur
leserveur.
LessessionssontsimplesdutilisationgrcelAPIdesuividesessiondesservlets.

Inconvnients
Unliendoittremisenplaceentreleclientetleserveur(identifiantdesession)soitparcookie
soitparlemcanismedercrituredURL.

APIdesuividesession
LesservletspossdentuneAPIpourlagestiondessessions.Lutilisationdesessionsdansles
servletsesttrssimplecarilsuffitdercuprerlobjetsessionlilarequteactuelle.Siaucun
objetdesessionnaencoretcr,onpeutdciderdelecrerautomatiquement.
Laclassedcrivantunesessionest:HttpSession.
Voiciunedescriptiondechacundesmthodesdecelleci:

Lamthode ObjectgetValue() ou ObjetgetAttribute(Stringname):retournelavaleur


dunattributdelasessionprcdemmentajout.
Remarque: la mthodegetValue() estremplacerpar getAttribute() depuislaversion
2.2delAPIdesservlets.

LamthodeputValue(Stringname,Objectvalue)ousetAttribute(Stringname,Object
value):associeunobjetunnomdattributdelasession.
Remarque: lamthodeputValue() estremplacerpar setAttribute() depuislaversion
2.2delAPIdesservlets.

LamthoderemoveValue(Stringname)ouremoveAttribute(Stringname):supprimeun
attributpartirdesonnom.

EssentielServlets&JavaServerPages

20/50

Remarque:lamthoderemoveValue()estremplacerparremoveAttribute()depuisla
version2.2delAPIdesservlets.

LamthodeString[]getValueNames()ouEnumerationgetAttributeNames():retourne
lesnomsdetouslesattributsdelasession.
Remarque: la mthode getValueNames() est remplacer par getAttributeNames()
depuislaversion2.2delAPIdesservlets.

LamthodeStringgetId():retournelidentifiantuniquedelasession(ilpeuttreutilis
commeunecl).

Lamthode boolean isNew():retourne true silasessionvientdtrecres(nouvelle


session)oufalsedanslecasdunesessiondjexistante.

Lamthodeinvalidate():invalidelensembledelasessionetlibretouslesobjetsquiy
sontassocis.

Gestiondelasession
Toutdabordilvousfautrcuprerlobjet session associlarequtecliente,pourappelerla
mthode:getSession()delobjetHttpServletRequest.
HttpSessionsession=req.getSession(true);

Pourquelasessionsoitcreautomatiquement(danslecasoellenexisteraitpas),nouspassons
trueenparamtrelamthodegetSession().
Remarque:Sionpassaitfalseenparamtre,lamthodegetSession()nousretourneraitunobjet
null.
Aveccetobjetsession,vousallezpouvoirluiajouterdesobjets(mthodesetAttribute()),enretirer
(mthoderemoveAttribute())ouenlire(mthodegetAttribute()).

3.3.3.LinterfaceSingleThreadModel
Nousavonsvuquuneservletnaquuneseuleinstancequiestattaqueparplusieursthreadsla
fois(1threadparclient).Cecipeutparfoistregnantlorsquelonveut,parexemple,quunobjet
deconnexionunebasededonnesnesoitpaspartagparmilesthreads,lamodificationdun
fichierprcis
Une premire solution serait daffecter lattribut synchronized la mthode service() de la
servlet.
Cependant il existe un meilleur moyen de grer cela. En effet, il existe linterface
SingleThreadModel qui permet dindiquer au moteur de servlets que lon souhaite quune
instancedelaservletnesoitattaquequeparunThreadlafois.

EssentielServlets&JavaServerPages

21/50

Cetteinterfacenecomporteaucunemthodeimplmenter,ellenereprsentequundrapeaupour
lemoteurdeservlet.
Finalementcetteinterfaceestpratiquecarellepermetenquelquessortesdescuriserlesaccs
concurrents,cependantcenestpaslameilleuresolution.Lidalestdecrerdanslecasdune
connexionlabasededonnes,unegestiondepooldeconnexionsmultithreades.Eneffet,ilse
peutquelabasededonnesnacceptequunnombrerestreintdeconnexions(quipeuttredpass
parlenombredeclientsaccdantlaservlet).

3.3.4.UtilisationduServletContext
On appelle contexte associ la servlet (ServletContext) lenvironnement au sein duquel la
servletsexcute.LobjetServletContextestcrparlecontaineurdeservletetpermetdaccder
desinformationsrattacheslenvironnement.
Lobjetcrestpartagpartouteslesservletsducontaineur.Celapermetdoncdepartagerdes
informationsentrelesservlets.

DescriptiondelobjetServletContext
VoiciunedescriptiondesmthodesprincipalesdelobjetServletContext:

LamthodeObjectgetAttribute(Stringname):retournelattributassociname

LamthodesetAttribute(Stringname,Objecto):assigneunobjetunnomdattribut

LamthoderemoveAttribute(Stringname):supprimeunattributducontext

La mthode Enumeration getAttributeNames(): retourne la liste des attributs du


contexte

La mthode int getMajorVersion(): retourne la dernire version supporte par


lenvironnement

LamthodeintgetMinorVersion():retournelapremireversionminimalesupporte

UtilisationlobjetServletContext
Laccsaucontextsefaitparlebiaisdelamthode getServletContext() delaservlet.Lobjet
rcuprestdutypeServletContext.

EssentielServlets&JavaServerPages

22/50

4.LesJavaServerPages
4.1.Prsentation
Nousvenonsdoncdevoirlesdiversesutilisationsduneservletavecleursavantagesetleurs
inconvnients.
Lesservlets,classesjavatendantlaclassejavax.servlet.http.HttpServlet,mettentlaccentsurle
codejava.LespagesJSPsont,elles,pluttprochesducodehtml.
Eneffet,unepageJSPressemblebeaucoupunepagehtmllaquelleonaajoutducodeJava
encapsuldansdesbalises(<%%>).Ellevacependantrutiliserdesfonctionnalitsdelaclasse
Servlet tellesquelavariablerequestdelaclasse HttpSerlvetRequest oulavariableoutdela
classejavax.servlet.ServletOutputStream.
AucontrairedesservletsunepageJSPvanouspermettredesparerclairementdeuxtypesdecode
(letraitementdelarequteetlagnrationdufluxHTML).
IlesttrsaisdeprogrammerlaidedunepageJSP;eneffet,ilnestpasncessairedavoirune
grandeconnaissancedelAPIsousjacente.
Parailleurs,contrairementauxservlets,lewebmastervapouvoirmodifierlecodeHTMLsans
avoirtoucheraucodeJava.
Commenousvenonsdelevoir,unepageJSPpeutlafoiscontenirducodeJavaetducodehtml.
LeHTMLvacomposerlastructurestatiquedelapagetandisquelecodeJSPcomposerales
lmentsdynamiquesdelapage.Ceslmentspeuventtrede3types:

Elmentsdescripting
Directives
Elmentsdaction

4.2.Elmentsdebaseduscripting
Ilexiste4typesdlmentsdescriptingdansunepageJSP:lesscriplets,lescommentaires,les
dclarationsetlesexpressions.
Lesscriplets,<%moncodejava%>,sontdesblocsdecodeJavaintgrsauseindunepage
HTML. Ces caractres vont permettre dindiquer le langage utiliser pour traiter le code
encapsul.Lesvariablesdclaresdanscetteportiondecodeneserontconnuesqueducodedela
pagequisuivra.
Exemple:

EssentielServlets&JavaServerPages

23/50

<%Strings="Hello!";%>

Lescommentaires,<%mescommentaires%>,commeleurnomlindiquevontvouspermettre
dinsrer des commentaires dans votre code. Vous pouvez videmment utiliser les balises de
commentaireHTML,maislavantagedesbalisesJSPestquelescommentairesneserontpas
visiblesdesutilisateurs.
Lesdclarations,<%!%>,vontpermettrededclarerdesmthodesetdesvariablesdinstance,
connuesdetoutelapageJSP,afinquellessoientintgresdanslaservletrsultante.Ellespeuvent
treplacespuisutilisesnimporteodanslapageJSP.
Lesexpressions,<%=%>,sontvalueslorsquunepageJSPestdemandeetleursrsultatssont
convertisenunechanetransmiselobjetoutimplicite.Aucunpointvirgulenestrequislafin
duneexpression.
Exemple:
Message:<%=s%>

Affichage:
Hello!

4.3.LesobjetsimplicitesenJSP
Lorsquevousallezcoderenjavalintrieurdevosscriplets,vousaurezaccsuneliste
dlments,appelsobjetsimplicites,quivouspermettrontdinteragiraveclenvironnementdela
servletdexcution.

Llmentrequestfaitrfrencelobjetjavax.servlet.http.HttpServletRequestassoci
larequte.IlvapermettredaccderauxparamtresPOST,GET,oulesenttesdes
requteshttptelsquelescookies.

Llmentresponsefaitrfrencelobjetjavax.servlet.http.HttpServletResponse
envoyaveclarponseduclient.Ilnestpassouventutilis,puisquonluiprfreleflux
desortieout.

Llmentoutfaitrfrencelobjetjavax.servlet.jsp.JspWriterestunfluxdesortie
permettantdenvoyerlarponseauclient.

Llmentconfigfaitrfrencelobjetjavax.servlet.ServletConfigdelapage.

24/50

EssentielServlets&JavaServerPages

LlmentpageContextfaitrfrenceaucontextedelapage,reprsentparlobjet
javax.servlet.jsp.PageContext.Ilvapermettredaccderdiffrentsattributsdelapage.

Llmentapplicationfaitrfrencelobjetjavax.servlet.ServletContext.Ilva
permettredenregistrerdesdonnesglobalestoutcommelesvariablesdinstance.La
diffrenceestquecesdonnesvonttrepartagspartouteslesservletsdumoteurde
servlets.

Llmentpagefaitrfrenceuneinstancedelapageellemmetoutcommelefaitthis
dansuneclassejava.

Llmentsessionfaitrfrencelobjetjavax.servlet.http.HttpSession.

Llmentexceptionfaitrfrencelobjetjava.lang.Throwable.Ilpermetdattraper
lesexceptions.

4.4.Exempledutilisationavecunformulaire
Onsouhaitecrerunformulairetrssimplepermettantdentrerdesdonnesdansunchampde
textepuisdelesafficherdansunepagesuivantequelonaccderalaidedunbouton.

Figure1:Formulaire.html

Figure2:ResultForm.jsp
VoicilecodecorrespondantauxpagesJSPFormulaire.htmletResultForm.jsp:

EssentielServlets&JavaServerPages

25/50

FirstJSP.html:
NousneattarderonspassurcettepartiedecodepuisquecefichiernecontientqueducodeHTML.
<html>
<head>
<title>MonFormulaire</title>
</head>
<body>
<h1>MonFormulaire</h1>
<formaction="ResultForm.jsp"method="post">
<table><tbody>
<tr><td>
Votrenom<inputtype="text"name="nom">
</td></tr>
<tr><td>
Votreprenom<inputtype="text"name="prenom">
</td></tr>
<tr><td>
<inputtype="submit"name="submit"value="Valider">
<inputtype="submit"name=submitvalue="Reset">
</td></tr>
</tbody></table>
</form>
</body>
</html>

Result.jsp:
Cette partie de code est plus intressante; on peut voir ici comment rcuprer des donnes
envoyesparunformulaire.
Ainsi,grcelamthodegetParameter(Strings)delavariablerequest,onpeutrcuprerlavaleur
desvariablespassesenparamtre.
<html>
<head>
<title>Rsultatsdemonformulaire</title>
</head>
<body>
<h3>Mesinformations</h3>
<%
if(request.getParameter("submit")!=null){

if(request.getParameter("submit").equals("Valider")){
%>
<table><tbody>
<tr><td><b>Nom:
</b><%out.println(request.getParameter("nom"));%></td></tr>
<tr><td><b>Prenom:
</b><%out.println(request.getParameter("prenom"));%></td></tr>
<tr><td><formaction="Formulaire.html"><inputtype="submit"

EssentielServlets&JavaServerPages

26/50

value="Retour"></form></td></tr>
</tbody>
</table>
<%
}else{
%>
<jsp:forwardpage="Formulaire.html"/>
<%
}
}
%>
</body>
</html>

4.5.Elmentsdaction:Inclusionsdescriptsetbalises
jsp:
UnlmentdactionestconstitudebalisesquelonpeutintgrerdansunepageJSP.
VoicicidessousladescriptiondesactionsJSPstandard.

jsp:useBean

LabaliseuseBeanvapermettredesparerlapartietraitementducodedelapartieprsentation.En
effet,onvaavoirdesclassesjava,quivontnouspermettredecrerlesJavaBeans.Ceuxcivont
rcuprerdiffrentesdonnesdelapageJSP,lestraiteretventuellementretournerdesdonnes
quelonpourraafficherdanslapageJSP.
UnJavaBeanestunobjetreprsentuneclasseJavaquidoitrespecterlesrglessuivantes:

Elledoitcomporteraumoinsunconstructeursansargumentsdclarenpublic
Aucunsdesattributsnedoiventtrepublics
Chaqueattribut(property)doitavoirungetteretunsetter.
Pourlesattributsboolens,ondoitremplacergetXXX()parisXXX().

//SESATTRIBUTS.
LabaliseuseBeanpermetdinstancieruncomposantJavaBeanquipourratreappeldansla
pageJSP.
MonBean.java
packagemonpackage;
publicclassMonBean{
privateintnb;
privatebooleanempty;
publicMonBean(){
}
publicintincrem(inti){
returnnb+10;
}
publicintgetNb(){
returnnb;

EssentielServlets&JavaServerPages

27/50

}
publicvoidsetNb(intnb){
this.nb=nb;
}
publicbooleanisNb(){
returnempty;
}
}

TestBean.jsp

<jsp:useBean id="testB" class="monpackage.MonBean"/>

Ici,unobjetdetypemonpackage.MonBeanvientdtrecretaffectlavariabletestB.
Remarque:Ilestncessairedeplacervotreclassedansunpackage.

Lesbalisesjsp:setPropertyetgetProperty

CesbalisesvontpermettredercupreroumodifierlesvaleursduneinstancedeJavaBean.
Ilya3maniresdefaire:
Unetoilepourpropertypermetdattribuerautomatiquementchaqueattributdelobjetbeanles
valeursrcupresdunformulaireparexemple.
<jsp:setProperty name="testB" property="*"/>

Onpeutindiquerdirectementlenomdelapropritlaquelleonveutattribuerunevaleur.
<jsp:setProperty name="testB" property="nomProp" param="nomParam"/>

Onpeutindiquerdirectementlenomdelapropritlaquelleonveutattribuerunevaleuret,de
plusindiquerlavaleurgrcelattributvalue.
<jsp:setProperty name="testB" property="nomProp" value="Jean"/>

Pourrcuprerlesvaleursassignesgrceauxbalises<jsp:setProperty>,onagiradelamanire
suivante:
<jsp:getProperty name="testB" property="nomProp"/>

Onpeut,parlasuite,utilisercetteinstancedeJavaBeandansdesbalisesscripletsetfaireappel
sesmthodes.Ainsi,aulieudutiliserlabalise<jsp:getProperty>,onpourrautiliserlasyntaxe
suivante:
<%= testB.getNomProp() %>

Lesbalisesjsp:includeetparam

Labaliseincludeestutilisepourintgrerdesressourcesstatiquesoudynamiquesdansunepage
JSP.Ellevapermettredincluredesfichiersaumomentdelarequte.

28/50

EssentielServlets&JavaServerPages

<jsp:include>

JSP
originale

Compilation

JSP
compil
e

Fichier
inclure

LarponseHTTPestinsredansla
rponsedelaJSPoriginale

Rponse
HTTP

Ilestaussipossibledinclureunfichieraumomentdelatraductiondelapage,justeavantla
compilation(4.4.2).
Afindepasserdesinformationslaressourceinclureilsuffitdajouterlalignesuivante:
<jsp:includepage="Cheminrelatifdelapage"flush="true">
<jsp:paramname="PARAM1"value="VALUE1"/>
<jsp:paramname="PARAM2"value="VALUE2"/>(...)
</jsp:include>
jsp:forward
Cettebaliseestutilisepourpasserlecontrledelarequteuneautreressourcedynamiqueou
statique.
Afindepasserdesinformationslaressourceinclure,ilsuffitdeprocderdelammemanire
quelabaliseinclude,aveclabaliseparam.
Exemple:
<jsp:forwardpage="Redirect.jsp">
<jsp:paramname="redir"value="camarche"/>
</jsp:forward>
Ainsi,danslapageRedirect.jsponvapouvoirrcuprerlavaleurderedirlaidedela
variablerequest(request.getParameter("redir")).

Lesbalisesjsp:pluginetjsp:fallback

La balise plugin est utilise pour gnrer des tags HTML <object> ou <embed> permettant
dindiqueraunavigateurclientlechargementduplugincorrespondantlabalise.
Labalisefallbackvapermettredespcifierlemessagemontrersileclientnesupportepas
laffichagedapplet.

29/50

EssentielServlets&JavaServerPages

4.6.Directives
LesdirectivessontdesmessagesenvoysaucontainerJSPquivontindiqueraucontainerlafaon
dontildoittranscrireunepageenservlet.Cesdirectivessontreprablesgrceauxcaractres
<%@%>.
Ilexiste3typesdedirectives;lesdirectivesdepages,lesdirectivesdinclusionsetlesbalises
personnaliss.

4.6.1.Directivesdepages
Ces directives se prsentent sous la forme suivante: <%@page... %>. Elles prennent en
paramtreuncertainnombredeparamtreslistscidessous:
Paramtre
langage
info
contentType
extends
import

Rleduparamtre

Valeurspossibles

Indiquelelangageutilis
Letextecontenudansceparamtre,contenantdesinformationssur
lapageserarcuprablegrcelamthodeservlet.getServletInfo()
IndiqueletypeMIME(MultipurposeInternetMailExtension)dela
pageainsiquelejeudecaractresutiliss
Indiquelaclassemredelaservletgnre.Cetattributest
manipuleravecprcaution.
Indiquelesinclusionsdepackageoudeclasses.Plusieurs
localisationspeuventtrespcifies,spareslaidedevirgule.
<%@pageimport="java.util.*"%>
<%@pageimport="java.util.*,java.io.*"%>
Ilcorrespondlimportdansuneclassejava.

java
dpendducontainerde
lajsp
text/html;charset=ISO
88591
class

buffer

Pardfaut,lecontenudunepageJSPestbufferispouraccrotre
lesperformances.
Indiquesiletampondoittrevidlorsquilestplein.
autoFlush
Indiquesilapagecourantepeutaccderauxdonnesstockes
session
danslasession.
IndiquesilemodleSingleThreadModel(vuaupoint3.3.3)est
isThreadSafe
utilisounon.
Touteexceptionnongredanslecodeseraremontelaclasse
errorPage
mredelaJSP.
IndiqueauconteneurJ2EEquelaservletgnresertdepage
isErrorPage
derreur.
*lesvaleursengrassontlesvaleurspardfaut

Aucune

8192b
true/false
true/false
true/false
url
false

4.6.2.Directivesdinclusions
CesdirectivespermettentdinclurelecontenudunautrefichierdanslapageJSPcourantelaide
delasyntaxesuivante:<%@includefile="UrlRelative"%>.
CetypedinclusionestralisavantlacompilationdelaJSPenservlet

30/50

EssentielServlets&JavaServerPages

JSP
originale

prcompilation

Fichier
inclure

compilation

JSP
Fichier
Originale

JSP
compil

4.6.3.Directivesdestaglibs
Ces directivesdfinissentl'adresseetleprfixed'unelibrairiedebalises(tags)pouvanttre
utilissdanslapage.
<%@tagliburi="tagLibraryURL"prefix="tagPrefix"%>

Ellespermettentd'allercrerdenouveauxtagsdelaforme:
<tagPrefix:NomTagattribut1="valeur"...%>...</tagPrefix:NomTag>

Noustudieronsplusprcismentcesdirectivesdanslechapitresuivant(4.7).

4.7.Lesbalisespersonnalises(Taglib)
4.7.1.Prsentation
Commenouslavonsexpliquprcdemment,unepageJSPestunepagedecodequipeutcontenir
duHTMLetducodeJava.MalgrlapuissanceofferteparlelangageJava,ilarrivesouventque
lon rcrive plusieurs fois la mme chose au sein d'une mme page JSP (boucles, tests,
rcuprationd'objetsensession).
Afindvitercetypedepertedetemps,unmcanismepermettantd'effectuercestchesrptitives
l'aidedebalisespersonnalisesatmisenplace.Cemcanismequidfinitlefonctionnement
denouvellesbalisess'appelletaglib.
Permettantd'isolerlecodeJavadansunfichier.javapluttquedansunfichier.jsp,cestaglibont
pourbutdefaciliterlorganisationdune ralisationdunsiteWebenJSP.Ceciesteneffet
fondamentalpourledveloppementetsurtoutlamaintenancepuisquonvapermettred'isolerle
travaildesWebdesignersdeceluidesdveloppeurs.
Ainsi,onvaavoirunfichierTLDquivadcrirelesattributsdelabaliseetunfichierJavaquiva
dcrirelesactionsdelabalise.

EssentielServlets&JavaServerPages

31/50

4.7.2.Utilisationdetaglibprdfinies
(LesCustomTagprsententunegranderichessedanslaprogrammationJSP.Lolonvapouvoir
rellementprofiterdeleurpuissance,cestenrutilisantdestaglibsprdfinies,trscomplteset
parfaitementrutilisables.)
LaJSTL(JavaServerPagesStandardTagLibrary)estunelibrairiederfrence.Ellecontienttoute
unesriedebalisespersonnalisesquivontpermettre,parexemple,ditrer,excuterdesrequtes
SQL,utiliserdesdocumentsXML.
Ilexiste,parailleursdenombreusesautreslibrairiestoutesaussipuissanteslesunesquelesautres.
Voiciquelquesliensovoustrouverezlesplusconnues:

http://jakarta.apache.org/taglibs/
http://displaytag.sourceforge.net/install.html
http://struts.apache.org/userGuide/

LaJavaServerPagesStandardTagLibrary
LaJSTLprsentedoncdenombreusesfonctionnalits.Nousallonsprsenterquelquesexemples
dutilisation.
Toutdabord,pourutiliserdesbalisesdecettelibrairie,ilfaututiliserunconteneurdapplication
implmentantaumoinslAPIservlet2.3etlAPIJSP1.2(J2EE1.3).Ladernireversion1.1
ncessiteunconteneurimplmentantlAPIservlet2.4etlAPIJSP2.0(J2EE1.4).
Touslesfichiersncessairesleurutilisationsetrouventdanslarchive Standard1.1Taglib.quiest
limplmentationderfrencedApacheJakarta..
Unefoislarchivercupre,ilfaudraplacer:

lesTLD(prsentsdans/tld)danslerpertoire/WEBINF/tlds/
lesfichiersjstl.jaretstandard.jar(prsentsdans/lib)danslerpertoire/WEB
INF/lib

LesJSTLprsentent5librairiesdiffrentes:

LalibrairieCorereprsentelesfonctionsdebaseetestassocieaufichierTLDc.tld.

LalibrairieXMLreprsentelestraitementsXMLetestassocieaufichierTLDx.tld

LalibrairieFormatreprsentelesfonctionsdinternationalisationdelapageJSP(I18n)
ainsiquelamanipulationdedates.ElleestassocieaufichierTLDfmt.tld

EssentielServlets&JavaServerPages

32/50

LalibrairieDatabasereprsentelestraitementsSQL,elleestassocieaufichierTLD
sql.tld

LalibrairieFunctionsreprsentedesfonctionssupplmentaires,portantmajoritairement
surlamanipulationdechanesdecaractres.

NoustudironsendtailsleslibrairiesCoreetFormat

LalibrairieCore
Cettelibrairieconcernelesbalisesdebasetellesquedesbalisesdecondition,degestiondurlou
ditration.

Lesbalisesdexpressiondelangage:out,set,removeetcatch.

LabaliseoutpermetdenvoyerunfluxdesortielapageJSPcontenudanslattributvalue.Elle
prend,depluspourattributsdefault(valeurpardfautsivalueestnulle)etescapeXml(boolen
indiquantsilescaractresparticuliers <, >, &, ", doiventtreconvertisenleurquivalent
HTML&lt;,&gt;,&amp;,&quot;,,truepardfaut).
Onnoteraquecettebalisedoitconteniraumoinslattributvalueetnedoitpascontenirdecorps.
Exemple:
<c:outvalue="Hello!"default="defaultvalue"escapeXml="true"/>

Labalisesetpermetdestockerunevariabledontonvadfinirlaportedevisibilit.
Ellepermetdinstancierunevariable,laidedesattributsvar(nomdelavariable)etvalue
(valeurstocker)oubiendemodifierlesvaleursdunobjetbean,laidedesattributs target
(nomdelavariablecontenantlebean), property (nomdelapropritdubean)et value.Cest
ensuitelattributscopequivapermettredespcifierlaportedevisibilitdelavariable.Ilpeut
prendreenparamtrelesvaleurssuivantes:page,request,sessionetapplication.
Exemple1:
<c:setvalue="Hello!"var="mess"scope="page"/>

Exemple2:
<c:setvalue="Hello!"target="monBean"property="nomB"scope="page"/>

EssentielServlets&JavaServerPages

33/50

Pourrcuprerlavaleurdelavariable,onvapouvoirutiliserlabaliseoutvueprcdemmenten
utilisantlasyntaxesuivante${nomvariable}.
Ilestimportantdespcifierdansladirectivedepage<%@page%>lattributisELIgnoredla
valeur false. Eneffet,tantpardfaut true,lapagejspinterprteraitlachanedecaractre
"${nomvariable}"entantquechanedecaractreetnonentantquevariable.Cependant,avecun
conteneurJSP2.0,lattributisElignoredestpardfautsurfalse:
Exemple:
<c:outvalue="${pageScope.mess}"default="defaultvalue"escapeXml="true"/>

Sionneprcisepaslaportedelavariabledanslattributvalue(value="${mess}"),ellesera,par
dfautrecherchedanslapage,puisdanslarequte,lasession,etenfindanslapplication.
Labaliseremovepermetdesupprimerunevariable.Ilsuffitpourceladespcifierlenomdela
variabledanslattributvaretlaportedecettevariabledanslattributscope.
Labalisecatch,commesonnomlindique,permetdattraperlesexceptions.Lecoderisquantde
leveruneexceptiondoittreencapsulentrelesbalises catch.Lattribut var quicontientles
informations concernant lexception leve possde une proprit message qui va permettre
dafficherunmessagederreur.
Exemple:
<c:catchvar="Erreur">
<%coderisquantdeleveruneexception%>
</c:catch>
<c:outvalue="${Erreur.message}"/>

Lesbalisesdeconditionetditration:if,choose,when,forEach,forTokens.

Labaliseifvalueuneconditionestsielleestvraie,lecorpsdelabaliseestexcut
Exemple:
<c:setvalue="5"var="number"scope="page"/>
<c:iftest="${number==5}">Testvrai</c:if>

Puisqueletestestvalide,"Testvrai"estaffich.
Labalisechooseestquivalenteunmenuswitch.Ellesutiliseconjointementaveclabalise
whenquipermetdelisterlesdiffrentschoix.Siaucunedesconditionswhennestvrifie,la
baliseotherwisedfinituncomportementpardfaut.
Exemple:
<c:setvalue="5"var="number"scope="page"/>
<c:choose>
<c:whentest="${number==4}">Lavariablevaut4</c:when>
<c:whentest="${number==5}">Lavariablevaut5</c:when>
<c:whentest="${number==6}">Lavariablevaut6</c:when>
<c:otherwise>Lavariablenestpascompriseentre4et6</c:otherwise>

EssentielServlets&JavaServerPages

34/50

</c:choose>

Lesbalisesdegestiondurl:import,url,redirect.

Labaliseimportpermetdimporterdesressourcescommedesfichierstexte,XML,pagesJSP.Il
estpossibledimporterdesressourcesdistantesoulocales.Lattributvarsertstockerla
ressourcesousformedeStringetvarReadervaservirobtenirunReaderpermettantdeparserla
ressource,notammentlesfichiersXMLtudisplusloin.
Exemple:
<c:importurl="/resources/test.txt"/>
<c:importurl="http://www.blabla.fr/test.txt"var="text"scope="page"/>
<c:importurl="/resources/test.xml"varReader="reader">
<!parsing>
</c:import>

LabaliseurlpermetdestockeruneURL,localeoudistante,dansunevariablepouvanttre
rutiliseultrieurement.
Exemple:
<c:urlvalue="http://www.labosun.com"var="adresse"/>
<c:importurl="${adresse}/cours.jsp"/>

LabaliseredirectsertredirigerunclientversuneURL.
Exemple:
<c:redirecturl="/index.html"/>

LalibrairieFormat
CettelibrairiecontientdesbalisesspcifiquespourlinternationalisationdespagesJSP.Le
multilanguesappuiesurdesResourceBundlequigrentdesfichiers.properties.Chaquelanguea
sonfichier.propertiesetcepourchaquebundle.Unbundledoittrecomposdefichierproperties
possdantuneracinecommune.Parexemple,lebundlemessageestcomposdunfichier
message.propertiesdebase,dunmessage_en.propertiespourlanglais,dun
message_fr.propertiespourlefranaisetc
Unfichierpropertiesestcomposdecouplescls/valeurs:
Fichiermessage_en.properties
accueil=Welcome
texte=Thispageisatest

Fichiermessage_fr.properties
Accueil=Bienvenue
Texte=Cettepageestuntest

CesfichierpropertiessontplacerdanslerpertoireWEBINF/classes.

EssentielServlets&JavaServerPages

35/50

LabalisededclarationdunResourceBundle:setBundle

CettebalisesetBundlepermetdedfinirunResourceBundleutiliser.Lattributbasename
contientlenomduResourceBundle.Danslecasolonsouhaiteraitutiliserplusieurs
ResourceBundledansunemmepage,ilestpossiblededonnerunnomdevariablepourchaque
bundlegrcelattributvarafindelesdiffrencier.

Labalisedaffichagedechane:message

Cettebalisemessagepermetdafficherunechanedecaractrescontenuedansunfichier
propertiesdunResourceBundle.Lattributkeypermetdechoisirlaclcontenantcettechane.Il
estncessairededfinirleResourceBundleutiliserenutilisantlattributbundlesiceluiciat
dclardansunevariable(attributvardelabalisesetBundle)
Exemple:
<!sansutilisationdevariable>
<fmt:setBundlebasename="message"/>
<fmt:messagekey="accueil"/>
<!avec>
<fmt:setBundlebasename="message"var="monBundle"/>
<fmt:messagekey="accueil"bundle="monBundle"/>

UnclientfranaisverralemessagedaccueilBienvenuesafficheralorsquunanglaisverra
Welcome.

4.7.3.LAPIJSPCustomTag
LabalisepersonnalisedoittrerelieunTaghandlerquivadfinirsesactions.Untaghandler
estuneclasseJavaappelechaquefoisquelecontainerdeJSPrencontreunebalisepersonnalise.
Cetteclassedoitimplmenteruneinterfacedupackage javax.servlet.jsp.tagext odriverde
lunedesclassesdecepackage.
Les3interfaceslesplusimportantessontTag,IterationTagetBodyTag.

LinterfaceTag
publicinterfaceTag{
intdoEndTag();
intdoStartTag();
TaggetParent();
voidrelease();
voidsetPageContext(PageContextpc);
voidsetParent(Tagt);
}

EssentielServlets&JavaServerPages

36/50

Linterface Tag est donc linterface implmenter lors de la cration dun tag handler. Les
diffrentesmthodesquelleimplmentevontpermettre,tourtourlinitialisation,lvaluation
puislafermeturedenotrebalise.Leurcomportementsuituncycledevie,dcritcidessous.

LecycledeviedunTagHandler
Toutdabord,ilfautsavoirquedansunepageJSP,unebalisenestinstanciequuneseulefois.
Celasignifiequesivousfaitesappelunemmebaliseplusieursfoisdansunepage,lecontainer
feratoujoursappellammeinstancedutaghandler(classeJavacorrespondantlabalise).
LecycledevieduntaghandlerestcontrlparlecontainerdeJSP:
1. Dansunpremiertemps,lecontainerdeJSPobtientuneinstancedutaghandlerpartirdu
pool,ouencreunenouvelle.
2. IlappelleensuitelamthodesetPageContext()laquelleilpasseunobjetPageContext
reprsentantlapageJSPquicontientlecustomtag.
3. LecontainerappelleensuitelamthodesetParent()laquelleilpasseunobjetTag(tag
duparent)ouunobjetnull.
4. LecontainerdeJSPdfinitensuitetouslesattributsducustomtag.Lesattributssont
traitscommelespropritsdansunJavabean(getters,setters)
5. LecontainerappelleensuitelamthodedoStartTag().Cellecipeutretournerlesvaleurs:
a. Tag.SKIP_BODY:Ilnyapasdvaluationducorpsdelabalise,cestdire
quelecontenuentrelabalisedouvertureetdefermetureneserapasaffich.
b. Tag.EVAL_BODY_INCLUDE:Lecontainertraitelecorpsdutagentantque
JSPetilestaffichdanslapageJSP(cecorpspeuttreconstitudeJSP,de
HTML,etmmedautrestags).
6. Quellequesoitlavaleurretourneprcdemment,lecontainerappelleensuitelamthode
doEndTag().Cettemthoderetournelavaleur
a. Tag.SKIP_PAGE:pasdetraitementpourlerestedelapageJSP,lecontenude
lapagesetrouvantaprslabalisedefermetureneserapasaffich.
b. Tag.EVAL_PAGE:LerestedelapageJSPesttraitnormalement.
7. Laderniremthodeappeleestlamthoderelease().Cestauseindecettemthodequil
estpossibledcrireducodedelibrationdelammoire(fermeturedesconnexions).
Onnoterabienquecettemthodenestpasforcmentappelechaquemthode
doEndTag()!Eneffet,lecontainerneferaappelcettemthodequelorsquelobjetTag
handlerneseraplusutilis,justeavantdesupprimersarfrencedfinitivement.
8. Enfin,lecontainerdeJSPretourneuneinstancedutaghandlerdanslepool.

37/50

EssentielServlets&JavaServerPages
SchmaducycledevieduTaghandler(1)
setPageContext()
setParent()
setAttribute()

Tag.EVAL_BODY_INCLUDE

valuationdu
contenuducorps

doStartTag()
Tag.SKIP_BODY

doEndTag()
Tag.EVAL_PAGE
valuationdu
restedelapage

Tag.SKIP_PAGE
Pasdvaluationdurestede
lapage

release()

Pourlemoment,lesmthodesdenotreTaghandlernouslimitentdansnosactions.Parexemple,
onnepeutvaluerlecorpsdenotrebalise(soncontenu)quuneseulefois,et,silonpeutafficher
desdonnes,onnepeutpasrcuprerlecorpsdelabaliseetlemodifier.
Onnepeutquercuprerdesdonnesmisesenparamtredelabalise.
ExempledebaliseimplmentantdirectementlinterfaceTag:
NousallonscrerunTaghandlercorrespondantunebalisemessColor.Cettebalisevaafficherle
messageHelloWorldTag!avecunecouleurdfinieenparamtre.
publicclassMonTagimplementsTag{
privatePageContextpageContext;
privateTagparent;
privateStringcolor;
publicvoidsetColor(Stringcolor){
this.color=color;
}
publicvoidsetPageContext(PageContextarg0){
pageContext=arg0;
}
publicvoidsetParent(Tagarg0){
parent=arg0;
}
publicTaggetParent(){
returnparent;
}

38/50

EssentielServlets&JavaServerPages
publicintdoStartTag()throwsJspException{
JspWriterout=pageContext.getOut();
try{
out.println("<fontcolor="+color+">HelloWorldTag!
</font>");
}catch(IOExceptione){
}
returnSKIP_BODY;
}
publicintdoEndTag()throwsJspException{
returnSKIP_PAGE;
}
publicvoidrelease(){
}
}

LinterfaceIterationTag
Linterface IterationTag, qui tendlinterface Tag, permetdafficherplusieursfoislecontenu
duntag.
publicinterfaceIterationTag{
intdoAfterBody();
}

La mthode doAfterBody() est appele aprs la mthode doStartTag() et peut retourner


Tag.SKIP_BODYouTag.EVAL_BODYAGAIN.
Ellevapermettrelarvaluationducorpsdelabaliseplusieursfois.SidoAfterBody()retourne
lentier Tag.SKIP_BODY la mthode doEndTag() est directement appele, si lentier
Tag.EVAL_BODYAGAINestretournlamthodedoAfterBody()estrappele.
SchmaducycledevieduTaghandler(2)
setPageContext()
setParent()
setAttribute()

Tag.EVAL_BODY_INCLUDE

doStartTag()
Tag.SKIP_BODY

valuationducontenuducorps

Tag.SKIP_BODY
IterationTag.EVAL_B
ODY_AGAIN

doAfterBody(
Tag.SKIP_PAGE

Tag.EVAL_PAGE
valuationdu
restedelapage

doEndTag()
Pasdvaluationdurestede
lapage

39/50

EssentielServlets&JavaServerPages

release()

LinterfaceBodyTag
Linterface BodyTag, qui tend linterface IterationTag, permet de rcuprer le corps de la
balise.
publicinterfaceBodyTag{
voiddoInitBody();
voidsetBodyContent(BodyContentb);
}

Cetteinterfaceimplmentedeuxmthodessupplmentaires:
La mthode setBodyContent(BodyContent b), appele aprs la mthode doStartTag() va
initialiserleBodyContent,etdoncpermettredercuprerlecorpsdelabaliseetdelemodifier.
LamthodedoInitBody()vapermettredevrifierquecetobjetBodyContentabientinitialiset
retourneruneJspTagExceptionsicenestpaslecas.
SchmaducycledevieduTaghandler(3)
setPageContext()
setParent()
setAttribute()
Tag.EVAL_BODY_INCLUDE
valuationducontenu
ducorps
IterationTag.EVAL_B
ODY_AGAIN

BodyTag.EVAL_BODY_BU
FFERED
setBodyContent()
doStartTag()
doInitBody()
Tag.SKIP_BO
DY
valuationducontenuducorps

Tag.SKIP_BODY
doAfterBody(

Tag.EVAL_PAGE

doAfterBody
IterationTag.EVAL_BOD
Y_AGAIN
ou
BodyTag.EVAL_BODY_B
Tag.SKIP_PAGE
UFFERED

Tag.SKIP_BOD
Y

doEndTag()

valuationdu
restedelapage

Pasdvaluationdurestede
lapage
release()

EssentielServlets&JavaServerPages

40/50

Crationduncustomtag
OnpeutdiviserlescustomsTagsendeuxcatgories;

Lesbalisessanstraitementdecorps

Ilsagitdesbalisescommelessautsdeligne(balise<br>enHTML)quinevontpasncessiterde
modificationdecontenu.
Pour crer une balise ne ncessitant pas de modification de contenu, on va crer une classe
tendantlaclasseTagSupportquiellemmeimplmentelinterfaceIterationTag:
publicclassTagSupport{
intdoEndTag();
intdoStartTag();
staticTagfindAncestorWithClass(Tagfrom,Classclasse);
StringgetId();
TaggetParent();
ObjectgetValue(Stringk);
EnumerationgetValues();
voidremoveValue(Stringk);
voidsetId(Stringid);
voidsetPageContext(PageContextpageContext);
voidsetParent(Tagt);
voidsetValue(Stringk,Objecto);
}

LavantagedtendrelaclasseTagSupportetnonlinterfaceInterationTagestquelonpourrane
redfinirquelesmthodesdontonabesoindemodifier.
En effet, on a pu remarquer dans les exemples de classe implmentant les interfaces Tag,
IterationTagouBodyTag,quelonestobligderedfinirtouteslesmthodesdesinterfacescequi
estassezcontraignant.
VoicilesimplmentationspardfautdecetteclasseTagSupport:

LamthodedoStartTag()retournelentierSKIP_BODY.

LamthodedoAfterBody()retournelentierSKIP_BODY.

LamthodedoEndTag()retournelentierEVAL_PAGE.

Exempledebalisesanstraitementdecorps:
Nousallons,danscetexemple,crerunebaliseaffichantlemessage"Tagsanscorps"avecunfont
colordfini.Pourcela,nousallonscreruneclasseJava(taghandler)TagSansCorps,tendantla
classeTagSupport.
TagSansCorps.java
publicclassTagSansCorpsextendsTagSupport{
privateStringcouleur;
publicvoidsetCouleur(Stringcouleur){
this.couleur=couleur;
}
publicintdoEndTag()throwsJspException{
JspWriterout=pageContext.getOut();
try{

EssentielServlets&JavaServerPages

41/50

out.println("<fontcolor="+couleur+">Tagsans
corps</font>");
}catch(Exceptione){
System.out.println(e.getLocalizedMessage());
}
returnEVAL_PAGE;
}
}

LaclasseTagSansCorpspossdedoncunattributcouleurquivadfinirlacouleurdefontdenotre
message.

Lesbalisesavectraitementdecorps

Ilsagitdesbalisescommedesmisesengrasouencouleur(balises<b></b>oubien<font
color></font>enhtml)quivontmodifieruncontenu.
Pourcetypedebalises,onvacreruneclassetendantlaclasseBodyTagSupportquiellemme
tendlaclasseTagSupportetimplmentelinterfaceBodyTag:
publicclassBodyTagSupport{
intdoAfterBody();
intdoEndTag();
voiddoInitBody();
intdoStartTag();
BodyContentgetBodyContent();
JspWritergetPreviousOut();
voidrelease();
voidsetBodyContent(BodyContentb);
}

Ainsi,pourrcuprerlecorpsdelabalise,vousallezrcuprerleBodyContentdela classe
BodyTagSupport.
LaclasseBodyContent:
Cette classe hrite de javax.servlet.jsp.JspWriter. Elle reprsente le corps du custom tag
(lorsquilexiste).
LeBodyContentduncustomtagpeuttrercuprpartirdelamthodegetBodyContent()de
linterfacebodytagpartirduparamtreenargumentdelamthode.
Stringcontent=bodyContent.getString();
Enfin,lcritureverslapageJSPsefaitlaidedunPrintWriterjointaucorpsdutag
JspWriterout=bodyContent.getEnclosingWriter();
VoicilesimplmentationspardfautdecetteclasseBodyTagSupport:

LamthodedoStartTag()retournelentierEVAL_BODY_BUFFERED.

LamthodedoAfterBody()retournelentierSKIP_BODY.

LamthodedoEndTag()retournelentierEVAL_PAGE.

Exempledebalisedetraitementdecorps:

EssentielServlets&JavaServerPages

42/50

LaclasseUpperTag.javaquelonautilisdanslexempledefichier.tldcorrespondjustement
unebalisedetraitementdecorpspuisquelledoitpermettredercupreruncorps,lemettreen
majusculeetlerenvoyer.
CetteclasseUpperTagvadonctendrelaclasseBodyTagSupport:
UpperTag.java
publicclassUpperTagextendsBodyTagSupport{
privateintnb=0;
privateStringcouleur="";
publicintdoAfterBody()throwsJspException{
nb;
if(nb>=0){
BodyContentbc=getBodyContent();
Strings=bc.getString().toUpperCase();
JspWriterout=getBodyContent().getEnclosingWriter();

try{
out.println("<br><fontcolor="+couleur+">Votre
contenu:"+s+"</font>");
bc.clearBody();
returnEVAL_BODY_BUFFERED;//lerenvoide
//EVAL_BODY_BUFFEREDvaprovoquerlerappeldecettemthodedoAfterBody()
}catch(IOExceptionio){
}
}
returnSKIP_BODY;
}
/**
*@paramcouleurThecouleurtoset.
*/
publicvoidsetCouleur(Stringcouleur){
this.couleur=couleur;
}
/**
*@paramnbThenbtoset.
*/
publicvoidsetNb(Stringnb){
this.nb=Integer.parseInt(nb);
}
}

RleetformatdufichierTLD(TagLibrairyDescriptor)
Le fichier TLD est un fichier XML qui va permettre de dfinir les diffrentes balises
personnalises.
SyntaxedunfichierTLD:
Balise
<taglib>(obligatoire)

Rledelabalise
Constituellmentracinedufichier

<tlibversion>(obligatoire)

versiondelalibrairiedebalise

EssentielServlets&JavaServerPages

<jspversion>(obligatoire)
<shortname>
<info>
<uri>
<tag>

43/50

versiondesspcificationsJSPdontdpendlalibrairiede
balise
nomcourtpourlalibrairie
informationspourladocumentation
lienversunesourceadditionnellededocumentation
identifiantdemanireuniquelalibrairie
englobeladfinitiondunebalisepersonnalise

o Llmenttag
Llmenttagvapermettrededfinirlesdiffrentescaractristiquesdenotrebalisepersonnalise
laidedeslmentssuivants:

Nomdellment

Rlededlment

name(obligatoire)
tagclass(obligatoire)
teiclass
bodycontent
Empty:pasdecontenupourletag
JSP:lecorpspeuttreconstitu
dlmentsJSP
tagdependent:lecorpsdoittreinterprt
parcetag
info
Attribute
name(obligatoire):identifiant
required:(true,false)
rtextprvalue:lavaleurdecetattributpeut
tredterminaumomentdela
requte(true,false)

identifiantpourletag
Nomdelaclassecorrespondantlabalise
Nomdelaclassedinfoconcernantlatagclass
typedecontenu

descriptions,infos

o ExempledefichierTLD
Danscetexemple,nousavonsuneclasseJavaUpperTag.javaquivapermettredemettreuntexte
enmajuscule.NoussouhaitonsdoncdfinirlabalisecorrespondantedansnotrefichierDesc.tld.
FichierDesc.tld:
<?xmlversion="1.0"encoding="iso88591"standalone="yes"?>
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.2</jspversion>
<shortname>mesTags</shortname>
<description>MespremiersTags</description>
<tag>
<name>Majuscule</name>
<tagclass>UpperTag</tagclass>

<attribute>

EssentielServlets&JavaServerPages

</tag>
</taglib>

44/50

<name>nb</name>
<rtexprvalue>true</rtexprvalue>
<required>false</required>
</attribute>
<attribute>
<name>couleur</name>
<rtexprvalue>true</rtexprvalue>
<required>true</required>
</attribute>

Rledudescripteurdedploiement
LedescripteurdedploiementestunfichierXMLquivapermettreaucontainerdeJSPlaccsau
fichier TLD (en lui indiquant le nom, lemplacement dans le rpertoire...). Il est possible
dliminer le rle du descripteur de dploiement en ajoutant des informations sur le nom et
lemplacementdufichierTLDdirectementdanslapageJSP.Toutefoisceladiminuelaflexibilit,
carlorsdechangements,ilconvientdemodifiertouslesfichiersJSPutilisantlescustomsTags.
Exempledefichierweb.xml:
<webappid="WebApp_ID">
<displayname>Td_Corriges</displayname>
<welcomefilelist>
<welcomefile>index.html</welcomefile>
<welcomefile>index.htm</welcomefile>
<welcomefile>index.jsp</welcomefile>
</welcomefilelist>
<taglib>
<tagliburi>/MesTags</tagliburi>
<tagliblocation>/WEBINF/tlds/Desc.tld</tagliblocation>
</taglib>
</webapp>

Syntaxeetutilisationduncustomtag
LorsquevousvoudrezintgrervotrebalisepersonnalisedansunepageJSP,ilsuffiradetout
daborddedclarerlabaliseendbutdepagecommesuit:
<%@tagliburi="MesTags"prefix="meslibs"%>

LattributuripermetdespcifierlecheminosetrouvelefichierTLDquidcritlasyntaxedela
balise,tandisquelattributprefixpermetdedfiniruneinstanceducustomtag.

EssentielServlets&JavaServerPages
Pourutiliservotrebalisepersonnalise,ilsuffitalorsdutiliserlesexpressionssuivantes:
<PrefixeDuTag:NomTagattribut1="valeur"/>
<PrefixeDuTag:NomTag>body</PrefixeDuTag:Nomtag>
Exemple:
<meslibs:Majusculenb="12"couleur="red">HelloWorld</meslibs:Majuscule>

45/50

EssentielServlets&JavaServerPages

46/50

5.InteractionsentreJSPetServlet
5.1.PourquoifairedesinteractionsentrelesJSPet
Servlet
Bienquellesprsententdesavantagesnormes(gnrationdimageentempsrel,compression
depages)lorsquelapplicationncessitebeaucoupdeprogrammation,lesservletsnesontpas
vraimentadapteslagnrationdecodeHTML,cestgalementpourcelaquelesJSPontfait
leurapparition.
MmesilestechnologiescommelesJavaBeans,lesTagLibs,lesscriptletsontfaitleurapparition
etontmontrleurpuissanceencequiconcernelintgrationdecodejavapropredanslespagesde
rsultat,ilrestetoujoursunproblme.
LesJSPsontfourniespournefournirquunseultypedeprsentation.Silonsouhaitecrerune
applicationcomplexecherchantprsenterlesinformationsdefaondiffrentesenfonctiondes
demandesduclientceladevientdeplusenpluscomplexe.
Cestalorsquinterviennentlestransmissionsderequtes.

5.2.ApartirduneServlet
Pourutiliserlatransmissionderequteoulinclusiondedocumentexterneilfaututiliserun
RequestDispatcher. Cet objet sobtient depuis un ServletContext et la mthode
getRequestDispatcher().
VousdevezfourniruneURLabsoluedufichierverslequelvousvouleztransmettrevotrerequte.
Sivousvoulezobtenirun RequestDispatcher versladresse: http://host/folder/page.jsp ilvous
faudrafairelappelsuivant:
RequestDispatcherdispat=
getServletContext().getRequestDispatcher("/folder/page.jsp");

Unefoisquevousavezeuvotreobjetilnevousresteplusquappelerlamthodeforward()ou
include() de celuici. Vous devez fournir celleci les objets HttpServletRequest et
HttpServletResponse.
Sivousutilisezinclude,laressourceestinsredanslaservletactive.
Sivousutilisezforward,lefluxestcompltementredirigverslanouvelleressource(lappelantne
peut plus effectuer de sortie au client, cette tche est transmise la nouvelle ressource
uniquement).

EssentielServlets&JavaServerPages

47/50

Linclusionouleforwardversunenouvelleressource(pageouservlet)sefaitainsi:
//Inclusion
voidservice(HttpServletRequestreq,HttpServletResponseres){
RequestDispatcherdispat=
getServletContext().getRequestDispatcher("/folder/page.jsp");
dispat.include(req,res);
}
//Forward
voidservice(HttpServletRequestreq,HttpServletResponseres){
RequestDispatcherdispat=
getServletContext().getRequestDispatcher("/folder/page.jsp");
dispat.forward(req,res);
}

Remarques:

Linclusionduneservletdansuneautreestsynchrone,cestdirequellenerendlamain
qulafindelamthodeservice()delaservletappele

Laredirectionestquandelleasynchrone

5.3.ApartirdunscriptJSP
LatransmissionderequtedansuneJSPestquasimentlammequecellepouruneservlet.En
effetmmesiceconceptestbeaucoupmoinsutilisilpeutltrelorsquelaJSPdcouvrequune
donnetransmisenestpascorrecteparexemple.
LamthodeclassiquederedirectionpeuttreutilisaveclesJSP,cependantilestprfrable
dutiliserjsp:forwardpourdesraisonsdecommodits.
Voicilecodequipermetderedirigerversuneautrepage:
//Forward
<jsp:forwardpage="/pageForward.jsp"/>

5.4.Transmissiondesdonnessupplmentaires
Lorsquevousfaiteuneinclusionouunforwardvouspasserlamainunnouveauscriptouune
servlet.Celaneveuxpasdirequelesdonnesquevousavezputravaillerdanslepremierscript
sontpasseslautrescript.
LasolutioncelaestdutiliserlobjetHttpServletRequestetlamthodesetAttribute().Lapage
dedestinationpourraalorsaccdercesinformationsvialamthodegetAttribute().

EssentielServlets&JavaServerPages

48/50

Depuislaversion2.2desservletsunenouvellemaniredenvoyerdesinformationsatmiseen
place.Vouspouvezdirectementmettrelesparamtresdanslurl(mthodeGET)quevouspasser
lorsdelademandeduRequestDispatcher.
Voiciunexempledutilisationdecettemthode:
//Forward
voidservice(HttpServletRequestreq,HttpServletResponseres){
Stringurl="/folder/page.jsp?param1=valeur1&param2=valeur2";
RequestDispatcherdispat=getServletContext().getRequestDispatcher(url);
dispat.forward(req,res);
}

5.5.ApplicationdumodleMVC
EnayantenttelalistedesavantagesetinconvnientsdesServletsetdesJSP,lamiseenplace
dunearchitectureMVCsefaitnaturellement.Eneffet,lesServletssontlimitesgraphiquement,il
convientdelescantonnerauxtraitementsdesrequtes.Deplus,lesJSPtantintgresducode
HTML,undesignerauraplusdefacilitslesmodifier,ainsionlesutiliserapourlapartie
graphiqueduneapplicationWeb.

AinsilapartiegraphiqueafficheauclientestcomposedepagesJSP.CestlapartieVuede
larchitectureMVC.
Lutilisateureffectue,partirdecespagesJSP,desrequtesquisonttransmisesuneServlet.
CettedernirecorrespondauContrleurdansnotrearchitectureMVC.LaServletvatraiterla
reqeteclientenagissantlafoissurlaVueetsurleModle.
LeModlecorrespondlalogiquemtierdelapplication.Ilcontienttouslesobjetsmtiers,par
exempledesJavaBeans,aveclesquelsleContrleurpeutinteragir.Ilestpossibledefaire
communiquerdirectementleContrleuraveclesobjetsmtiersmaiscenestpasrecommand.Ily
agnralementunecouchesupplmentairequisintercaleentrelesdeux.
Unefoistouslestraitementsncessaireslarequteeffectus,laServletvaredirigerlutilisateur
surlapageJSPapproprie.

EssentielServlets&JavaServerPages

49/50

Toutefois,sentenircettearchitecturetoutaulongducycledeviedelapplicationestune
oprationdifficile.Denouvellesfonctionnalitsviennentsegrefferaufuretmesure,etrendent
lamaintenancepeuaise.Afindaiderledveloppeurdanssatche,desframeworkssontapparus
pourstructurerlesprojetsdapplicationsWeb.OnciteraentreautresStruts,Tapestryetplus
rcemmentJSF.

EssentielServlets&JavaServerPages

50/50

6.Hbergeursgratuits
LesServletsetJSPtantdestinesaumondeprofessionnel,laqutedunhbergeurgratuitpour
cestechnologiesnestpasaise.
Voicideuxhbergeursgratuits:
MyJavaServeravecunpetittestpourpouvoirsinscrire
EatJ.com
Deuxlistesassezanciennes:
http://developpeur.journaldunet.com/tutoriel/jav/011124jav_jspfreehost.shtml
http://oinko.net/freejsp/

Вам также может понравиться