Академический Документы
Профессиональный Документы
Культура Документы
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.
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
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)
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:
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).
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
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
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<,>,&,",,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();
}
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¶m2=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/