Vous êtes sur la page 1sur 75

les pages JSP et la JSTL

Le langage Java

Rsum de l'pisode prcdent


(Les Servlets)

XVII-1

JMF

les pages JSP et la JSTL

Le langage Java

servlet = ?
Une servlet est un programme (plug-in)
ajouter un serveur (quel qu'il soit).
Ce cours a trait la programmation Java
cot serveur (Java EE )
Pour l'instant les serveurs acceptant des
servlets sont plutt des serveurs Web.

XVII-2

JMF

les pages JSP et la JSTL

Le langage Java

Comment a marche ?
Le serveur (Web) possde dsormais un
interprteur Java (JVM)
=> il n'y a pas de processus cr lors de
l'excution de code Java
Cf. les clients Web possdent un
interprteur Java permettant de lancer des
applets.
D'o le nom de servlets.
XVII-3

JMF

les pages JSP et la JSTL

Le langage Java

Moteurs de servlets (et de JSP) :


Tomcat

Plug-in d'autres serveurs web (apache, Microsoft IIS,


)
Est aussi un mini-serveur Web
Version 7.0.33 au 1er dcembre 2012
Voir
http://tomcat.apache.org/tomcat-7.0doc/index.html

XVII-4

JMF

les pages JSP et la JSTL

Le langage Java

Une servlet : code complet


