Académique Documents
Professionnel Documents
Culture Documents
0236 Formation Web Servlet JSP 2
0236 Formation Web Servlet JSP 2
JSP 2.0
Creative Commons
Contrat Paternité
Partage des Conditions I nitiales à l'I dentique
2.0 France
keulkeul.blogspot.com
La classe « handler »
<tag>
<name>hellotag</name>
<tag-class>monpackage.HelloTag</tag-class>
<description> Le fichier TLD
Tag qui affiche bonjour
</description>
<body-content>empty</body-content>
</tag>
</taglib>
JSP2 - M. Baron - Page 5
Conception d’un tag personnalisé par l’exemple ( 2.0)
SimpleTagSupport
Avec la version 2, le corps de la
# getJspContext() : JspContext balise personnalisée est traité
# getJspBody() : JspFragment
dans une même classe
+ getParent() : JspTag
...
JSP2 - M. Baron - Page 7
Conception d’un tag personnalisé ( 2.0) : cycle de vie
<short-name>TagLibTest</short-name>
Première balise <tag>
...
personnalisée </tag>
<tag>
... Seconde balise
</tag> personnalisée
</taglib>
<tag>
<name>hellotag</name> Chaque tag
<tag-class>monpackage.HelloTag</tag-class>
<description>Tag qui affiche bonjour</description> personnalisé est défini
<body-content>empty</body-content>
</tag>
dans une balise < tag>
</taglib>
JSP2 - M. Baron - Page 11
Conception d’un tag personnalisé ( 2.0) : attributs de tag
Tag sans corps avec un
h Un tag peut contenir des attributs attribut appelé « attribut1 »
<prefixe:nomDuTag attribut1="valeur" />
...
}
<name>moment</name>
<required>false</required> Un seul attribut
<rtexprvalue>false</rtexprvalue> est défini
</attribute>
<body-content>empty</body-content>
</tag>
</taglib>
@@tag:amoi
tag:amoi
@@tag:amoi
JSP
JSP11 tag:amoi
Servlet
Servlet11
Servlet
Servlet22
ServletContext (scope = application)
} else {
getJspContext().getOut().println("Y a rien");
}
}
}
} Préférez cette solution à la
première, elle est moins
dépendante que la première version
JSP2 - M. Baron - Page 23
Conception d’un tag personnalisé ( 2.0) : variables
implicites
h Exemple 2 : collaboration de taglib « switch …case »
<%@ taglib uri="monTag" prefix="montagamoi" %>
<montagamoi:switchtag test="3">
<montagamoi:casetag value="0">Zéro</montagamoi:casetag> Simulation de « switch
<montagamoi:casetag value="1">Un</montagamoi:casetag> case » par l’intermédiaire
<montagamoi:casetag value="2">Deux</montagamoi:casetag>
<montagamoi:casetag value="3">Trois</montagamoi:casetag>
de balises
</montagamoi:switchtag>
}
I nitialise
public boolean isValid(String caseValue) {
if (test == null) return false; l’attribut
return(test.equals(caseValue)); « test »
}
}
Vérifie que « test »
est le même que
celui du tag enfant JSP2 - M. Baron - Page 24
Conception d’un tag personnalisé ( 2.0) : variables
implicites
h Exemple 2 (suite) : collaboration de balises personnalisées ...
public class CaseTag extends TagSupport {
public String value;
Vérifie que « test » du tag
public void setValue(String p_value) { parent est le même que
this.value = p_value; « value » du tag enfant
}
getJspContext().getOut().println(mon_writer);
}
}
<%@ taglib uri="monTag" prefix="montagamoi" %>
<montagamoi:iteratetag count="3">
Affiche le résultat bufférisé Coucou<br>
</montagamoi:iteratetag>
sur la page JSP
JSP2 - M. Baron - Page 29
Conception d’un tag personnalisé ( 2.0) : itération sur le
corps
h Exemple (bis) : itération 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);
récupéré 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>
<tag>
<name>uppercasetag</name>
<tag-class>monpackage.UpperCaseTag</tag-class>
keulkeul.blogspot.com
h un objet implicite
<montagamoi:uppercasetag>
Bonjour, je suis en minuscule et je vais passer en majuscule <br>
La date aujourd'hui est ${pageScope["mon_bean"]}
</montagamoi:uppercasetag>
<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
Les expressions EL
permettent de
keulkeul.blogspot.com
gérer plus
facilement les
valeurs « null »
<%
MonBeanAMoi mon_bean = (MonBeanAMoi)pageContext.findAttribute("name");
keulkeul.blogspot.com
if (mon_bean != null)
out.println(bean.getName());
%>
List )
${ objet[5] }
${ objet["2"] }
Si l’index n’est pas un ${ objet["4"] }
nombre entier, il est ${ objet["5"] }
converti mais peut
provoquer une exception
JSP2 - M. Baron - Page 40
Accès aux propriétés des objets ( 2.0) : objets mappés
une étiquette
h Opérateurs arithmétiques : + , -, * , / , …
keulkeul.blogspot.com
corps de la balise
</montagamoi> AT_END
NESTED
JSP2 - M. Baron - Page 46
Conception d’un tag personnalisé ( 2.0) : TagExtraI nfo
System.out.println(tab_attribute[i].getName());
} TagI nfo la liste
... de tous les
attributs
Affiche l’intégralité
des noms des
attributs d’un tag
JSP2 - M. Baron - Page 47
Conception d’un tag personnalisé ( 2.0) : TagExtraI nfo
méthodes
h boolean isValid(TagData)
"java.util.Date",
true,
« value »
keulkeul.blogspot.com
VariableInfo.AT_BEGIN);
return vi;
}
}
Type la variable
La variable a une portée
Déclaration de la de script
complète du début jusqu’à la
variable de script fin de la page JSP JSP2 - M. Baron - Page 49
Conception d’un tag personnalisé ( 2.0) : TagExtraI nfo
h Deux intérêts
h Validation effectuée pour tous les tags à la compilation
Espace de nommage de
Nom de l’attribut Valeur de l’attribut
l’attribut
<tag>
<name>dynamicattribut</name>
<tag-class>monpackage.InputTag</tag-class>
<description>Tag qui montre la déclaration d'une variable de script</description> La page JSP
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute> Deux attributs sont La valeur
<attribute>
<name>type</name> obligatoires « statique » et
<required>true</required>
<rtexprvalue>true</rtexprvalue> la valeur du
</attribute> Un attribut est obligatoire Bean
<attribute>
keulkeul.blogspot.com
<name>value</name>
<rtexprvalue>true</rtexprvalue>
<required>false</required>
</attribute>
<body-content>scriptless</body-content>
<dynamic-attributes>true</dynamic-attributes>
</tag>
}
}
Ce répertoire contient
WEB-INF web.xml obligatoirement les bytecodes
des fichiers « handlers »
classes *.class
Les fichiers TLD
doivent être copiés
keulkeul.blogspot.com
dans le répertoire
Ce répertoire contient
lib *.jar, *.class WEB-I NF ou dans
l’ensemble des fichiers de un de ces sous
description des répertoires
bibliothèques (TLD) tld *.tld
h I nternationalisation et formatage
Nous ne présenterons
que la partie liée aux
h Exécution de requête SQL structures et à
l’internationalisation
h Utilisation de document XML
<taglib>
<taglib-uri>cjstl</taglib-uri>
<taglib-location>/WEB-INF/tld/c.tld</taglib-location>
</taglib>
h Déclarer dans la page JSP la balise Dans la suite nous utiliserons le préfixe
« c » pour utiliser cette bibliothèque
<%@ taglib uri="cjstl" prefix= "c" %>
JSP2 - M. Baron - Page 62
JSTL : la bibliothèque « Core » : variables
Corps de
« out »
<c:out value="${header['user-agent']}" >
default="Inconnu"
</c:out>
JSP2 - M. Baron - Page 63
JSTL : la bibliothèque « Core » : variables
information
<c:remove var="test1" scope="page" />
h Simple exemple
<%@ taglib uri="montag" prefix="c" %>
<c:catch>
<c:set target="beans" property="prop" value="1" />
Le bean « beans » n’existe
pas, l’exception est ignorée
keulkeul.blogspot.com
</c:catch>
<br>
Affiche uniquement des indices<br>
<c:forEach var="entry" begin="0" end="2" >
${entry}<br>
</c:forEach>
keulkeul.blogspot.com
${url2}<br>
<a href="${url}">Mon Lien sur cette page</a>
Ajoute le contexte à
l’URL
<taglib-location>/WEB-INF/tld/fmt.tld</taglib-location>
</taglib>
...
bundle par défaut affiché par
<fmt:message key="message.bonjour" />
l’intermédiaire du
bundle par défaut
Si le bundle n’est pas défini
c’est celui par défaut qui
est utilisé càd null
JSP2 - M. Baron - Page 81
JSTL : la bibliothèque « I 18n »
Modification de la
« locale » pour la Modification de la
page en cours « locale » pour
l’utilisateur en cours
keulkeul.blogspot.com
Possibilité de modifier
Si vous changez la locale plusieurs fois la locale dans
dans le scope application une page JSP
cela affectera tous les
utilisateurs
JSP2 - M. Baron - Page 82
JSTL : la bibliothèque « I 18n »
Fichier « message_fr.properties »