Programmation Web - PowerPoint PPT Presentation

About This Presentation
Title:

Programmation Web

Description:

JSTL Expression Langage (3) ... EVAL_BODY_INCLUDE le contenu entre les balises est valu SKIP_BODY le contenu n est pas valu doEndTag() ... – PowerPoint PPT presentation

Number of Views:72
Avg rating:3.0/5.0
Slides: 46
Provided by: wwwigmUn
Category:

less

Transcript and Presenter's Notes

Title: Programmation Web


1
Programmation Web
  • JSP et Taglib

2
Les 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

3
JSP 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).

4
Hello 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
5
Hello JSTL
  • Affiche la version du browser

6
JSTL 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
7
JSTL 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.

8
JSTL 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

9
Deux 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

10
JSTL 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
11
JSTL 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
12
JSTL 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
  1. Écrire le code des tags(implantant Tag, BodyTag)
  2. Définir un Tag Library Descriptor(fichier XML
    contenant la définitiondes tags)
  3. Référencer le TLD dans le web.xml
  4. Déclaration par une directive de tagliblors de
    lutilisation

14
Exemple 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
15
Cré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
16
Cycle 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

17
Cycle 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

18
Tag 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
19
Dé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
20
Fichiers sur le disque
  • Les différents fichiers sur le disque

21
Tag 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
22
Tag 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
23
Dé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
24
Attribut 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
25
Attribut des Tags Script (2)
  • Si rtexprvaluefalse alors pas dévaluation des
    expressions à lexécution

26
Dé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
27
Dé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
28
TagExtraInfo
  • 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
29
Dé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
30
Traduction 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
33
Validation 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
34
Validation 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
35
Les 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

36
Cycle 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()

37
Cycle 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()

38
Tag 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
39
Tag 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
40
Tag dItération (3)
  • Code du tag iterate

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
41
Tag dItération (4)
  • Code du Tag item

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
42
Post 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
43
Post 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
44
Extensions 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

45
Pas 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
Write a Comment
User Comments (0)
About PowerShow.com