import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class MaPremiereServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Etape 1. Spcifier le type MIME du contenu de la rponse
response.setContentType("text/html");
// Etape 2. Rcupre le PrintWriter pour envoyer des donnes au client
PrintWriter out = response.getWriter();
// Step 3. Envoyer linformation au client
out.println("<html>");
out.println("<head><title>Bonjour Servlet</title></head>");
out.println("<body>");
out.println("<h1> Bonjour tous </h1>");
out.println("Il est : " + new java.util.Date());
out.println("</body></html>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

XVII-5

JMF

les pages JSP et la JSTL

Le langage Java

application web = ?
"Une application web est une extension
dynamique d'un serveur web ou applicatif"
Par exemple :
les application web orientes prsentation qui
gnrent des pages web (HTML, XML)
dynamiquement

XVII-6

JMF

les pages JSP et la JSTL

Le langage Java

Architecture d'une application web


1/3

Une bonne rfrence est :


http://tomcat.apache.org/tomcat-7.0doc/appdev/deployment.html

Depuis la version 2.2 des spcifications des servlets, les


ressources doivent tre ranges comme indiqu diapo
suivante :

XVII-7

JMF

les pages JSP et la JSTL

Architecture d'une application


web 2/3

Le langage Java

Les fichiers .html et .jsp doivent tre rangs partir de la


racine de votre site web (= application web).
/WEB-INF/web.xml : le fichier descripteur de dploiement de
votre application web
/WEB-INF/classes/ : le rpertoire racine de rangement
des .class (servlets compils, etc.). Si les classes sont dans des
packages, la hirarchie des packages doit tre respecte partir
de /WEB-INF/classes/. Par exemple la classe
cnam.ihm.MaServlet doit tre mise dans
/WEB-INF/classes/cnam/ihm/MaServlet.class

XVII-8

JMF

les pages JSP et la JSTL

Architecture d'une application


web 3/3

Le langage Java

/WEB-INF/lib/ : le rpertoire contenant les .jar ncessaires


votre application web (driver JDBC, etc.)
RACINE
web.xml

WEB-INF

classes
lib

*.html, *.jsp

On peut mettre tout cela dans un fichier compress : un .war


XVII-9

JMF

les pages JSP et la JSTL

Le langage Java

Bibliographie
Page de dpart de la technologie servlets :
http://java.sun.com/products/servlet/in
dex.html

Java servlets, Jason Hunter, ed O'Reilly


traduit en franais

XVII-10

JMF

les pages JSP et la JSTL

Le langage Java

Fin du rsum de l'pisode


prcdent

XVII-11

JMF

les pages JSP et la JSTL

Le langage Java

JavaServer Pages
(JSP)

XVII-12

JMF

les pages JSP et la JSTL

Le langage Java

ssi : la technique server side include


Une page ssi (shtml) est demande par un
client web
Le serveur Web passe la main au
programme adquat qui traite la partie de la
page le concernant.
Ce programme gnre la partie dynamique
La page HTML cre dans son ensemble est
retourne au serveur puis au client Web.

XVII-13

JMF

les pages JSP et la JSTL

Le langage Java

JavaServer Pages
= JSP = la technique des ssi en Java
= une page HTML contenant du code Java
=> meilleure division des tches :
prsentation gnrale par les graphistes
cot dynamique par des programmeurs (Java)

XVII-14

JMF

les pages JSP et la JSTL

Le langage Java

Comment a marche ?
Concrtement :
toute la page HTML est convertie en une servlet
cette servlet est traite par le moteur Java
intgr au serveur Web (technologie des
servlets) et retourne la page HTML construite

XVII-15

JMF

les pages JSP et la JSTL

Le langage Java

JSP vs. Servlets


Servlet = du code Java contenant de
l'HTML
JSP = une page HTML contenant du code
Java
Concrtement avec les JSP :
les parties statiques de la page HTML sont
crites en HTML
les parties dynamiques de la page HTML sont
crites en Java
XVII-16

JMF

les pages JSP et la JSTL

Le langage Java

Notre premire JSP


fichier MaDate.jsp
<html><head><title>Obtenu par une JSP</title></head>
<body>
<h3>Bonjour de ma part </h3> <hr>
La date courante est : <%= new java.util.Date() %>
</body>
</html>

Trait quand le client demande lURL de la JSP :


http://serveurWeb:<port>/.../MaDate.jsp

XVII-17

JMF

les pages JSP et la JSTL

Le langage Java

Tomcat et JSP
Des exemples de JSP (code + liens pour
l'excution) sont disponibles partir de
REP_INSTALL_TOMCAT/webapps/examples/jsp

pour Tomcat

XVII-18

JMF

les pages JSP et la JSTL

Le langage Java

Excution de JSP
Il faut mettre les pages JSP dans un endroit
particulier du serveur Web
Cet endroit dpend du serveur Web et de sa
configuration
Pour tomcat en configuration standard,
http://localhost:
8080/examples/jsp/MaDate.jsp

~
REP_INSTAL_TOMCAT\webapps\examples\jsp\
MaDate.jsp

pour tomcat
XVII-19

Et sans bidouille !!

JMF

les pages JSP et la JSTL

Le langage Java

Excution de JSP (suite)


Une dmo:
Le rsultat de MaDate.jsp est :

Une autre excution donne une


autre date => dynamicit

XVII-20

JMF

les pages JSP et la JSTL

Le langage Java

Que s'est il pass ?


Le moteur de JSP a construit une servlet
(MaDate_jsp.java sous l'arborescence
work pour Tomcat)
Cette phase est parfois appele la
traduction de la JSP (en servlet)
Puis a compil et excut la servlet

XVII-21

JMF

les pages JSP et la JSTL

Le langage Java

La servlet construite
package org.apache.jsp;
...
public class MaData_jsp extends HttpJspBase {
...
public void _jspService(HttpServletRequest request, HttpServletResponse
response) throws IOException, ServletException {
...
pageContext = _jspxFactory.getPageContext(...);
session = pageContext.getSession();
out = pageContext.getOut();
// HTML
// begin [file="C:\\...\\examples\\jsp\\MaDate.jsp";from=(0,0);to=(4,24)]
out.write("<html><head><title>Obtenu par une JSP</title></head>\r\n
<body>\r\n\r\n<h3>Bonjour de ma part</h3> <hr>\r\n
La date courante est : ");
// end
//begin [file="C:\\...\\examples\\jsp\\MaDate.jsp";from=(4,27)to=(4,49)]
out.print( new java.util.Date() );
// end
// HTML
// begin [file="C:\\...\\examples\\jsp\\date.jsp";from=(4,51);to=(6,7)]
out.write("\r\n</body>\r\n</html>"); // end
...
}
}

XVII-22

JMF

les pages JSP et la JSTL

Le langage Java

Algorithme d'excution de la JSP


La servlet associe la
JSP demande est-elle
charge en mmoire
du moteur de
servlets ?

Requte client

Oui

Non
Non

Conteneur de JSP
Oui

servlet jour
prcompile
disponible?
Non
Oui
Traduire en servlet et
compiler

Charger la servlet

Rponse au client

XVII-23

Le fichier JSP at-il t modifi


depuis la
dernire
traduction en
servlet ?

Non

Excuter la servlet

JMF

les pages JSP et la JSTL

Le langage Java

3 parties d'une JSP


scriptlets <%
%>
dclarations <%!
%>
expressions <%=
%>

XVII-24

JMF

les pages JSP et la JSTL

Le langage Java

Scriptlets <%

%>

contient du code Java


insrer dans _jspService() de la
servlet, donc peut utiliser out, request,
response, etc.
Exemple :
<%
String[] langages = {"Java", "C++", "Smalltalk", "Simula 67"};
out.println("<h3>Principaux langages orients objets : </h3>");
for (int i=0; i < langages.length; i++) {
out.println("<p>" + langages[i] + "</p>");
}
%>

XVII-25

JMF

les pages JSP et la JSTL

Le langage Java

Dclarations <%!

%>

Sont des dclarations Java.


Seront insres comme des membres de la
servlet
Permet de dfinir des mthodes ou des
donnes membres
Exemples :
<%!
int random4() {
return (int)(Math.random() * 4);
}

<%!
int nombreFetiche = 2;
%>

%>

XVII-26

JMF

les pages JSP et la JSTL

Le langage Java

Expressions <%=

%>

En fait expression Java qui renvoie un


objet String ou un type primitif.
Un raccourci pour <% out.println();

%>
<%= XXX %> ~ <% out.println(XXX); %>

attention au ;
est donc converti en out.println() dans
la mthode _jspService() de la servlet.
La somme est:

<%= (195 + 9 + 273) %>

Je vous rponds l'adresse :

XVII-27

<%= request.getParameter("email_address") %>

JMF

les pages JSP et la JSTL

Le langage Java

Objets prdfinis dans une JSP


3 objets peuvent tre immdiatement utiliss
dans une expression ou une scriptlet d'une
JSP :
: le canal de sortie
request (HttpServletRequest) : l'objet requte
response (HttpServletResponse) : l'objet rponse
out

Il y en a d'autres
Cf. ces mmes objets dans une servlet
XVII-28

JMF

les pages JSP et la JSTL

Le langage Java

Un exemple complet :
complet.jsp
<html><head><title>JSP complet</title></head>
<body>
<%! String[] langages = {"Java", "C++", "Smalltalk", "Simula 67"};
int random4() {
return (int) (Math.random() * 4);
}
%>
<p>Parmi tous les langages orients objets :</p>
<ol>
<%
for (int i=0; i < langages.length; i++) {
out.println("<li>" + langages[i] + "</li>");
}
%>
</ol>
<p>Le prochain que j'apprends est <b><%= langages[random4()] %> </b></p>
</body>
</html>

XVII-29

JMF

les pages JSP et la JSTL

Le langage Java

complet.jsp

XVII-30

JMF

les pages JSP et la JSTL

Le langage Java

Dboguer les JSP


La fentre de lancement du serveur Web
donne des indications. Suivant les serveurs,
une page HTML est retourne avec des
indications.
Ces lments sont trs souvent relatifs la
servlet et pas la page JSP.
Directives <%@ page errorPage= ...%>
et
<%@ page isErrorPage="true"%>
XVII-31

JMF

les pages JSP et la JSTL

Le langage Java

Dboguer les JSP (suite)


Un page JSP peut rfrencer une page erreur
par <%@ page errorPage="page.jsp"%>
La page erreur est indique par l'entte
<%@ page isErrorPage="true"%>

Si une exception est leve le traitement est


drout vers la page erreur qui connat la
rfrence exception qui repre l'exception

XVII-32

JMF

les pages JSP et la JSTL

Le langage Java

Dboguer les JSP : exemple


langages.jsp
<%@ page errorPage="erreur.jsp"%>
<%! String[] langages = {"Java", "C++", "Smalltalk", "Simula 67"};
%>
<p>Parmi tous les langages orients objets :</p>
<ol>
<%
// leve d'une ArrayIndexOutOfBoundsException
for (int i=0; i < 7; i++) {
out.println("<li>" + langages[i] + "</li>");
}
%>

XVII-33

JMF

les pages JSP et la JSTL

Le langage Java

Dboguer les JSP : exemple


(suite)
erreur.jsp
<%@ page isErrorPage="true"%>
<html><body>
exception leve <b> <%= exception %> </b>
<hr>
<h3>trace de la pile</h3>
<pre>
<%
java.io.PrintWriter myWriter = new java.io.PrintWriter(out);
exception.printStackTrace(myWriter);
%>
</pre>
</body></html>

XVII-34

JMF

les pages JSP et la JSTL

Le langage Java

Dboguer les JSP : exemple (fin)


Charger la page langages.jsp amne :

XVII-35

JMF

les pages JSP et la JSTL

Le langage Java

Enchaner les pages


Un page JSP peut en appeler une autre par
la directive : <jsp:forward>
Syntaxe :
<jsp:forward page="pageDeRedirection" />

lanceForward.jsp
<% String repUtilisateur = request.getParameter("repTextField");
int rep = Integer.parseInt(repUtilisateur);
if ((rep % 2) == 0) {
%>
<jsp:forward page="gagne.jsp"/>
<% } else { %>
<jsp:forward page="perdu.jsp"/>
<% } %>
On n'affiche jamais cela

XVII-36

JMF

les pages JSP et la JSTL

Le langage Java

Enchaner les pages (suite)


Aprs un <jsp:forward>, le traitement
est entirement pris en charge par nouvelle
page
Serveur Web
Navigateur

lanceForward.jsp

1. lanceForward.jsp
<jsp:forward
page="gagne.jsp"/>
3. Retourner gagne.jsp

gagne.jsp
worker.jsp
Transmis gagne.jsp

XVII-37

JMF

les pages JSP et la JSTL

Le langage Java

Inclusion de fichiers par


<%@ include file="" %>
Utilis pour faire des inclusions statiques de
fichiers : en-tte ou pied de page ...
Syntaxe :
<%@ include file="path to relative URL" %>

Le fichier est inclus au moment de la traduction


header.html

main.jsp
<%@ include file="header.html" %>
<h3>Bienvenue en GLG 203</h3>
<%@ include file="footer.jsp" %>

footer.jsp

JMF

les pages JSP et la JSTL

Inclusion de pages
<jsp:include page="" />

Le langage Java

Pour inclure des sorties de servlets ou JSPs


Le contenu du servlet ou de la JSP est trait avant linclusion
La page est incluse au moment de la requte
Syntaxe :
<jsp:include page="path to relative URL" />
Le traitement de la page courante continue aprs linclusion des
ressources
header.html

main.jsp
<jsp:include >

questions.jsp

Components

<jsp:include >

Permet aussi dinclure du HTML


On prfrera <%@ include %> pour inclure du HTML
JMF

les pages JSP et la JSTL

Le langage Java

Diffrences entre les 2 include


<%@ include ... > est un simple inclusion, c'est dire une
copie ( la #include des langages C , C++)
<jsp:include ...> peut faire le mme travail que
<%@ include ... > mais fait l'inclusion chaque requte
donc dynamique. On peut donc inclure une autre page JSP, qui
sera excute la requte.
De plus avec <jsp:include ...>, on peut passer des
paramtres la page inclure,
voire faire de la programmation qui sera excute la requte.

XVII-40

JMF

les pages JSP et la JSTL

Le langage Java

Passage de paramtres grce


jsp:include
Une page JSP peut passer des paramtres supplmentaires la
page de destination
Par exemple page1.jsp envoie un paramtre supplmentaire
travail.jsp

<jsp:include page="travail.jsp">
<jsp:param name="niveauTraitement" value="important" />

</jsp:include>

travail.jsp rcupre le paramtre l'aide de


request.getParameter("nomVariable")
Ce traitement est :

XVII-41

<%= request.getParameter("niveauTraitement") %>

JMF

les pages JSP et la JSTL

Le langage Java

Programmation (conditionnelle)
grce jsp:include
Ayant rcupr un paramtre on peut s'en servir !

<%
String typeVacancesChoisi = request.getParameter("typeVac");
String choixDestinations;
if ( (typeVacancesChoisi != null) &&
(typeVacancesChoisi.equalsIgnoreCase("nature"))) {
choixDestinations = "vacancesALaCampagne.jsp";
}
else {
choixDestinations = "vacancesCitadines.jsp";
}
%>
<jsp:include page="<%= choixDestinations %>"/>

XVII-42

JMF

les pages JSP et la JSTL

Le langage Java

Conclusion <%@ include ...> vs.


<jsp:include ...>
<%@ include %>
Inclusion statique de page HTML ou JSP = le contenu est
inclus au moment de la traduction
Le nom du fichier inclure doit tre connu au moment de la
traduction
Souvent utilis pour les en-ttes et pieds de page
<jsp:include>
Inclusion dynamique de JSP ou sortie de servlet = le
contenu est trait au moment de la requte
Le nom de la page inclure peut tre dtermin au moment
de la requte
Peut passer des paramtres aux pages incluses
XVII-43

JMF

les pages JSP et la JSTL

Le langage Java

JSP et Java beans


But : avoir le moins de code Java possible
dans une page JSP (HTML)
Sous-traiter le code un Java bean
balise XML : <jsp:useBean>

XVII-44

JMF

les pages JSP et la JSTL

Le langage Java

JSP et Java beans (suite)


Syntaxe gnrale :
<jsp:useBean id="nomInstanceJavaBean"
class="nomClasseDuBean"
scope="request|session|application|
page">
</jsp:useBean>

Le bean est alors utilisable par


nomInstanceJavaBean
balise sans corps donc utilisation de
<jsp:useBean />
XVII-45

JMF

les pages JSP et la JSTL

Le langage Java

l'attribut scope
Il indique la porte du bean.
valeur
request
page
session
application

XVII-46

Description
Le bean est valide pour cette requte. Il est utilisable dans les pages de redirection
de la requte (<jsp:forward>). Il est dtruit la fin de la requte.
Similaire request, mais le bean n'est pas transmis aux pages de redirection
<jsp:forward>. C'est la porte par dfaut
Le bean est valide pour la session courante. Sil nexiste pas encore dans la session
courante, il est cr et plac dans la session du client. Il est rutilis jusqu ce que
la session soit invalide
Le bean est valide pour lapplication courante. Il est cr une fois et partag par
tous les clients des JSP.

JMF

les pages JSP et la JSTL

Le langage Java

JSP et Java beans : exemple


Soit le bean :
package cnam;
public class SimpleBean implements java.io.Serializable {
private int compter;
public SimpleBean() {
compter = 0;
}
public void setCompter(int theValue) {
compter = theValue;
}
public int getCompter() {
return compter;
}
public void increment() {
compter++;
}
}

Remarque : il faut mettre le bean dans un


package
XVII-47

JMF

les pages JSP et la JSTL

Le langage Java

Utilisation du bean dans une JSP


Utilisation l'aide de son nom
Rcupration des proprits :
Par appel de mthode getXXX() :
Par la balise <jsp:getProperty >
<p> on repere le bean par le nom nomBean<br>
<jsp:useBean id="nomBean" class="cnam.SimpleBean"
scope="session" />
<p> On accede a une proprite avec une expression:
<br> compteur = <%= nomBean.getCompter() %>
<hr>
On incrmente le compteur <% nomBean.increment(); %>
<p>On peut accder la proprit par une balise :<br>
<jsp:getProperty name="nomBean" property="compter" />

XVII-48

JMF

les pages JSP et la JSTL

Le langage Java

Positionner les proprits


du bean dans une JSP
Par appel de mthode setXXX(...) :
Par la balise <jsp:setProperty >
<p> on repere le bean par le nom nomBean<br>
<jsp:useBean id="nomBean" class="cnam.SimpleBean"
scope="session" />
<p> On positionne une proprite avec une expresion:
<br> compteur = <%= nomBean.setCompter(6) %>
<p>ou par une balise :<br>
<jsp:setProperty name="nomBean" property="compter" value="6" />

Une demo ? OK !
XVII-49

JMF

les pages JSP et la JSTL

Le langage Java

Architecture MVC
modle = les donnes accdes par un code
Java (JDBC, RMI, EJB, etc.)
vues = JSP
contrleur = servlets

XVII-50

JMF

les pages JSP et la JSTL

Le langage Java

Architecture MVC (suite)

Syntaxe dans la servlet pour lancer la JSP :


public void doPost(HttpServletRequest request, HttpServletResponse response){
ServletContext context = getServletContext(); // hrite de GenericServlet
RequestDispatcher dispatcher =
context.getRequestDispatcher("/maPageMiseEnForme.jsp");
dispatcher.forward(request, response);
}

XVII-51

JMF

les pages JSP et la JSTL

Le langage Java

Architecture MVC (suite)


La servlet peut passer des valeurs la JSP
appele grce setAttribute()
public void doPost(HttpServletRequest request, HttpServletResponse response) {

// appelle les mthodes sur les objets mtiers


ArrayList theList = // un objet passer
// ajoute la requte
request.setAttribute("nomDelObjet", theList);
ServletContext context = getServletContext();
RequestDispatcher dispatcher = context.getRequestDispatcher("/jspAAppeler.jsp");
dispatcher.forward(request, response);
}

La JSP extrait les objets de request grce


getAttribute()
<%

ArrayList theList = (ArrayList)


request.getAttribute("nomDelObjet");
// maintenant, utiliser l'ArrayList
%>

XVII-52

JMF

les pages JSP et la JSTL

Le langage Java

La JSTL
(JSP Standard Tag Library)

XVII-53

JMF

les pages JSP et la JSTL

Le langage Java

Dvelopper ses propres balises


On plus des balises jsp:useBean,
jsp:setProperty, etc, on peut
dvelopper ces propres balises
Le but ? Ne manipuler qu'un langage de
balises dans les pages JSP
Premire technique : avec des classes Java.
C'est lourd et dlicat mais cela fonctionne
Seconde technique : avec les bibliohques
de balises (tags libraries)
XVII-54

JMF

les pages JSP et la JSTL

Le langage Java

Dvelopper ses balises avec une


"tag library"
Une "tag library" est une bibliothque de balises.
Concrtement, c'est un rpertoire qui contient des
descriptions de balises
L'application web a l'architecture :
racine de l'appli web

WEB-INF
tags
dictons.tag

dictons_test.jsp

XVII-55

JMF

les pages JSP et la JSTL

Le langage Java

dictons_test.jsp
C'est la page JSP qui utilise la balise :
<%@ taglib prefix="ez" tagdir="/WEB-INF/tags"%>
<html><body>
<b>Formule du soir</b> <hr/>
<i> <ez:dictons/> </i>
</body></html>

Une dmo : OK. URL


http://localhost:8080/GLG203/dictons_test.jsp

XVII-56

JMF

les pages JSP et la JSTL

Le langage Java

dictons.tag
Pour cela, il faut avoir le fichier
dictons.tag
Sa syntaxe est aise et proche du langage
Java :
<%! String[] lesDictons =
{"Bonsoir !",
"GLG203, c'est vraiment super",
"Le CNAM, quel pied !"};
%>
<%
int index = (int) (Math.random() * lesDictons.length);
out.print(lesDictons[index]);
%>

XVII-57

JMF

les pages JSP et la JSTL

Le langage Java

Balises avec attribut


On peut dvelopper des balises plus complexes (avec attribut par
exemple) et avoir une page JSP comme :
<%@ taglib prefix="ez" tagdir="/WEB-INF/tags"%>
<html><body>
<b>Formule du soir</b> <hr/>
<i> <ez:dictonsAvecAttributs nomPersonne="Toto"/> </i>
</body></html>

Un dmo OK : URL
http://localhost:
8080/GLG203/dictonsAvecAttributs_test.jsp

XVII-58

JMF

les pages JSP et la JSTL

Le langage Java

dictonsAvecAttriburs.tag
Pour cela, il faut avoir le fichier
dictonsAvecAttributs.tag
Les supplments en gras
<%@ attribute name="nomPersonne" type="java.lang.String" required="false" %>
<%! String[] lesDictons =
{"Bonsoir !",
"GLG203, c'est vraiment super",
"Le CNAM, quel pied !"};
%>
<%
int index = (int) (Math.random() * lesDictons.length);
if (nomPersonne != null) {
out.print("Pour monsieur " + nomPersonne + ", ");
}
out.print(lesDictons[index]);
%>
XVII-59

JMF

les pages JSP et la JSTL

Le langage Java

Et avec des classes Java ?


"C'est lourd et dlicat, mais cela fonctionne" !
L'ide principale est que, quand le conteneur de pages JSP lit une
page JSP, il peut dclencher le lancement de certaines mthodes
d'une classe associe une balise (cf. les traitements JAXP)
Par exemple, on dfinit la classe Hello.java :
package cnam;
import javax.servlet.jsp.tagext.*;
public class Hello extends TagSupport{
public int doStartTag() throws JspException {
try {
pageContext.getOut().print("Hello World");
} catch (Exception ex) {
throw new JspException("IO problems");
}
return SKIP_BODY;
}
}

XVII-60

JMF

les pages JSP et la JSTL

Le langage Java

Association classe Java et balise


C'est dans le fichier de description de bibliothques de balises (tld
= tag library descriptor) qu'est indiqu l'association classe Java,
balise :
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>

<tag>
<name>bonjour</name>
<tag-class>cnam.Hello</tag-class>

</tag>
<tag>

</tag>
</taglib>

fichier balisesCnam.tld
XVII-61

Llment <taglib> contient un ou plusieurs sous-lments


<tag>

JMF

les pages JSP et la JSTL

Le langage Java

Classe Java, tld, o ranger tout cela ?


La classe compile est mise (videmment) dans WEBINF/classes
Les fichiers .jsp et .tld sont mis dans une arborescence de
l'application web, cohrente avec les URL d'accs
Par exemple :
app root

WEB-INF
classes
cnam
tagme

Hello.class
balisesCnam.tld
pageDeTest.jsp

XVII-62

JMF

les pages JSP et la JSTL

Utilisation de balises de
bibliothque dans une JSP

Le langage Java

Fichier : pageDeTest.jsp

<html><body>
<%@ taglib uri="/tagme/balisesCnam.tld" prefix="ez" %>
<b>Horoscope du Jour</b> <hr/>
<i> <ez:bonjour/> </i>

Vous
choisissez le
prfixe

</body></html>
Fichier : balisesCnam.tld

<taglib>

<tag>
<name>bonjour</name>
<tagclass>cnam.Hello</tagclass>
</tag>

</taglib>

Nom complet
de la classe
JMF

les pages JSP et la JSTL

Le langage Java

la JSTL
Il n'est donc pas trop tonnant d'avoir des bibliothques standard
qui ont t dveloppes pour les usages courants "The JavaServer
Pages Standard Tag Library (JSTL) encapsulates as simple tags the
core functionality common to many Web applications" (*)
La premire est la JSTL (JSP Standard Tag Library)
Elle amne des structures de contrle (tests, boucle),
l'internationalisation, l'accs aux bases de donnes et les traitements
XML
Les spcifications de la JSTL sont tlchargeables partir de
http://jcp.org/aboutJava/communityprocess/final/j
sr052/index.html
(*) source :
http://www.oracle.com/technetwork/java/jstl-137486.html
XVII-64

JMF

les pages JSP et la JSTL

Le langage Java

Utiliser la JSTL
Pour utiliser la JSTL il faut rcuprer une ou des archives .jar
suivants les versions que vous voulez utiliser. Voir
http://stackoverflow.com/tags/jstl/info
Pour la version 1.2, le seul fichier jstl-1.2.jar est ncessaire

XVII-65

Pour la version 1.0, il en fallait 2 :


rcuprer (ou avoir) les archives jstl.jar et standard.jar,
par exemple l'URL
http://jakarta.apache.org/site/downloads/down
loads_taglibs-standard.cgi (prendre le .zip)
installer ces archives dans votre application web.
Pour tomcat, il faut installer ces archives dans WEB-INF\lib de
l'application web ou, plus gnralement, dans %TOMCAT_HOME
%\lib (et dans ce cas, toutes les applications web pourront utiliser la
JSTL)
Essentiellement ces archives contiennent des classes Java compiles
correspondant aux balises utilises

JMF

les pages JSP et la JSTL

Le langage Java

Une premire page avec la JSTL


fichier iterer.jsp mis dans l'appli web GLG203
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Iterer avec la JSTL</title>
</head>
<body>
<h3>Une simple iteration</h3>
<h4>De 1 10</h4>
<c:forEach var="i" begin="1" end="10">
${i} &nbsp;
</c:forEach>
</body>
</html>

rsultat :
XVII-66

JMF

les pages JSP et la JSTL

Le langage Java

JSTL : syntaxe
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
...
<c:forEach var="i" begin="1" end="10">
${i} &nbsp;
</c:forEach>
...

La ligne
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

indique que la bibliothque de balises de nom


http://java.sun.com/jsp/jstl/core sera rfrence par le prfixe c
Dans cette bibliothque, il y a la balise forEach (d'o son utilisation
c:forEach) avec 3 attributs : nom de variable, valeur de dbut, valeur de fin
On rcupre la valeur courante de la variable dans le corps de cette balise par
${nomVariable}

XVII-67

JMF

les pages JSP et la JSTL

Le langage Java

Les noms de bibliothques de


balises
Ce sont des URI (Uniform Resource Identifier), bref un
identificateur.
Dans le fichier standard.jar, se trouve un rpertoire METAINF (bravo !), contenant des fichiers .tld. Ce sont dans ces
fichiers que sont indiqus l'URI d'une bibliothque.
Par exemple le fichier c.tld

XVII-68

JMF

les pages JSP et la JSTL

Le langage Java

Noms de bibliothques de balises


: c.tld
fichier META-INF\c.tld dans standard.jar
<?xml version="1.0" encoding="UTF-8" ?>
<taglib ...
version="2.0">
<description>JSTL 1.1 core library</description>
<display-name>JSTL core</display-name>
<tlib-version>1.1</tlib-version>
<uri>http://java.sun.com/jsp/jstl/core</uri>
...
<tag>
<description>
The basic iteration tag, ...
</description>
<name>forEach</name>
<tag-class>org.apache.taglibs.standard.tag.rt.core.ForEachTag</tag-class>
...
</tag>
...
</taglib>

XVII-69

JMF

les pages JSP et la JSTL

Le langage Java

JSTL : exemples de balises


Les principales balises de la bibliothque core associ au prfixe
c sont : c:out, c:set, c:catch, c:if, c:forEach :
<c:out value="expression" /> est quivalent <%= expression %>
<c:set var="nomVariable" scope="application" value="valeur" />

est quivalent
<% pageContext.setAttribute("nomVariable", valeur, PageContext.APPLICATION_SCOPE)%>

<c:catch var="expression" />


actions surveiller
</c:catch>

XVII-70

est quivalent
<% try {
actions surveiller
} catch (Throwable expression) {}
%>

JMF

les pages JSP et la JSTL

Le langage Java

JSTL : exemples de balises


(suite)
Le si(condition) en JSTL :
est quivalent :

<% if(user.visitCount == 1) { %>


<%= "premire visite" %>
<% } %>

Le si / alors en JSTL :

(c'est plutt un switch !)

XVII-71

<c:if test="${user.visitCount == 1}">


<c:out value="premire visite" />
</c:if>

<c:choose>
<c:when test="${user.category == 'invite'}>
...
</c:when>
<c:when test="${user.category == 'membre'}>
...
</c:when>
<c:when test="${user.category == 'vip'}>
...
</c:when>
<c:otherwise>
...
</c:otherwise>
</c:choose>
JMF

les pages JSP et la JSTL

Le langage Java

Itration avec la JSTL


La boucle :

<c:forEach var=user items=sessionScope.members>


<c:out value="nom: ${user.name}" />
</c:forEach>

est quivalente :
<%@page import="java.util.*" %>
. . . .
<% Member user = null;
Collection users = session.getAttribute("members");
Iterator it = users.iterator();
while(it.hasNext()){
user = (Member) it.next();
%>
<%= "nom: "+user.getName() %>
<% } %>

Bon, OK, c'est plus lisible !

XVII-72

JMF

les pages JSP et la JSTL

Le langage Java

Les autres bibliothques de la


JSTL
On a des pratiques similaires avec les bibliothques
Formatage des donnes et internationalisation (URI
http://java.sun.com/jstl/xml prfixe conseill x)
Manipulation de XML (URI
http://java.sun.com/jstl/fmt prfixe conseill fmt)
Accs au bases de donnes (URI
http://java.sun.com/jstl/sql prfixe conseill sql)

XVII-73

JMF

les pages JSP et la JSTL

Le langage Java

Bibliographie
JavaServer Pages. Hans Bergsten; ed
O'Reilly. ISBN 1-56592-746-X
Technologie Apache/Tomcat
http://jakarta.apache.org

Tutorial sur la JSTL :


http://onjava.com/pub/a/onjava/2002/08/14/j
stl1.html

XVII-74

JMF

les pages JSP et la JSTL

Le langage Java

Fin

XVII-75

JMF