Title: Programmation Web
1Programmation Web
2Les TagLibs
- La spécification des JSP prévoit la possibilité
de définir ses propres tags XML - Un ensemble de tag est regroupé au sein dune
taglib qui possède URI comme identifiant unique
3JSP Standard Tag Library
- Ensemble de tags pré-programmés permettant
deffectuer les opérations standard - Initiative Apache spécifiée via la JSR052
- Plusieurs parties Core (http//java.sun.com/jstl
/core), Internationalisation (http//java.sun.com
/jstl/fmt), XML (http//java.sun.com/jstl/xml),S
QL (http//java.sun.com/jstl/sql).
4Hello JSTL
- Affiche le champs User-Agent des entêtes
Directive de la taglib core
Définie une variable (script)
Affiche
Ajout des Jars de la JSTL
5Hello JSTL
- Affiche la version du browser
6JSTL Expression Langage
- Langage de script à lintérieur des attributs des
tags
lt_at_ taglib prefix"core" uri"http//java.sun.com/
jstl/core" gt lthtmlgt ltbody bgcolor"white"gt
ltcoreset var"browser" value"header'User-Agen
t'"/gt ltcoreout value"browser"/gt
lt/bodygt lt/htmlgt
lthtmlgt ltbody bgcolor"white"gt lt
request.getHeader("User-Agent") gt lt/bodygt lt/htmlgt
7JSTL Expression Langage (2)
- name permet daccéder à la variable name du
scope (parcours les scopes) - Accéder à une propriété name.prop ou
nameprop - appel sur lobjet name les méthodes
getProp/setProp. - dans le cas dune Map les méthodes get("prop") et
put("prop",value). - Dans le cas des List ou des tableaux,name0)
renvoie le premier élément.
8JSTL Expression Langage (3)
- Variables prédéfinies
- applicationScope ensemble des variables
disponiblepar ordre de visibilité - cookie Collection de tous les cookies
- header entête HTTP vue comme une String
- headerValues entête vue comme une collection de
String - initParam Collection des paramètre
dinitialisation - pageContext objet représentant la page courante
- pageScope collection des variables de la page
- param paramètres sous forme de String
- paramValues paramètres sous forme dune
collection de String - requestScope collection des variables de la
requête - sessionScope collection des variables de la
session
9Deux taglibs jumelles
- 2 langages de script RunTime Script lt
article.getName() gtExpression Language Script
article.name - 2 taglibs RT http//java.sun.com/jstl/core_rt
EL http//java.sun.com/jstl/core
10JSTL core
Définie une variable scopée
Déclare une variable locale
- Déclarationcoreset, coredeclare, coreremove
- Affichagecoreout
- Conditioncoreif, corechoose/when/otherwise,cor
ecatch - ItérationcoreforEach, coreforTokens
Retire une variable scopée
Affiche
Switch
Attrape les exceptions
Itère sur des portions de String découpée par des
délimiteurs
Itère sur une collectionou un tableau
11JSTL core (exemple)
- Affiche Rebonjour après reload
lt_at_ taglib prefix"c" uri"http//java.sun.com/jst
l/core" gt lthtmlgt ltbody bgcolor"white"gt
ltcchoosegt ltcwhen test"loggedIn"gt
lth1gtRebonjourlt/h1gt lt/cwhengt ltcotherwisegt
lth1gtBonjourlt/h1gt lt/cotherwisegt
lt/cchoosegt ltcset var"loggedIn"
scope"session" value"true"/gt Please
Reload me !! lt/bodygt lt/htmlgt
12JSTL headers
- Mélange RT et EL Core taglibs
lt_at_ taglib prefix"c" uri"http//java.sun.com/jst
l/core" gt lt_at_ taglib prefix"crt"
uri"http//java.sun.com/jstl/core_rt"
gt lthtmlgt ltbody bgcolor"white"gt
lth1gtHeaderslt/h1gt ltdlgt ltcrtforEach
items"lt request.getHeaderNames() gt" var"h"gt
ltdtgtltcout value"h"/gtlt/dtgt ltddgtltcout
value"headerh"/gtlt/ddgt lt/crtforEachgt
lt/bodygt lt/htmlgt
13Écrire sa propre Taglib
- Écrire le code des tags(implantant Tag, BodyTag)
- Définir un Tag Library Descriptor(fichier XML
contenant la définitiondes tags) - Référencer le TLD dans le web.xml
- Déclaration par une directive de tagliblors de
lutilisation
14Exemple HelloTag
- Création dun tag affichant hello world
lt_at_ taglib uri"http//www.univ-mlv.fr/taglibs/tag
demo" prefix"tgd" gt lthtmlgt ltheadgt
lttitlegtHello World Taglt/titlegt lt/headgt ltbody
bgcolor"white"gt lth1gtlttgdhelloworld/gtlt/h1gt
lt/bodygt lt/htmlgt
15Création de la classe
- La classe implémente Tag(TagSupport implémente
Tag)
package fr.umlv.tagdemo import
javax.servlet.jsp. import javax.servlet.jsp.tage
xt. public class HelloWorldTag extends
TagSupport public int doStartTag() throws
JspException try
pageContext.getOut().print("Hello World")
catch (Exception e) throw new
JspTagException(e.getMessage())
return SKIP_BODY public int doEndTag()
return EVAL_PAGE
Ne pas évaluer lintérieur du tag
Évalue la suite de la page
16Cycle de vie dun Tag
- InitialisationsetPageContext(), fixe le contexte
de pagesetParent(), fixe le tag
pèreset(value) initialise les attributs - doStartTag() appelée à la balise ouvrante
- doEndTag() appelée à la balise fermante
- release() libère les ressources
17Cycle de vie dun Tag (2)
- Valeurs de retour possibles pour
- doStartTag()EVAL_BODY_INCLUDE le contenu entre
les balises est évaluéSKIP_BODY le contenu
nest pas évalué - doEndTag()EVAL_PAGE continue lévaluation de la
pageSKIP_PAGE stoppe lévaluation de la page
18Tag Library Descriptor
- Fichier XML de description des tags
lt?xml version"1.0" encoding"ISO-8859-1"
?gt lt!DOCTYPE taglib PUBLIC "-//Sun Microsystems,
Inc.//DTD JSP Tag Library 1.1//EN"
"http//java.sun.com/j2ee/dtds/web-jsptaglibrary_1
_1.dtd"gt lttaglibgt lttlibversiongt1.0lt/tlibversiongt
ltjspversiongt1.2lt/jspversiongt ltshortnamegttgdlt/sho
rtnamegt lturigthttp//www.univ-mlv.fr/taglibs/tagde
molt/urigt ltinfogtDemo Tag Librarylt/infogt lttaggt
ltnamegthelloworldlt/namegt lttagclassgtfr.umlv.tagde
mo.HelloWorldTaglt/tagclassgt ltbodycontentgtemptylt/
bodycontentgt ltinfogtprint helloworldlt/infogt
lt/taggt lt/taglibgt
URI associée à la taglib
Nom du tag
Nom de la classe
Le contenu est ignoré doStart() doit renvoyer
SKIP_BODY
19Déclaration du TLD
- Déclaration du fichier de la taglib dans le
web.xml
lt?xml version"1.0" encoding"ISO-8859-1"?gt lt!DOC
TYPE web-app PUBLIC "-//Sun Microsystems,
Inc.//DTD Web Application 2.3//EN"
"http//java.sun.com/dtd/web-app_2_3.dtd"gt
ltweb-appgt ltdisplay-namegtDemo de
tagliblt/display-namegt ltdescriptiongtCeci est une
serie de tag de demolt/descriptiongt lttaglibgt
lttaglib-urigthttp//www.univ-mlv.fr/taglibs/tagdem
olt/taglib-urigt lttaglib-locationgt
/WEB-INF/lib/demo-taglib.tld
lt/taglib-locationgt lt/taglibgt lt/web-appgt
20Fichiers sur le disque
- Les différents fichiers sur le disque
21Tag avec attributs
- Lors de linitialisation dun tagpour chaque
attribut du tag la méthodesetAttributeName(String
value) est appelée
lt_at_ taglib uri"http//www.univ-mlv.fr/taglibs/tag
demo" prefix"tgd" gt lthtmlgt ltheadgt
lttitlegtMessage Taglt/titlegt lt/headgt ltbody
bgcolor"white"gt lttgdmessage
value"helloworld"/gtltbrgt lt/bodygt lt/htmlgt
22Tag avec attributs
- Appel la méthode setValue("helloworld")
public class MessageTag extends TagSupport
public int doStartTag() throws JspException
try pageContext.getOut().print(value)
catch (Exception e) throw
new JspTagException(e.getMessage())
return SKIP_BODY public int doEndTag()
return EVAL_PAGE public void
setValue(String value) this.valuevalue
private String value
23Déclarer les attributs
- Les attributs sont déclarés dans le TLD
lttaggt ltnamegtmessagelt/namegt lttagclassgtfr.umlv.t
agdemo.MessageTaglt/tagclassgt ltbodycontentgtemptylt
/bodycontentgt ltinfogtprint a message passed as
attributelt/infogt ltattributegt
ltnamegtvaluelt/namegt ltrequiredgttruelt/requiredgt
ltrtexprvaluegtfalselt/rtexprvaluegt
lt/attributegt lt/taggt
Nom de lattribut
Attribut obligatoire ??
La valeur peut être le résultat dun script
24Attribut des Tags Script
- Un attribut peut prendre en paramètre une valeur
calculée lors de lexécution
lt_at_ taglib uri"http//www.univ-mlv.fr/taglibs/tag
demo" prefix"tgd" gt lthtmlgt ltheadgt
lttitlegtMessage Taglt/titlegt lt/headgt ltbody
bgcolor"white"gt lttgdmessage
value"helloworld"/gt ltbrgt lttgdrt-message
value"helloworld"/gt ltbrgt lttgdmessage
value"lt request.getHeader("user-agent") gt"/gt
ltbrgt lttgdrt-message value"lt
request.getHeader("user-agent") gt"/gt
lt/bodygt lt/htmlgt
rtexprvaluefalse
rtexprvaluetrue
25Attribut des Tags Script (2)
- Si rtexprvaluefalse alors pas dévaluation des
expressions à lexécution
26Déclaration de variablesdans un Tag
- Comment déclarer un variable locale ?
lt_at_ taglib uri"http//www.univ-mlv.fr/taglibs/tag
demo" prefix"tgd" gt lthtmlgt ltheadgt
lttitlegtDeclare Taglt/titlegt lt/headgt ltbody
bgcolor"white"gt lttgddeclare name"variable"
type"java.lang.String" value"toto"/gt lt
variable gt.length() lt variable.length() gt
lt/bodygt lt/htmlgt
27Déclaration de variablesdans un tag
- La valeur est manipuler en utilisant le
pageContext
public class DeclareTag extends TagSupport
public int doStartTag() throws JspException
return SKIP_BODY public int doEndTag()
pageContext.setAttribute(name,
transtype(value,type)) return EVAL_PAGE
private Object transtype( String value,
Class type) return value private
String name,value private Class type
public void setType(String className)
try typeClass.forName(className)
catch (ClassNotFoundException e)
this.typenull public void
setName(String name) this.namename
public void setValue(String value)
this.valuevalue
28TagExtraInfo
- Permet de définir des variables pendant létape
de traduction
public class DeclareTagExtraInfo extends
TagExtraInfo public VariableInfo
getVariableInfo(TagData data) return new
VariableInfo new VariableInfo(
data.getAttributeString("name"),
data.getAttributeString("type"),
true, VariableInfo.AT_END)
Info sur le tag
Nom de la variable
Déclarationde la variable
Type de la variable
NESTED entre les balises ouvrantes et
fermantes AT_BEGIN de la balise ouvrantes à la
fin de fichier AT_END de la balise fermante à
la fin de fichier
29Déclaration du TagExtraInfo
- Déclaration dans le fichier TLD
lttaggt ltnamegtdeclarelt/namegt lttagclassgtfr.umlv.t
agdemo.DeclareTaglt/tagclassgt ltteiclassgtfr.umlv.t
agdemo.DeclareTagExtraInfolt/teiclassgt
ltbodycontentgtemptylt/bodycontentgt ltinfogtdeclare
a variable with page scopelt/infogt ltattributegt
ltnamegtnamelt/namegt ltrequiredgttruelt/requiredgt
ltrtexprvaluegtfalselt/rtexprvaluegt
lt/attributegt ltattributegt ltnamegtvaluelt/namegt
ltrequiredgtfalselt/requiredgt
ltrtexprvaluegttruelt/rtexprvaluegt lt/attributegt
lt/taggt
30Traduction dun Tag
- Traduction de la JSP en servlet
fr.umlv.tagdemo.DeclareTag
_jspx_th_tgd_declare_0
(fr.umlv.tagdemo.DeclareTag) _jspx_tagPool_tgd_dec
lare_value_type_name.get(
fr.umlv.tagdemo.DeclareTag.class)
_jspx_th_tgd_declare_0.setPageContext(pageContext)
_jspx_th_tgd_declare_0.setParent(null)
_jspx_th_tgd_declare_0.setName("variable")
_jspx_th_tgd_declare_0.setType("java.lang.Stri
ng") _jspx_th_tgd_declare_0.setValue("toto"
) int _jspx_eval_tgd_declare_0
_jspx_th_tgd_declare_0.doStartTag() if
(_jspx_th_tgd_declare_0.doEndTag()
javax.servlet.jsp.tagext.Tag.SKIP_PAGE)
return _jspx_tagPool_tgd_declare_value_type
_name.reuse(_jspx_th_tgd_declare_0)
java.lang.String variable null variable
(java.lang.String) pageContext.findAttribute("va
riable") out.write("\r\n \r\n ")
out.print( variable ) out.write(".length()
") out.print( variable.length() )
31Évaluation conditionnelle
- On veut évaluer le contenu entre les deux balises
if si la valeur de lattribut est vrai
lt_at_ taglib uri"http//www.univ-mlv.fr/taglibs/tag
demo" prefix"tgd" gt lthtmlgt ltbody
bgcolor"white"gt lttgdif value"true"gt test
ok lt/tgdifgt lttgdif value"false"gt test
wrong lt/tgdifgt lt/bodygt lt/htmlgt
32Évaluation conditionnelle
- doStartTag() renvoie une valeur différentes
public class IfTag extends TagSupport public
int doStartTag() throws JspException
return (condition)?EVAL_BODY_INCLUDESKIP_BODY
public int doEndTag() return
EVAL_PAGE public void setValue(String
value) conditionBoolean.valueOf(value).
booleanValue() private boolean
condition
lttaggt ltnamegtiflt/namegt lttagclassgtfr.umlv.tagdem
o.IfTaglt/tagclassgt ltteiclassgtfr.umlv.tagdemo.IfT
agExtraInfolt/teiclassgt ltbodycontentgtJSPlt/bodycon
tentgt ltinfogtconditional executionlt/infogt
ltattributegt ltnamegtvaluelt/namegt
ltrequiredgttruelt/requiredgt ltrtexprvaluegttruelt/r
texprvaluegt lt/attributegt lt/taggt
33Validation des attributs
- Assurer à la traduction que le tag if prend bien
une valeur booléenne
Est appelée lors de la traduction pour valider
les arguments
public class IfTagExtraInfo extends TagExtraInfo
public boolean isValid(TagData data)
Object value data.getAttribute("value") if
(value TagData.REQUEST_TIME_VALUE)
return true String textvalue.toString(
).toLowerCase() return text.equals("true")
text.equals("false")
Indique une expression calculée à lexécution
34Validation des attributs (2)
- Permet uniquement de valider les valeurs lors de
la traduction
lt_at_ taglib uri"http//www.univ-mlv.fr/taglibs/tag
demo" prefix"tgd" gt lthtmlgt ltbody
bgcolor"white"gt lttgdif value"false"gt
test wrong lt/tgdifgt lttgdif value"hello"gt
test wrong lt/tgdifgt lt String
test"hello" gt lttgdif value"lt test gt"gt
test ok lt/tgdifgt lt/bodygt lt/htmlgt
Traduction ok
Erreur à la traduction
Ok, pas derreur de traduction
35Les BodyTag
- Un BodyTag permet
- deffectuer des itérations sur le contenu
- deffectuer des post-traitement sur le contenu
- La valeur renvoyer par doStartTag()permet de
choisir
36Cycle de vie dun BodyTag (1)
- Itérer sur le contenu (body)
- Initialisation (set)
- Si doStartTag() renvoie EVAL_BODY_INCLUDE
- doInitBody()
- Évalue le contenu du body
- Boucle sur le doAfterBody() si EVAL_BODY_AGAIN
- doEndTag()
- release()
37Cycle de vie dun BodyTag (2)
- Bufferiser le contenu (body)
- Initialisation (set)
- Si doStartTag() renvoie EVAL_BODY_BUFFERED
- out pageContext.pushBody(), setBodyContent(out)
- doInitBody()
- Évalue le contenu du body
- Boucle sur le doAfterBody() si EVAL_BODY_AGAIN
- doEndTag()
- pageContext.popBody()
- release()
38Tag dItération
- On souhaite utiliser un tag pour itérersur une
collection
lt_at_ taglib uri"http//www.univ-mlv.fr/taglibs/tag
demo" prefix"tgd" gt lthtmlgt ltbody
bgcolor"white"gt ltulgt lttgditerate
collection"lt request.getHeaderNames() gt"gt
ltligtlttgditem/gtlt/ligt lt/tgditerategt
lt/ulgt lt/bodygt lt/htmlgt
39Tag dItération (2)
- Le TLD et le TagExtraInfo correspondant
lttaggt ltnamegtiteratelt/namegt lttagclassgtfr.umlv.t
agdemo.IterateTaglt/tagclassgt ltteiclassgtfr.umlv.t
agdemo.IterateTagExtraInfolt/teiclassgt
ltbodycontentgtJSPlt/bodycontentgt ltinfogtiterate
over a collectionlt/infogt ltattributegt
ltnamegtcollectionlt/namegt ltrequiredgttruelt/requir
edgt ltrtexprvaluegttruelt/rtexprvaluegt
lt/attributegt lt/taggt lttaggt ltnamegtitemlt/namegt
lttagclassgtfr.umlv.tagdemo.ItemTaglt/tagclassgt
ltbodycontentgtemptylt/bodycontentgt ltinfogtprint an
itemlt/infogt lt/taggt
Le tag regarde le contenu
public class IterateTagExtraInfo extends
TagExtraInfo public VariableInfo
getVariableInfo(TagData data) return new
VariableInfo new VariableInfo(
"item", "java.lang.Object",
true, VariableInfo.NESTED)
Nom de la variable
Type de la variable
Variable locale au body
40Tag dItération (3)
Implémente BodyTag
public class IterateTag extends BodyTagSupport
public int doStartTag() throws JspException
if (!iterator.hasNext()) return SKIP_BODY
pageContext.setAttribute("item",
iterator.next()) return
EVAL_BODY_INCLUDE public int
doAfterBody() throws JspException if
(!iterator.hasNext()) return SKIP_BODY
pageContext.setAttribute("item",
iterator.next()) return EVAL_BODY_AGAIN
public void setCollection(Object value)
if (value instanceof Iterator)
iterator(Iterator)value else throw new
RuntimeException("bad collection "value)
private Iterator iterator
Exécute le contenu du body
Ré-exécute le contenu du body
41Tag dItération (4)
public class ItemTag extends TagSupport
public int doStartTag() throws JspException
try pageContext.getOut().print(pageConte
xt.getAttribute("item")) catch
(IOException e) throw new
JspException(e.getMessage()) return
SKIP_BODY public int doEndTag()
return EVAL_PAGE
Tag Library Descriptor
lttaggt ltnamegtitemlt/namegt lttagclassgtfr.umlv.tagd
emo.ItemTaglt/tagclassgt ltbodycontentgtemptylt/bodyc
ontentgt ltinfogtprint an itemlt/infogt lt/taggt
42Post traitement du contenu
- Appliquer une feuille de style à un contenu
lt_at_ taglib uri"http//www.univ-mlv.fr/taglibs/tag
demo" prefix"tgd" gt lthtmlgt ltheadgt
lttitlegtXSLT Taglt/titlegt lt/headgt ltbody
bgcolor"white"gt lttgdxslt stylesheet"hellowo
rld.xsl"gt lthelloworld/gt lt/tgdxsltgt
lt/bodygt lt/htmlgt
lt?xml version"1.0" encoding"latin1"?gt ltxslstyle
sheet xmlnsxsl"http//www.w3.org/1999/XSL/Tra
nsform" version"1.0"gt ltxsloutput
method"xml" encoding
"isolatin1" omit-xml-declaration
"yes" indent "yes"/gt
ltxsltemplate match"helloworld"gt hello world
!! lt/xsltemplategt lt/xslstylesheetgt
43Post traitement du contenu (2)
- EVAL_BODY_BUFFERED permet de bufferiser le contenu
Bufferise le contenu
public class XSLTag extends BodyTagSupport
public int doStartTag() throws JspException
return EVAL_BODY_BUFFERED public int
doAfterBody() throws JspException return
SKIP_BODY public int doEndTag() throws
JspException Reader readergetBodyContent()
.getReader() try
transformer.transform( new
StreamSource(reader), new
StreamResult(pageContext.getOut())) catch
(TransformerException e) throw new
JspException(e.getMessage()) return
EVAL_PAGE
Il est interdit dutiliser out ici
public void setStylesheet(String file)
throws TransformerConfigurationException
TransformerFactory factory
TransformerFactory.newInstance() Templates
templatefactory.newTemplates( new
StreamSource(new File(
pageContext.getServletContext().
getRealPath(file)))) transformertemplate.n
ewTransformer() private Transformer
transformer
44Extensions de JSP 2.0
- Include automatique preclude/coda.
- Script à lintérieur des attributs desbeans.
- Fragment JSP (sorte de templates,tiles de
struts) - Interface SimpleTag pour les Tags
45Pas de code Java dans les JSP
- On mélange linterface graphique et le code
métier - Les erreurs de syntaxes sont détectés lors du
déploiement - Le code est dure à lire