Documente Academic
Documente Profesional
Documente Cultură
JSP 2.0
Licence
Creative Commons
Contrat Paternit Partage des Conditions Initiales l'Identique
2.0 France
keulkeul.blogspot.com
http://creativecommons.org/licenses/by-sa/2.0/fr
JSP2 - M. Baron - Page 2
Conception dun tag personnalis (2.0) volutions vers la 2.0 depuis la 1.2
Descripteur de balises personnalises (TLD) Implmentation diffrente pour le handler des balises personnalises
Conception dun tag personnalis (2.0) : SimpleTag Linterface SimpleTag permet une implmentation diffrente de tag JSP ralise partir de La classe TagExtraInfo ne
TagSupport BodyTagSupport
change pas. Cependant, nous tudierons les mmes exemples mais avec SimpleTag
keulkeul.blogspot.com
Conception dun tag personnalis par lexemple (2.0) Exemple : HelloWorld un classique
package monpackage; ... public class HelloTag extends SimpleTagSupport { public void doTag() throws JspException, IOException { this.getJspContext().getOut().println("Hello World !"); } }
La classe handler
<?xml version="1.0" encoding="ISO-8859-1" ?> <taglib ...> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <description> Bibliothque de taglibs </description> <tag> <name>hellotag</name> <tag-class>monpackage.HelloTag</tag-class> <description> Tag qui affiche bonjour </description> <body-content>empty</body-content> </tag> </taglib>
keulkeul.blogspot.com
Le fichier TLD
Conception dun tag personnalis par lexemple (2.0) Exemple (suite) : HelloWorld un classique
<?xml version="1.0" encoding="UTF-8"?> <web-app ...> <display-name>Permet de grer des Tags personnaliss</displayname> <taglib> <taglib-uri>monTag</taglib-uri> <taglib-location>/WEB-INF/tld/montaglib.tld</taglib-location> </taglib> </web-app>
keulkeul.blogspot.com
Conception dun tag personnalis (2.0) : interface Tag Chaque balise est associe une classe qui va contenir les traitements excuter lors de leur utilisation Lutilisation de cette classe impose dimplmenter linterface
SimpleTag
Prfrez la classe SimpleTagSupport qui implmente directement SimpleTag
SimpleTag << Interface >>
+ doTag() ... keulkeul.blogspot.com
Une classe handler par tag personnalis et pas une de plus !!!
SimpleTagSupport
# getJspContext() : JspContext # getJspBody() : JspFragment + getParent() : JspTag ...
Avec la version 2, le corps de la balise personnalise est trait dans une mme classe
JSP2 - M. Baron - Page 7
Conception dun tag personnalis (2.0) : cycle de vie Lvaluation dun tag JSP aboutit aux appels suivants
Initialisation de proprits (JspContext, parent) Initialisation des attributs sils existent Si la balise possde un corps non vide, initialisation de JspFragment La mthode doTag() est appele
La version 2.0 supprime les mthodes doStartTag(), doInitBody(), doAfterBody(), doEndTag() qui taient prsente dans la version 1.2
JSP2 - M. Baron - Page 8
keulkeul.blogspot.com
SimpleTagSupport
+ doTag() # getJspBody() : JspFragment # getJspContext() : JspContext + getParent() : JspTag ...
Conception dun tag personnalis (2.0) : TLD Le fichier de description de la bibliothque de tags dcrit une bibliothque de balises Les informations quil contient concerne la bibliothque de tags et concerne galement chacune des balises qui la compose Doit toujours avoir lextension .tld Le format des descripteurs de balises personnalises est dfini par un fichier XSD (XML Schema Description) En-tte du fichier TLD. Balise ouvrante <taglib ...>
keulkeul.blogspot.com
<?xml version="1.0" encoding="ISO-8859-1" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> ... </taglib>
Conception dun tag personnalis (2.0) : TLD La premire partie du document TLD concerne la bibliothque
<tlib-version> : version de la bibliothque (obligatoire) <jsp-version> : version des spcifications JSP (obligatoire) <short-name> : nom de la bibliothque (obligatoire) <description> : description de la bibliothque (optionnelle) <tag> : il en faut autant que de balises qui composent la bibliothque
<?xml version="1.0" encoding="ISO-8859-1" ?> <taglib ...> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <description>Bibliothque de taglibs</description> <short-name>TagLibTest</short-name> <tag> ... </tag> <tag> Seconde balise ... </tag> personnalise </taglib>
keulkeul.blogspot.com
Conception dun tag personnalis (2.0) : TLD Chaque balise personnalise est dfinie dans la balise <tag> La balise <tag> peut contenir les balises suivantes
<name> : nom du tag, doit tre unique (obligatoire) <tag-class> : nom de la classe du handler du tag (obligatoire) <body-content> : type du corps du tag (obligatoire)
tagdependent : linterprtation du corps est faite par le tag empty : le corps doit obligatoirement tre vide scriptless : expressions EL mais pas de code JSP
keulkeul.blogspot.com
Conception dun tag personnalis (2.0) : attributs de tag Un tag peut contenir des attributs
<prefixe:nomDuTag attribut1="valeur" />
La classe handler doit dfinir des modifieurs et des attributs pour chaque attribut du tag
Les attributs ne sont pas obligatoirement de type chanes de caractres
Les modifieurs doivent suivre une logique dcriture identique celle lie aux Java Beans
public class NomDuTag extends SimpleTagSupport { private Object attribut1; public void setAttribut1(Object p_attribut) { this.attribut1 = p_attribut; } ... }
keulkeul.blogspot.com
Des modifieurs prdfinis sont utiliss pour initialiser des proprits du tag (jspContext, parent et jspBody)
setJspContext(JspContext) setParent(Tag) et setJspBody(JspFragment)
JSP2 - M. Baron - Page 12
Conception dun tag personnalis (2.0) : attributs de tag Les attributs dune balise personnalise doivent tre dclars dans le fichier TLD Chaque attribut est dfini dans une balise <attribut> qui sont contenus dans la balise mre <tag> La balise <attribute> peut contenir les tags suivants :
<name> : nom de lattribut utilis dans les JSP (obligatoire) <required> : indique si lattribut est requis (true/false ou yes/no) <rtexprvalue> : prcise si lattribut peut contenir le rsultat dun tag
keulkeul.blogspot.com
expression
Conception dun tag personnalis (2.0) : attributs de tag Exemple 1 : HelloWorld avec des attributs
package monpackage; ... public class HelloTagAttributs extends SimpleTagSupport { private String moment; public void setMoment(String p_moment) { this.moment = p_moment; } public int doTag() throws JspException, IOException { getJspContext().getOut().println ("Hello World ! " + moment); } }
keulkeul.blogspot.com
<%@ taglib uri="monTag" prefix="montagamoi" %> <montagamoi:hellotag/> Tout le monde <br> <montagamoi:hellotagattributs moment=" toi"/>
Conception dun tag personnalis (2.0) : attributs de tag Exemple 1 (suite) : HelloWorld avec des attributs
<?xml version="1.0" encoding="ISO-8859-1" ?> <taglib ...> <tlibversion>1.0</tlibversion> <jspversion>2.0</jspversion> <info>Bibliothque de test des taglibs</info> <tag> <name>hellotag</name> <tag-class>monpackage.HelloTag</tag-class> <description>Tag qui affiche bonjour</description> <body-content>empty</body-content> </tag> <tag> <name>hellotagattributs</name> <tag-class>monpackage.HelloTagAttributs</tag-class> <description>Bonjour et un attribut</description> <attribute> <name>moment</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <body-content>empty</body-content> </tag> </taglib>
keulkeul.blogspot.com
Conception dun tag personnalis (2.0) : attributs de tag Exemple 1 (suite bis) : omission dun attribut obligatoire ...
<tag> ... <attribute> <name>moment</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag> <%@ taglib uri="monTag" prefix="montagamoi" %> <montagamoi:hellotag/> Tout le monde <br> <montagamoi:hellotagattributs />
keulkeul.blogspot.com
Conception dun tag personnalis (2.0) : attributs de tag Exemple 2 : valuation corps et arrt de lvaluation de la page
public class ExplainWorkingTag extends SimpleTagSupport { private String test; private String apoca; public void setTest(String param) { test = param; } public void setApoca(String param) { apoca = param; }
Affiche le contenu du corps. tudi dans la suite Peut-tre quivalent EVAL_BODY_INCLUDE de la version 1.2
keulkeul.blogspot.com
public void doTag() throws JspException, IOException { if (test.equals("body")) { <%@ taglib uri="monTag" prefix="montagamoi" %> this.getJspBody().invoke(null); } else { <montagamoi:explainworkingtag test="body" apoca="fin"> if (apoca.equals("fin")) { Le texte doit normalement s'afficher!!! // Ne rien faire </montagamoi:explainworkingtag> } else { throw new SkipPageException(); <montagamoi:explainworkingtag test="autre" apoca="fin"> } Le texte ne doit pas s'afficher!!! } </montagamoi:explainworkingtag> } }
<montagamoi:explainworkingtag test="autre" apoca="autre"> Le texte ne doit pas s'afficher!!! </montagamoi:explainworkingtag> Le reste de la page ne doit pas tre vu.
Conception dun tag personnalis (2.0) : attributs de tag Exemple 3 : valuation de code JSP depuis un attribut
<attribute> <name>value</name> <required>true</required> public class EvalExpressionAttribut extends SimpleTagSupport { <rtexprvalue>true</rtexprvalue> private Object value; </attribute>
public void doTag() throws JspException, IOException { if (value instanceof Date) { this.getJspContext().getOut().println((Date)value); } else { this.getJspContext().getOut().println("N'est pas un objet Date"); } } }
keulkeul.blogspot.com
Conception dun tag personnalis (2.0) : variables implicites Les balises personnalises ont accs aux variables implicites de la JSP dans laquelle elles sexcutent via un objet de type JspContext Utilisation de la mthode JspContext getJspContext() La classe JspContext dfinit plusieurs mthodes
JspWriter getOut() : accs la variable out de la JSP Object getAttribute(String) : retourne un objet associ au paramtre (scope page) Object getAttribute(String, int) : retourne objet avec un scope prcis setAttribute(String, Object) : associe un nom un objet (scope page) setAttribute(String, Object, int) : associe un nom un objet avec un
scope
keulkeul.blogspot.com
Conception dun tag personnalis (2.0) : variables implicites Les valeurs du scope sont dfinies dans PageContext
PAGE_SCOPE : attribut dans le scope page REQUEST_SCOPE : attribut dans le scope request SESSION_SCOPE : attribut dans le scope session APPLICATION_SCOPE : attribut dans le scope application
keulkeul.blogspot.com
Cration d un attribut toto avec la valeur dune Date dans le scope page
getJspContext().findAttribute("toto");
Cette mthode cherche lattribut toto dans tous les scopes en commenant par page, request, session et
application
getJspContext().getAttribute("toto", PageContext.PAGE_SCOPE);
Conception dun tag personnalis (2.0) : variables implicites Possibilit de rcuprer la valeur dun attribut selon son scope et ainsi de communiquer entre une JSP un tag et une Servlet
Communication entre JSP et le handler du tag Communications htrognes Attribut selon la valeur du scope Attribut avec scope application Partage de contrle (inclusion et renvoie)
@ tag:amoi @ tag:amoi
JSP 11 JSP
Scope = page
@ tag:amoi @ tag:amoi
JSP 22 JSP
Scope = page
keulkeul.blogspot.com
Conception dun tag personnalis (2.0) : variables implicites Exemple 1 : communication entre Bean et Taglib
<jsp:useBean id="mon_bean" class="java.util.ArrayList" scope="application" /> <%@ taglib uri="monTag" prefix="montagamoi" %> <% mon_bean.add(new java.util.Date()); %> <montagamoi:hellotagarraylist name="mon_bean" /> public class HelloTagArrayList extends SimpleTagSupport { private String mon_bean; public void setName(String p_bean) { this.mon_bean = p_bean; } public void doTag() throws JspException, IOException { Object my_object = findAttribute(mon_bean); if (my_object != null ) { ArrayList my_array_list = (ArrayList)my_object; for (int i = 0; i < my_array_list.size(); i++) { getJspContext().getOut().println(my_array_list.get(i)); } } else { getJspContext().getOut().println("Y a rien"); } } }
Dfinition dun Java Bean dans le contexte de lapplication WEB Lattribut name permet dindiquer lidentifiant du Bean Sachant que linstance du Java Bean est dfini dans le scope application
keulkeul.blogspot.com
Conception dun tag personnalis (2.0) : variables implicites Exemple 1 (suite) : plusieurs solutions pour y arriver ...
<jsp:useBean id="mon_bean" class="java.util.ArrayList" scope="application" /> <%@ taglib uri="monTag" prefix="montagamoi" %> <% mon_bean.add(new java.util.Date()); %> <montagamoi:hellotagarraylist name=<%= mon_bean %> />
keulkeul.blogspot.com
public class HelloTagArrayList2 extends TagSupport { valuation private Object bean; public void setBean(Object my_bean) { dexpression JSP this.bean = my_bean; } public void doTag() throws JspException, IOException { if (bean instanceof ArrayList) { if (bean != null ) { ArrayList my_array_list = (ArrayList)bean; for (int i = 0; i < my_array_list.size(); i++) { getJspContext().getOut().println(my_array_list.get(i)); } } else { getJspContext().getOut().println("Y a rien"); } } } Prfrez cette solution la }
Conception dun tag personnalis (2.0) : variables implicites Exemple 2 : collaboration de taglib switch case
<%@ taglib uri="monTag" prefix="montagamoi" %> <montagamoi:switchtag test="3"> <montagamoi:casetag value="0">Zro</montagamoi:casetag> <montagamoi:casetag value="1">Un</montagamoi:casetag> <montagamoi:casetag value="2">Deux</montagamoi:casetag> <montagamoi:casetag value="3">Trois</montagamoi:casetag> </montagamoi:switchtag>
public class SwitchTag extends SimpleTagSupport { private String test; public void doTag() throws JspException, IOException { getJspBody().invoke(null); } public void setTest(String p_value) { test = p_value; } public boolean isValid(String caseValue) { if (test == null) return false; return(test.equals(caseValue)); }
Conception dun tag personnalis (2.0) : variables implicites Exemple 2 (suite) : collaboration de balises personnalises ...
public class CaseTag extends TagSupport { public String value; public void setValue(String p_value) { this.value = p_value; }
Vrifie que test du tag parent est le mme que value du tag enfant
public void doTag() throws JspException, IOException { if (getParent() instanceof SwitchTag) { SwitchTag parent = (SwitchTag)getParent(); if (parent.isValid(this.value)) { this.getJspBody().invoke(null); Affiche ou non le corps } la balise enfant } else { throw new JspException("Case doit tre l'intrieur du tag Switch"); } } }
de
keulkeul.blogspot.com
Conception dun tag personnalis (2.0) : corps du Tag La mthode doTag() traite son corps via lobjet JspFragment renseign par le serveur dapplication Utilisation de la mthode JspFragment getJspBody() permettant de rcuprer lobjet JspFragment Lobjet JspFragment peut tre valu autant de fois que ncessaire grce la mthode invoke(Writer) qui crit le rsultat dans le Writer spcifi Un Writer peut tre de diffrents types
keulkeul.blogspot.com
Conception dun tag personnalis (2.0) : corps du Tag A la diffrence de la version 1.2, limplmentation par SimpleTag permet de buffriser le traitement du corps dans un seul appel de la mthode doTag() Plusieurs manires existent pour retourner uniquement le contenu du corps
Utilisation dun Writer null
getJspBody().invoke(null)
Writer
Conception dun tag personnalis (2.0) : itration sur le corps Exemple : itration sur le corps du tag ...
public class IterateSimpleTag extends BodyTagSupport { private int count = 0; public void setCount(int i) { count = i; }
public void doTag() throws JspException, IOException { for (int i = 0; i < count; i++) { getJspBody().invoke(null); } } <%@ taglib uri="monTag" prefix="montagamoi" %> }
<montagamoi:iteratesimpletag count="3"> Coucou<br> </montagamoi:iteratesimpletag>
keulkeul.blogspot.com
BodyTagSupport
Conception dun tag personnalis (2.0) : itration sur le corps Exemple (bis) : itration sur le corps du tag avec modification
public class IterateSimpleTag extends BodyTagSupport { private int count = 0; public void setCount(int i) { if (i <= 0) { i = 1; Utilisation dun Writer } type StringWriter count = i; }
de
public void doTag() throws JspException, IOException { StringWriter mon_writer = new StringWriter(); this.getJspBody().invoke(mon_writer); String contenu = mon_writer.toString();
keulkeul.blogspot.com
for (int i = 0; i < count - 1 ; i++) { mon_writer.append(contenu); Ajoute le contenu du } mon_writer.append(String.valueOf(count)); corps count - 1 fois getJspContext().getOut().println(mon_writer); } } <%@ taglib uri="monTag" prefix="montagamoi" %>
Conception dun tag personnalis (2.0) : itration sur le corps Exemple (bis) : itration sur le corps du tag avec modification
public class UpperCaseTag extends SimpleTagSupport { public void doTag() throws JspException, IOException { StringWriter mon_writer = new StringWriter(); Le contenu du Writer est getJspBody().invoke(mon_writer); rcupr puis modifi en String ma_chaine = mon_writer.toString();
majuscule
getJspContext().getOut().println(ma_chaine.toUpperCase()); } }
<%@ taglib uri="monTag" prefix="montagamoi" %> <montagamoi:uppercasetag> Bonjour, je suis en minuscule et je vais passer en majuscule <br> La date aujourd'hui est <%= new java.util.Date() %> </montagamoi:uppercasetag>
keulkeul.blogspot.com
<tag> <name>uppercasetag</name> <tag-class>monpackage.UpperCaseTag</tag-class> <description>Tag qui effectue des modifs sur le corps d'un Tag</description> <body-content>tagdependent</body-content> </tag>
Non valu puisque le code JSP nest plus interprtable dans le corps (2.0) Solution : EL
JSP2 - M. Baron - Page 30
Expressions Languages (2.0) : justifications ... Lutilisation de linterface SimpleTag de la version 2.0 des JSP ne permet plus dexploiter du code JSP dans le corps des balises personnalises Les raisons
Limiter la prsence du langage Java (non spcialiste) Meilleure lisibilit, le code se limite au nom des beans et de ses proprits
<%= page.getAttribute("personne").getNom() %>
${page["personne"].nom}
keulkeul.blogspot.com
Les Expressions Languages (EL) permettent de manipuler les donnes dune page JSP (essentiellement les Beans) Une EL permet daccder simplement aux beans des diffrents scopes de lapplication (page, request, session et application) JSP2 - M. Baron - Page 31
Expressions Languages (2.0) : Quest ce que cest ... Forme dune Expression Language
${expression}
Une expression correspond lexpression interprter. Elle peut tre compose de plusieurs termes spars par des oprateurs
${terme1 oprateur terme2} ${oprateur-unaire terme} ${terme1 oprateur terme2 oprateur terme3 ...}
un type primaire un objet implicite un attribut dun scope de lapplication web une fonction EL
Non tudie dans la suite ...
JSP2 - M. Baron - Page 32
Expressions Languages (2.0) : comment les utiliser ? Par dfaut les expressions EL sont ignores sil ny a pas de fichier web.xml. Utilisation de la directive page pour les activer (false) <%@ page isELIgnored="false" %> Les expressions EL peuvent tre utilises dans
les attributs des tags personnaliss (existants ou les vtres) le corps des tags personnaliss dans la page JSP (hors tags)
${lebeanalui} <prefix:montagamoi param1="toto" param2="${lebeanalui}" > ${lebeanalui} </prefix:montagamoi>
keulkeul.blogspot.com
<tag> <name>uppercasetag</name> <tag-class>monpackage.UpperCaseTag</tag-class> <description>Tag qui effectue des modifs sur le corps d'un Tag</description> <body-content>scriptless</body-content> </tag>
keulkeul.blogspot.com
Le <body-content> peut maintenant tre scriptless puisque le corps contient une EL ...
Expressions Languages (2.0) : objet implicites Les objets implicites permettent daccder aux diffrents lments dune page JSP
pageContext : accs lobjet PageContext (request, response, ) pageScope[""] : accs aux attributs du scope page requestScope[""] : accs aux attributs du scope request sessionScope[""] : accs aux attributs du scope session applicationScope[""] : accs aux attributs du scope application param[""] : accs aux paramtres de la requte HTTP paramValues : paramtres de la requte sous la forme dun tableau String header[""] : accs aux valeurs dun en-tte HTTP headerValues : accs aux en-ttes de la requte sous forme dun tableau String cookie[""] : accs aux diffrents cookies,
keulkeul.blogspot.com
Les expressions avec crochets sont tous de type -Map - Page JSP2 M. Baron
35
Expressions Languages (2.0) : objet implicites Lors de lvaluation dun terme, si celui-ci nest ni un type primaire, ni un objet implicite, le conteneur JSP recherchera un attribut du mme nom dans les diffrents scopes (page,
request, )
${nom} Si nom a t dfini dans un scope ces deux expressions font la mme chose
keulkeul.blogspot.com
${sessionScope["nom"]}
Si le paramtre nexiste pas, pas de renvoie dobjet null mais dune chane de caractres vide
keulkeul.blogspot.com
Expressions Languages (2.0) : accs aux proprits des objets Trois catgories dobjets dfinies par les expressions EL
les objets standards (tout autres objets) les objets indexes (tableau Java, ou objet de type List) les objets mapps (objet de type Map)
Les objets sont construits suivant le modle des Beans Laccs se fait par rflexivit, cest--dire quil ny a pas besoin
keulkeul.blogspot.com
de connatre le type de lobjet pour accder ses proprits Selon le type dobjet, les rgles daccs ces proprits divergent malgr une syntaxe similaire
JSP2 - M. Baron - Page 38
Accs aux proprits des objets (2.0) : objets standards Utilisation dun accesseur spcifique portant le nom de la proprit
Laccs la proprit name se fait par laccesseur getName() Cette mthode est recherche puis appele
Prfrez lusage du point afin dviter les confusions avec les autres types dobjets
${ objet["name"] }
ou
${ objet[name] }
keulkeul.blogspot.com
Sil nexiste pas daccesseur pour la proprit, une exception sera lance
Accs aux proprits des objets (2.0) : objets indexes Accder une proprit indexe dun tableau ou une liste Utilisation dun accesseur spcifique portant en paramtre lindice nom de la proprit (mthode get(int) de linterface
List)
Pour accder la proprit, utilisation des crochets
${ ${ ${ ${ ${ ${ objet[0] } objet[1] } objet[5] } objet["2"] } objet["4"] } objet["5"] }
JSP2 - M. Baron - Page 40
keulkeul.blogspot.com
Si lindex nest pas un nombre entier, il est converti mais peut provoquer une exception
Accs aux proprits des objets (2.0) : objets mapps Accder une proprit dun objet mapp. Laccs se fait par une tiquette Utilisation dun accesseur spcifique portant en paramtre une cl permettant daccder la proprit (mthode
Expressions Languages (2.0) : oprateurs Il est galement possible dutiliser des oprateurs dans une expression EL Il sagit des mmes oprateurs que ceux du langage Java, mis part que certains possdent un quivalent textuel afin dviter des conflits Les oprateurs soprent sur deux termes et prennent la forme suivante Terme1 operateur Terme2 Oprateurs arithmtiques : +, -, *, /,
keulkeul.blogspot.com
Oprateurs relationnels : ==, !=, <, >, <= Oprateurs logiques : &&, ||, ! Autres : ? :, test
JSP2 - M. Baron - Page 42
Conception dun tag personnalis (2.0) : TagExtraInfo La classe TagExtraInfo permet de fournir des informations supplmentaires sur la balise au moment de la compilation de la JSP Package et classe javax.servlet.jsp.tagext.TagExtraInfo Elle dfinit principalement trois mthodes
TagInfo getTagInfo() : accder aux informations sur le tag contenu
dans le descripteur de taglib (TLD)
keulkeul.blogspot.com
Conception dun tag personnalis (2.0) : variables de script Exemple : cration de variables de script (sans TagExtraInfo)
public class VariableScript extends TagSupport { private String name = null; public void setName(String p_string) { this.name = p_string; } public void doTag() throws JspException, IOException { getJspContext().setAttribute(name, new Date()); getJspBody().invoke(null); } }
jspContext
keulkeul.blogspot.com
<%@ taglib uri="monTag" prefix="montagamoi" %> <montagamoi:variablescript name="value" > ${value} </montagamoi:variablescript> ${value} <br> <%= pageContext.getAttribute("value") %>
Conception dun tag personnalis (2.0) : variables de script Exemple (bis) : cration de variables de script
public class VariableScript extends TagSupport { private String name = null; public void setName(String p_string) { this.name = p_string; } public void doTag() throws JspException, IOException { getJspContext().setAttribute(name, new Date()); getJspBody().invoke(null); } }
jspContext
keulkeul.blogspot.com
Utilisation dune expression EL pour accder lattribut (scope = page) value est ainsi dfinie comme une variable de script
<%@ taglib uri="monTag" prefix="montagamoi" %> <montagamoi:variablescript name="value" > ${value} </montagamoi:variablescript> ${value} <br> <%= value %>
A suivre ...
Conception dun tag personnalis (2.0) : TagExtraInfo des attributs vers des variables de script prsent dans la JSP Retourne un objet de type VariableInfo qui doit contenir
le nom de la variable de script le nom du type de la variable un boolen qui indique si la variable doit tre dclare (vraie) ou si on doit rutiliser une variable dj dclare (faux) La zone de porte de la variable
keulkeul.blogspot.com
int AT_BEGIN : de la balise ouvrante la fin de la JSP int AT_END : de la balise fermante la fin de la JSP int NESTED : entre les balises ouvrantes et fermantes
<montagamoi ... > corps de la balise </montagamoi>
AT_BEGIN
AT_END
JSP2 - M. Baron - Page 46
NESTED
Conception dun tag personnalis (2.0) : TagExtraInfo Un objet TagInfo est utilis pour accder aux informations du descripteur de taglib (TLD) Il dfinit plusieurs mthodes
String getTagName() : nom de la balise personnalise TagAttributeInfo[] getAttributes() : information sur les attributs String getInfoString() : information concernant la balise personnalise
... TagAttributeInfo[] tab_attribute = this.getTagInfo().getAttributes(); for (int i = 0; i < tab_attribute.length; i++) { System.out.println(tab_attribute[i].getName()); } ...
keulkeul.blogspot.com
Conception dun tag personnalis (2.0) : TagExtraInfo Un objet TagData est utilis pour accder aux valeurs des attributs dune balise personnalise Rappel : cest un objet paramtre qui se trouve dans les mthodes
VariableInfo[] getVariableInfo(TagData) boolean isValid(TagData)
keulkeul.blogspot.com
Conception dun tag personnalis (2.0) : variables de script Exemple (bis) : cration de variables de script
<%@ taglib uri="monTag" prefix="montagamoi" %> <montagamoi:variablescript name="value" > ${value} <br> </montagamoi:variablescript> ${value} <br> <%= value %>
public class VariableScriptInfo extends TagExtraInfo { public VariableInfo[] getVariableInfo(TagData arg0) { VariableInfo[] vi = new VariableInfo[1]; TagAttributeInfo[] tab_attribute = this.getTagInfo().getAttributes(); vi[0] = new VariableInfo( (String)arg0.getAttribute(tab_attribute[0].getName()),
name
"java.util.Date", true, VariableInfo.AT_BEGIN); return vi; } }
keulkeul.blogspot.com
value
Conception dun tag personnalis (2.0) : TagExtraInfo Il faut dclarer la classe de type TagExtraInfo dans le descripteur de balise personnalise Elle se fait par lintermdiaire de la balise <teiclass>
<tag> <teiclass>package.ClasseTagExtraInfo</teiclass> ... </tag>
keulkeul.blogspot.com
Conception dun tag personnalis (2.0) : TagExtraInfo Possibilit de valider dynamiquement les attributs de la balise avant quils ne soient excuts Utilisation de la mthode isValid() qui est appele la compilation de la page JSP Elle ne permet pas de vrifier la valeur des attributs dont la valeur est le rsultat dun tag expression <%= object %> ou dune scriplet
keulkeul.blogspot.com
Deux intrts
Validation effectue pour tous les tags la compilation Vrification peut tre longue mais faite uniquement laM. Baron - Page compilation JSP2 51
Conception dun tag personnalis (2.0) : TagExtraInfo Exemple : vrification des attributs
<%@ taglib uri="monTag" prefix="montagamoi" %> <montagamoi:variablescript name="value" > ... </montagamoi:variablescript>
public class VariableScriptInfo extends TagExtraInfo { public boolean isValid(TagData arg0) { if (arg0.getAttributeString("name").equals("")) { System.out.println("Problme dans le tag name"); return false; Affichage dans la console } avant lexcution de la return true; } page JSP
keulkeul.blogspot.com
<%@ taglib uri="monTag" prefix="montagamoi" %> <montagamoi:variablescript name="<%= 'coucou' %>" > ... </montagamoi:variablescript>
Conception dun tag personnalis (2.0) : attributs dynamiques La version 2.0 vient combler un des principaux dfauts des versions prcdentes : la gestion dattributs dynamiques Il est dj possible de rendre un attribut facultatif ou pas mais les attributs doivent obligatoirement
possder une mthode modifieur setAttribut() tre dclarer dans le fichier TLD
Nom de lattribut
Valeur de lattribut
Les attributs dynamiques peuvent tre utiliss conjointement avec des attributs classiques
Conception dun tag personnalis (2.0) : attributs dynamiques Pour utiliser les attributs dynamiques, il faut que la classe handler implmente linterface DynamicAttributes en plus dune des interfaces JspTag (SimpleTag ou Tag) Il faut par ailleurs modifier le fichier de descripteur de balises personnalises
<dynamic-attributes>true</dynamic-attributes>
keulkeul.blogspot.com
La page JSP
keulkeul.blogspot.com
Attributs dynamiques (2.0) : exemple Exemple (suite) : puissances des attributs dynamiques
Input 1 : <input type='text' name='input1' value='statique' readonly='true' class='green' /><br> Input 2 : <input type='text' name='input2' value='' class='red' onfocus='methodeJavaScript' /><br> Input 3 : <input type='text' name='input3' value='Wed Jul 13 14:57:44 CEST 2005' class='blue' /><br>
InputTag extends SimpleTagSupport implements DynamicAttributes { Map attributes = new HashMap(); String type = null; String name = null; String value = null;
public void setDynamicAttribute(String uri, String localname, Object value) throws JspException { attributes.put(localname, value); } public void setName(String name) { this.name = name; }
keulkeul.blogspot.com
public void setType(String type) { this.type = type; } public void setValue(String value) { this.value = value; } ...
Attributs dynamiques (2.0) : exemple Exemple (suite) : puissances des attributs dynamiques
Vrifie sil est possible de rcuprer linstance du Bean donne par name et stocke dans value Gre les attributs statiques
... public void doTag() throws JspException, IOException { JspWriter out = getJspContext().getOut(); out.print("<input type='" + type + "' name='" + name + "' "); if (value == null) { Object o = this.getJspContext().findAttribute(name); value = o == null ? "" : o.toString(); } out.print("value='" + value + "' "); Iterator iterator = attributes.entrySet().iterator(); while(iterator.hasNext()) { Map.Entry entry = (Map.Entry)iterator.next(); out.print(entry.getKey() + "='" + entry.getValue() + "' "); } out.print("/>"); } }
keulkeul.blogspot.com
Dploiement dans une application WEB Il y a deux types dlments dont il faut sassurer laccs par le conteneur dapplications web (Tomcat en loccurrence)
Les bytecodes des classes handlers des balises personnalises Les fichier de description des bibliothques (TLD)
*.html, *.jsp, ...
WEB-INF
web.xml
classes
*.class
keulkeul.blogspot.com
lib
*.jar, *.class
Les fichiers TLD doivent tre copis dans le rpertoire WEB-INF ou dans un de ces sous rpertoires
JSP2 - M. Baron - Page 58
tld
*.tld
Dploiement dans une application WEB Possibilit denregistrer les bibliothques dans le fichier de configuration de lapplication web (web.xml) Il faut ajouter dans le fichier web.xml, un tag <taglib> pour chaque bibliothque utilise contenant deux informations
lURI de la bibliothque <taglib-uri> la localisation du fichier de description <taglib-location> relative au rpertoire WEB-INF
... <web-app ...> <display-name> Application WEB qui permet de grer des Tags persos </display-name> <taglib> <taglib-uri>monTag</taglib-uri> <taglib-location>/WEB-INF/tld/montaglib.tld</taglib-location> </taglib> </web-app>
keulkeul.blogspot.com
JSTL (Java server page Standard Tag Library) Le but de la JSTL est de simplifier le travail des auteurs de JSP, cest--dire les acteurs responsables de la couche prsentation La JSTL permet de dvelopper des pages JSP en utilisant des balises XML sans connaissances du langage Java Sun a propos une spcification pour la Java Standard Tag Library voir adresse java.sun.com/jsp/jstl
keulkeul.blogspot.com
Limplmentation propose vient du projet Jakarta JSTL 1.1 disponible ladresse jakarta.apache.org/taglibs
JSP2 - M. Baron - Page 60
JSTL : Quest-ce-que cest... Cest un ensemble de balises personnalises qui propose des fonctionnalits souvent rencontres dans les page JSP
Tag de structure (itration, conditionnement) Internationalisation et formatage Excution de requte SQL Utilisation de document XML
Nous ne prsenterons que la partie lie aux structures et linternationalisation
Utilisation conjointe avec les Expressions Languages (EL) Possibilit galement dutiliser des scriplets mais non recommandes
JSP2 - M. Baron - Page 61
JSTL : la bibliothque Core Cette bibliothque core comporte les actions de base pour la gestion des variables de scope dune application web
Affichage de variable, cration, modification et suppression de variables de scope et de gestion des exceptions Actions conditionnelles et boucles Manipulation dURL et redirection
JSTL : la bibliothque Core : variables Laffichage dune expression se fait par la balise <out> Les attributs de cette balise sont
Object value : lexpression qui sera value (obligatoire) Object default : valeur afficher si lexpression value est null
(dfaut : )
default
<c:out value="${header['user-agent']}" default="Inconnu" />
Corps de out
JSTL : la bibliothque Core : variables La balise personnalise <set> permet de dfinir une variable de scope ou une proprit Les attributs de cette balise sont
Object value : lexpression valuer String var : nom de lattribut qui contiendra lexpression dans le scope String scope : nom du scope qui contiendra lattribut var (page, request, session ou application) Object target : lobjet dont la proprit dfini par property qui sera
modifi
keulkeul.blogspot.com
Le corps de la balise <set> peut tre utilis la place de lattribut value JSP2 - M. Baron - Page
64
<c:set var="test1" value="coco1" scope="page"/> <% pageContext.setAttribute("test2","coco2"); %> <c:out value='${test1}' default='rien' /><br> ${test2}<br>
}
<jsp:useBean id="monbean" class="monpackage.MonBean" scope="page" /> <c:set target="${monbean}" value="Bonjour" property="name" /> <c:out value="${monbean.name}" /> keulkeul.blogspot.com
JSTL : la bibliothque Core : variables La balise personnalise <remove> permet de supprimer la variable de scope indique Les attributs de cette balise sont
String var : nom de la variable de scope supprimer (obligatoire) String scope : nom du scope qui contiendra lattribut var (page, request, session ou application)
keulkeul.blogspot.com
JSTL : la bibliothque Core : variables La balise personnalise <catch> permet dintercepter les exceptions qui peuvent tre lances par son corps Le corps de la balise <catch> contient le code JSP a risque Lattribut de cette balise est
String var : nom de la variable dans le scope page qui contiendra
lexception intercepte
Simple exemple
<%@ taglib uri="montag" prefix="c" %> <c:catch> <c:set target="beans" property="prop" value="1" /> </c:catch> <c:catch var="varName" > <c:set target="beans" property="prop" value="1" /> </c:catch> ${varName.message} ou <c:out value="${varName.message}" default="Rien" />
keulkeul.blogspot.com
Le bean beans nexiste pas, lexception est ignore Le bean beans nexiste pas, lexception est stocke dans la variable varName
JSP2 - M. Baron - Page 67
JSTL : la bibliothque Core : actions conditionnelles Le traitement conditionnel permet deffectuer un traitement de la mme manire que le mot-clef if du langage Java La balise personnalise utilise est <if> Elle dispose dattributs qui sont
boolean test : condition qui dtermine si le corps est valu ou pas
(obligatoire) du test
String var : nom dune variable de type boolean contenant le rsultat String scope : valeur du scope pour lattribut var
<%@ taglib uri="montag" prefix="c" %> keulkeul.blogspot.com <c:if test="${!empty param['page']}" var="valeur" scope="page"> Coucou a fonctionne<br> </c:if> La valeur de la condition prcdente est : ${valeur}
JSTL : la bibliothque Core : actions conditionnelles Le traitement conditionnel exclusif permet deffectuer un traitement de la mme manire que le mot-clef switch du langage Java La balise personnalise utilise est <choose>, elle ne dispose pas dattribut et le corps peut comporter
une ou plusieurs balises de type <when> zro ou une balise <otherwise>
Laction <choose> excute le corps du premier tag <when> dont la condition de test est true
keulkeul.blogspot.com
Si aucune des conditions nest vrifie, le corps de laction <otherwise> est excute La balise <when> dispose dun attribut
boolean test : si le corps doit tre valu ou non(obligatoire)
69
keulkeul.blogspot.com
JSTL : la bibliothque Core : boucles Le traitement des itrations permet deffectuer un traitement itratif de la mme manire que le mot-clef for et while du langage Java Deux balises sont dfinies <forEach> et <forTokens> Elles disposent en commun des attributs suivant
String var : variable qui comporte llment courant de litration String varStatus : variable qui contient des informations sur litration
keulkeul.blogspot.com
int begin : spcifie lindex de dpart de litration int end : spcifie lindex de fin de litration int step : litration seffectue sur les step lments de la collection
JSP2 - M. Baron - Page 71
JSTL : la bibliothque Core : boucles La balise <forEach> permet deffectuer simplement des itrations sur plusieurs types de collection de donnes Elle dispose dun attribut
Object items : collection dlments sur qui contient les lments de
litration
Une value null est considre comme une collection vide Si lattribut items est absent, begin et end permettent deffectuer une itration entre deux nombresJSP2 - M. Baron - Page entiers
72
Affiche tous les lments Affiche uniquement les trois premiers lments
<br> La mme chose en affichant uniquement les trois premiers<br> <c:forEach var="entry" items="${header}" begin="0" end="2" > ${entry.key} = ${entry.value}<br> </c:forEach> <br> Affiche uniquement des indices<br> <c:forEach var="entry" begin="0" end="2" > ${entry}<br> </c:forEach>
keulkeul.blogspot.com
JSTL : la bibliothque Core : boucles La balise <forTokens> permet de dcouper des chanes de caractres selon un ou plusieurs dlimiteurs Elle dispose dun attribut
String items : collection dlments sur qui contient les lments de
litration(obligatoire)
Le corps de cette balise contient le code qui sera valu pour chaque marqueur de chane
<%@ taglib uri="montag" prefix="c" %> keulkeul.blogspot.com <c:forTokens var="content" items="Bonjour Tout Le Monde" delims=" "> ${content}<br/> </c:forTokens>
JSTL : la bibliothque Core : URL Pour crer des URLs absolues, relatives au contexte, ou relatives un autre contexte utiliser la balise <url> Cette balise contient diffrents attributs
String value : lURL traiter (obligatoire) String context : spcifie le chemin du contexte de lapplication locale String var : le nom de la variable scope qui contiendra lURL String scope : nom du scope
Si var est omis, lURL sera affiche dans la rponse
La balise <param> permet dajouter simplement un paramtre une URL reprsente par la balise parente Cette balise contient diffrents attributs
String name : nom du paramtre de lURL (obligatoire) String value : valeur du paramtre de lURL
- M. Baron - Page 75
Cration dune URL sans lattribut var donc affichage dans la rponse
Cration/modification dune URL avec ajout dun troisime paramtres Ajoute le contexte lURL
JSP2 - M. Baron - Page 76
JSTL : la bibliothque Core : URL La balise <redirect> est une commande de redirection HTTP au client Les attributs de cette balise sont
String url : lurl de redirection (obligatoire) String context : spcifie le chemin du contexte de lapplication locale
utiliser (dbute obligatoirement par / )
JSTL : la bibliothque Core : dploiement Tlcharger limplmentation JSTL de Jakarta ladresse suivante jakarta.apache.org/site/downloads Choisir Taglibs->Standard 1.1 Taglib Copier les librairies jstl.jar et standard.jar dans le rpertoire
Modifiez le fichier web.xml de manire donner une URI la bibliothque JSTL Pas plus simple que a ...
JSP2 - M. Baron - Page 78
Dans la suite nous utiliserons le prfixe fmt pour utiliser cette bibliothque
JSP2 - M. Baron - Page 79
JSTL : la bibliothque I18n Les fichiers properties contenant les ressources doivent tre placs dans le rpertoire WEB-INF/classes La balise <message> permet de localiser un message
String key : cl du message utiliser String var : nom de la variable qui va recevoir le rsultat String scope : porte de la variable qui va recevoir le rsultat
La balise <bundle> permet de prciser un bundle utiliser dans les traitements contenus dans son corps
String basename : nom de base de ressource utiliser (obligatoire)
<fmt:bundle basename="message" > <fmt:message key="message.bonjour" /> </fmt:bundle>
JSTL : la bibliothque I18n La balise <bundle> ne permet dassocier uniquement un bundle au traitement de son corps. La balise <setBundle> permet de forcer le bundle utiliser par dfaut
String basename : nom de base de ressource utiliser (obligatoire) String var : nom de la variable qui va stocker le nouveau bundle String scope : porte de la variable qui va recevoir le nouveau bundle
keulkeul.blogspot.com
Si le bundle nest pas dfini cest celui par dfaut qui est utilis cd null
JSTL : la bibliothque I18n La balise <setLocale> permet de modifier une nouvelle locale
String ou Locale value : la locale utiliser (obligatoire) String variant : spcifie une variante spcifique un systme ou
navigateur
Si vous changez la locale dans le scope application cela affectera tous les utilisateurs
JSTL : la bibliothque I18n La balise <param> permet de paramtrer laffichage dun message obtenu avec la balise <message> Cette balise nest donc utilisable que dans la balise
<message>
Object value : lobjet qui sera utilis pour paramtrer le message
Possibilit de mettre plusieurs paramtres pour un message Les paramtres sont utiliss dans le fichier properties en utilisant les accolades
keulkeul.blogspot.com
Le fichier properties
<fmt:message key="la_cle"> <fmt:param value="valeur1" /> <fmt:param value="valeur 2" /> </fmt:message>
la_cle=message {0}{1}
Les paramtres sont identifis dans le fichiers properties par les accolades
JSP2 - M. Baron - Page 83
La locale est maintenant modifie en franais Affichage de messages avec des paramtres
# Des Messages Rien que Des Messages message.vide=Je pense que c'est vide message.plein=Je pense que c'est plein autremessage.bonjour=Bonjour {0} et {1} autremessage.adieu=Bonsoir {0} et {1}
keulkeul.blogspot.com
Fichier message_fr.properties
JSP2 - M. Baron - Page 84