Vous êtes sur la page 1sur 30

UNIVERSIT MOHAMMED V

FACULT DES SCIENCES


DEPARTEMENT DINFORMATIQUE

TP : les Java Server Pages (JSP) et les tags

Lobjectif de ce TP est le dveloppement et le dploiement des Java Server


Pages(JSP).
Les Servlets sont parfaites pour la gestion des entres dun formulaire, mais leur code
est difficile crire et lire. Do lutilit des JavaServer pages.

Plan

Dvelopper notre premire JSP


Les objets implicites JSP
JSP et JavaBeans
Rutilisation de contenu JSP
Les balises personnalises
Langage d'Expression unifi

Introduction aux JavaServer Pages


Les servlets ont linconvnient majeur dintgrer du code HTML dans leur code java.
Ce dernier devient trs vite difficile maintenir. Pour surmonter ces limitations, les
Java Server Pages ont t cres dans le but de sparer le contenu statique (cod en
HTML) du contenu dynamique (cod en java).
Dans la plupart des applications web modernes, les servlets sont encore utilises mais
elles destines assumer le rle dun contrleur dans le modle de conception Modle-
Vue-Contrleur MVC. Dans ce mme modle les JSP sont orientes vers le rle de la
vue.
Dvelopper notre premire JSP

Les JSP sont des pages composes dun contenu statique en HTML et dun contenu
dynamique. Le contenu dynamique peut tre gnr en utilisant soit des extraits de
code java appels scriplets ou en utilisant des balises JSP standards ou personnalises.
Considrons le code simple de la page first.jsp suivante qui affiche lheure actuelle
dans le navigateur.

<%@ page language="java" contentType="text/html; charset=UTF-8"


pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Server Date And Time</title>
</head>
<body>
<p>Server date and time: <% out.print(ne w Date()); %>
</p>
</body>
</html>

Aprs avoir cr et dploy un projet web firstjsp contenant la page first.jsp, on dirige
le navigateur vers lURL http://localhost:8080/firstjsp/first.jsp

La date est lheure affiches sont celles du Serveur. Cest le code java entre les
dlimiteurs <% et %> qui a gnr la date et lheure du Serveur. Ce code appel
scriplet a utilis un objet implicite out. Les deux premires lignes de la page jsp
first.jsp sont appeles des directives de la page. Une directive peut avoir plusieurs
attributs comme cest le cas dans lexemple prcdent.

Parmi les attributs de la directive page, on peut citer : contenntType, errorPage, import,
isErrorPage, isThreadSafe, language, pageEncoding, session

Les objets JSP implicites

Les objets implicites sont des objets qui peuvent tre utiliss dans une page jsp sans
ncessiter aucune dclaration ni initialisation. Mais ils sont effectivement dclars et
initialiss par le serveur dapplication lorsque la page jsp est dploye.

Les objets implicites qui peuvent tre utiliss dans une page JSP sont : application,
config, exception, out, page, pageContext, request, response, session.

Lexemple de page JSP (implicitobjects) suivant illustre lutilisation des diffrents


objets implicites de JSP :

<%@ page language="java" contentType="text/html;


charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@page import="java.util.Enumeration"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>Implicit Objects Demo</title>
</head>
<body>
<p>This page uses JSP Implicit objects to attach
objects to the request, session, and application
scopes.<br />
It also retrieves some initialization parameters sent
in the web.xml configuration file.<br />
The third thing it does is get the buffer size from the
implicit response object.<br />
</p>
<p>
<%
application.setAttribute("applicationAttribute", new
String( "This string is accessible across sessions."));
session.setAttribute("sessionAttribute", new String(
"This string is accessible across requests"));
request.setAttribute("requestAttribute", new String(
"This string is accessible in a single request"));
Enumeration initParameterNames =
config.getInitParameterNames();
out.print("Initialization parameters obtained ");
out.print("from the implicit <br/>");
out.println("config object:<br/><br/>");
while (initParameterNames.hasMoreElements())
{
String parameterName = (String)
initParameterNames.nextElement();
out.print(parameterName + " = ");
out.print(config.getInitParameter((String)
parameterName));
out.print("<br/>");
}
out.println("<br/>");
out.println("Implicit object <b>page</b> is of type " +
page.getClass().getName() + "<br/><br/>");
out.println("Buffer size is: " +
response.getBufferSize() + " bytes");
%>
</p>
<p>
<a href="implicitobjects2.jsp">
Click here to continue.
</a>
</p>
</body>
</html>

Cette page JSP utilise la plupart des objets implicites la disposition des
scriptlets JSP. La premire chose qu'elle fait cest dattacher des objets
messages aux objets implicites application, session et request.

Elle obtient alors tous les paramtres d'initialisation de l'objet implicite config
et affiche leurs noms et leurs valeurs sur le navigateur en utilisant l'objet
implicite out. Ensuite, elle affiche l'objet implicite page pleinement nomm.
Enfin, elle affiche la taille du tampon en accdant l'objet implicite response.

Les paramtres dinitialisation pour les JSP (et optionnellement pour les
servlets) sont dclars dans le fichier web.xml. Pour notre application le fichier
web.xml peut prendre la forme suivante :

<?xml version="1.0" encoding="UTF-8"?>


<web-app version="2.4"
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
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>ImplicitObjectsJsp</servlet-name>
<jsp-file>/implicitobjects.jsp</jsp-file>
<init-param>
<param-name>webxmlparam</param-name>
<param-value>
This is set in the web.xml file
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ImplicitObjectsJsp</servlet-name>
<url-pattern>/implicitobjects.jsp</url-pattern>
</servlet-mapping>
</web-app>

Aprs le dploiement d'une JSP, elle est compile et traduite en une servlet lors de sa
premire excution. On peut, alors la traiter comme une servlet dans le fichier
web.xml.
Afin de pouvoir passer les paramtres dinitialisation une JSP, nous devons la traiter
comme une servlet, les paramtres d'initialisation sont placs entre les deux balises
<init-param> et </init-param>. Comme dans le fichier web.xml prcdent, le
paramtre name est plac entre les balises <param-name> et </param-name>, et le
paramtre value est plac entre <param-value> et </param-value>.

Une servlet (et une JSP) peut avoir plusieurs paramtres initialiss, chaque paramtre
doit tre dclare dans une balise <init-param> spare.

Dans le fichier web.xml prcdent, on a dclar une balise servlet mapping pour
notre JSP. Cela tait ncessaire pour permettre au conteneur Web GlassFish de passer
des paramtres d'initialisation la JSP. Comme nous ne voulons pas changer lURL de
notre JSP, nous avons utilis lURL actuelle de notre JSP comme valeur pour la balise
<url-patterm>. Si nous souhaitons accder notre JSP via une autre URL (qui ne fini
pas ncessairement par .jsp), il suffit de mettre lURL dsire dans la balise <url-
pattern>.

Au bas de la page implicitobjects.jsp, il ya un lien hypertexte vers une seconde page


JSP, appele implicitobjects2.jsp. Le code de implicitobjects2.jsp est comme suit:

<%@ page language="java" contentType="text/html;


charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@page import="java.util.Enumeration"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>Sanity Check</title>
</head>
<body>
<p>This page makes sure we can retrieve the
application, session and request attributes set in the
previous page. <br />
</p>
<p>applicationAttribute value is:
<%=application.getAttribute("applicationAttribute")%>
<br />
sessionAttribute value is:
<%=session.getAttribute("sessionAttribute")%>
<br />
requestAttribute value is:
<%=request.getAttribute("requestAttribute")%>
<br />

</p>
<p>
The following attributes were found at the application
scope: <br/><br/>
<%
Enumeration applicationAttributeNames = pageContext
.getAttributeNamesInScope(pageContext.APPLICATION_SCOPE
);
while (applicationAttributeNames.hasMoreElements())
{
out.println(applicationAttributeNames.nextElement() +
"<br/>");
}
%>
</p>
<p><a href="buggy.jsp">This hyperlink points to a JSP
that will throw an exception.</a></p>
</body>
</html>

Dans cette seconde page JSP, on rcupre les objets qui ont t attachs aux
objets implicites application, session et request. Les objets attachs sont
obtenus en appelant la mthode getAttribute() de lobjet implicite
correspondant. Tous les appels de la mthode getAttribute () sont effectus
entre les dlimiteurs <%= et %>. Les extraits de code entre ces dlimiteurs sont
appeles les expressions JSP. Les expressions JSP sont values et leur valeur
de retour est affiche dans le navigateur sans lobligation dappeler la mthode
out.print ().

Cette page JSP rcupre galement les noms de tous les objets attachs la
porte application et les affiche dans la fentre du navigateur.

Au bas de la page JSP prcdente, il ya un lien hypertexte vers une troisime


page JSP. Cette troisime JSP est appele buggy.jsp. Son seul but est de
dmontrer l'attribut errorPage de la directive page, son attribut error, et l'objet
implicite exception.

<%@ page language="java" contentType="text/html;


charset=UTF-8" pageEncoding="UTF-8"
errorPage="error.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>Buggy JSP</title>
</head>
<body>

<p>
This text will never be seen in the browser since the
exception will be thrown before the page renders.
<%
Object o = null;
out.println(o.toString()); //NullPointerException
thrown here.
%>
</p>
</body>
</html>

La seule chose que cette JSP fait cest quelle force une NullPointerException,
qui se traduit par une servlet du conteneur GlassFish, dirigeant l'utilisateur vers
la page dclare comme une page d'erreur dans l'attribut errorPage de la
directive page. Cette page est error.jsp, et son code est comme suit :

<%@ page language="java" contentType="text/html;


charset=UTF-8" pageEncoding="UTF-8"
isErrorPage="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@page import="java.io.StringWriter"%>
<%@page import="java.io.PrintWriter"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>There was an error in the application</title>
</head>
<body>
<h2>Exception caught</h2>
<p>Stack trace for the exception is:<br />
<%
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new
PrintWriter(stringWriter);
exception.printStackTrace(printWriter);
out.write(stringWriter.toString());
%>
</p>
</body>
</html>

Cette page se dclare tre une page d'erreur en dfinissant l'attribut isErrorPage de la
directive page True. Comme cette page est une page d'erreur, il a accs l'objet
implicite exception. Cette page appelle simplement la mthode printStackTrace() de
l'objet implicite exception et envoie sa sortie vers le navigateur via l'objet implicite
out. Dans une application relle, un message d'erreur convivial doit tre affich.

Lapplication prcdente ne se compose que de trois pages JSP, les empaqueter pour le
dploiement consiste simplement mettre tous les JSP dans la racine du fichier WAR
et le fichier web.xml dans son emplacement habituel (le sous-rpertoire WEB-INF
dans le fichier WAR).

Aprs le dploiement et en pointant le navigateur sur :

http://localhost:8080/jspimplicitobjects/implicitobjects.jsp,

On doit voir le rsultat rendu de implicitobjects.jsp dans le navigateur:


Comme on peut le voir, la JSP a un certain nombre de paramtres d'initialisation, en
plus de celui que nous avons dfini dans le fichier web.xml de l'application. Ces
paramtres d'initialisation supplmentaires sont rgls automatiquement par le
conteneur Web GlassFish.

En cliquant sur le lien en bas de la page a nous emmne implicitobjects2.js p:

La valeur de l'attribut request apparat comme nulle. La raison en est que lorsque nous
avons cliqu sur le lien hypertexte sur la page prcdente, une nouvelle requte HTTP
a t cre, par consquent, tous les attributs attachs la requte prcdente ont t
perdus. Si nous avions transmis la requte cette JSP, nous verrons la valeur attendue
sur la fentre du navigateur.

En plus de l'attribut que nous avons attach lobjet application, GlassFish attache
galement dautres attributs pour cet objet implicite.

Enfin, en cliquant sur l'hyperlien en bas de la page, on se dirige vers buggy JSP, qui ne
rpond pas. Et par consquence, le contrle est transfr error.jsp:
On voit la trace de la pile d'exception comme prvu.

JSPs et JavaBeans

Il est trs facile de paramtrer et rcuprer les proprits de JavaBean avec les JSP. Un
JavaBean est un type de classe Java. Pour quune classe se qualifie comme un
JavaBean, elle doit possder les attributs suivants:

Elle doit avoir un constructeur public sans argument.


Ses variables doivent tre accessibles par les mthodes getter et setter.
Elle doit implmenter java.io.Serializable.
Bien que n'tant pas une exigence stricte, c'est une bonne pratique de dclarer
priver tous les attributs du JavaBean.

Tous les exemples de cette section vont utiliser le JavaBean suivant pour illustrer
l'intgration du JavaBean en JSP:

package fsr
public class CustomerBean
{
public CustomerBean()
{
}
String firstName;
String lastName;
public String getFirstName()
{
return firstName;
}
public void setFirstName(String firstName)
{
this.firstName = firstName;
}
public String getLastName()
{
return lastName;
}
public void setLastName(String lastName)
{
this.lastName = lastName;
}
}

Comme on peut le voir, cette classe est considre comme un JavaBean car il rpond toutes
les exigences numres prcdemment. Les noms de mthodes setter et getter suivent une
convention de nommage. Bien que les mthodes de lecture commencent par le mot get
suivi par le nom de la proprit, les mthodes setter commence par le mot set, suivi par le
nom de la proprit. La seule diffrence est que le nom de la proprit est capitalis dans les
noms de mthodes. Il est important de suivre ces conventions pour faire l'intgration des JSP
et JavaBean.

JSP dclarent qu'elles utilisent un JavaBean via la balise <jsp:useBean>. Les proprits
JavaBean sont modifier par la balise <jsp:setProperty> et rcupres via la balise
<jsp:getProperty>.

<%@ page language="java" contentType="text/html;


charset=UTF-8" pageEncoding="UTF-8"%>
<jsp:useBean id="customer" class="fsr.CustomerBean"
scope="page"></jsp:useBean>
<jsp:setProperty name="customer" property="firstName"
value="Albert" />
<jsp:setProperty name="customer" property="lastName"
value="Chan" />
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>JavaBean Properties</title>
11
</head>
<body>
<form>
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td align="right">First Name:&nbsp;</td>
<td>
<input type="text" name="firstName" value='<jsp:getProperty
name="customer" property="firstName"/>'>
</td>
</tr>
<tr>
<td align="right">Last Name:&nbsp;</td>
<td>
<input type="text" name="lastName" value='<jsp:getProperty
name="customer" property="lastName"/>'>
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Submit"></td>
</tr>
</table>
</form>
</body>
</html>

Comme on peut le voir dans cet exemple, la balise <jsp:useBean> est gnralement utilis
avec trois attributs: l'attribut id dfinit un identificateur pour le bean de faon ce que on peut
le rfrer plus tard, l'attribut class spcifie le nom entirement qualifi du bean, et lattribut
scope spcifie la porte du bean. Le bean dans cet exemple a une porte de page. Ce scope est
spcifique JSP et ne peut pas tre utilis avec les servlets. Les Objets dans cette porte ne
peuvent tre accessibles que par la page JSP qui les dclare. Autres valeurs valides pour
l'attribut scope sont application, session, et request. Si un autre attribut que la page est
spcifi, la JSP recherche un objet attach la porte spcifie avec un nom correspondant
l'ID spcifi. S'il le trouve, il l'utilise, sinon, il attache le bean la porte spcifie. Si aucun
champ n'est spcifi, alors le scope d'application par dfaut page. Si l'objet attach n'est pas
une instance de la classe attendue, une ClassCastException est leve.

Les proprits du Bean peuvent tre rgles en utilisant la balise <jsp:setProperty>.


L'attribut name de cette balise identifie le bean pour lequel on modifie la proprit. Sa valeur
doit correspondre la valeur de l'attribut id de la balise <jsp:useBean>. La valeur de l'attribut
property doit correspondre au nom d'une des proprits du bean. L'attribut value dtermine la
valeur attribuer la proprit du bean. Dans les coulisses, la proprit de la mthode setter
est appele par la balise <jsp:setProperty>

12
La balise <jsp:getProperty> a deux attributs: un attribut name et un attribut property.
L'attribut name identifie la bean duquel on va obtenir la valeur. Sa valeur doit correspondre
l'attribut id de la balise <jsp:useBean> du bean. Lattribut property identifie quels sont les
proprits du bean quon veut. Le <jsp:getProperty> invoque la mthode getter
correspondante la proprit spcifie dans son attribut property.

Aprs le paquetage et le dploiement de la JSP prcdente et en pointant le navigateur vers


http://localhost:8080/javabeanproperties/beanproperties1.jsp, on va voir une page comme
celle-ci:

Le formulaire est pr-rempli avec les proprits du bean, comme nous l'avons intgr les
balises l'intrieur <jsp:getProperty> l'attribut value de la balise input HTML.

Dans l'exemple prcdent, la JSP elle-mme dfinit les proprits du bean partir des valeurs
et sont consultes ensuite via la balise <jsp:getProperty>. La plupart du temps, les attributs du
bean sont dfinis partir des paramtres de la requte. Si nous prenons la prcdente JSP et
nous remplaons le fragment de code suivant:

<jsp:setProperty name="customer" property="firstName"


value="Albert" />
<jsp:setProperty name="customer" property="lastName"
value="Chan" />

Avec celui-ci:

<jsp:setProperty name="customer" property="firstName"


param="fNm" />
<jsp:setProperty name="customer" property="lastName"
param="lNm" />

La JSP va remplir les attributs du bean partir des paramtres de la requte. La seule
diffrence entre la JSP modifie et celle prcdente est que lattribut value de la balise
<jsp:setProperty> est remplac par l'attribut param. Lorsque la balise <jsp:setProperty>
possde un attribut param, elle cherche un nom de paramtre correspondant sa valeur. Si
13
elle le trouve, elle affecte la proprit du bean la valeur du paramtre correspondant de la
requte.
Redployant l'application et pointant le navigateur l'adresse
http://localhost:8080/javabeanproperties/beanproperties2.jsp?fNm=Albert&lNm=Chang (en
supposant que la JSP modifie a t enregistre en tant que beanproperties2.jsp) devrait se
traduire par l'affichage d'une page identique la capture d'cran prcdente.

Si les noms des paramtres de la requte correspondent aux noms de proprit du bean, il n'est
pas ncessaire de dfinir explicitement chaque nom de proprit l'attribut requte
correspondant. Il s'agit d'un raccourci qui fixera chaque attribut du bean sa valeur
correspondante dans la requte. Si nous modifions la JSP encore une fois, cette fois pour
remplacer le fragment de code:

<jsp:setProperty name="customer" property="firstName"


param="fNm" />
<jsp:setProperty name="customer" property="lastName"
param="lNm" />

Avec celui-ci:

<jsp:setProperty name="customer" property="*"/>

La balise <jsp:setProperty> va maintenant chercher des noms de paramtres de requte


correspondant aux noms des proprits du bean et affecte les proprits du bean aux
paramtres correspondants de la requte. En pointant le navigateur
http://localhost:8080/javabeanproperties/beanproperties3.jsp?firstName=Albert&lastName=C
hang (en supposant que la JSP Modifie a t enregistre en tant que beanproperties3.jsp),
nous devrions voir une fois de plus une page comme celle de la capture d'cran prcdente
affiche dans le navigateur. Dans ce cas, les noms de paramtres de la requte correspondent
aux noms des proprits du bean.

Les exemples de cette section traitent exclusivement avec des proprits de type chane de
caractres, les techniques dmontres ici marchent aussi avec des proprits de type
numriques. Les valeurs de la requte ou dans la balise <jsp:setProperty> sont
automatiquement convertie au type appropri.

Rutilisation de contenu JSP


La plupart des pages web des applications Web contiennent certaines zones qui sont
identiques pour toutes les pages. Par exemple, chaque page peut afficher un logo de
l'entreprise au sommet ou un menu de navigation. Copier et coller le code pour gnrer ces
espaces communs n'est pas trs maintenable, parce que si un changement doit tre effectu
l'un de ces espaces, le changement doit tre tal sur chaque page.

Lors de l'utilisation des JSP pour dvelopper une application web, il est possible de dfinir
chacun de ces espaces dans une seule JSP, ensuite inclure cette JSP dans les autres JSP
lutilisant. Par exemple, nous pourrions avoir une JSP qui rend le menu de navigation du site,
alors toutes les autres JSP incluent cette JSP pour rendre le menu de navigation. Si le menu de

14
navigation doit tre modifi, le changement ne doit tre fait qu'une seule fois. Les JSP qui
incluent la JSP menu de navigation n'ont pas besoin d'tre changes.

Il y a deux faons avec lesquelles une page JSP peut tre incluse dans un autre JSP. Elle peut
le faire via la balise <jsp:include> ou via la directive include.

L'exemple suivant illustre l'utilisation de la directive include pour inclure une JSP comme une
partie d'une JSP parente (main.jsp):

<%@ page language="java" contentType="text/html"


pageEncoding="UTF-8"%>
<%! String pageName = "Main"; %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>Main Page</title>
</head>
<body>
<table cellpadding="0" cellspacing="0" border="1"
width="100%" height="100%">
<tr>
<td width="100">
<%@ include file="navigation.jspf"%>
</td>
<td>This is the main page.</td>
</tr>
</table>
</body>
</html>

Comme on peut le voir dans cet exemple, la directive include est trs simple utiliser. Il faut
un seul attribut appel file, la valeur de cet attribut est le fichier inclure.

Le fichier inclus dans l'exemple a une extension jspf. Il s'agit de lextension recommande
pour les fragments JSP, qui ne rendent pas un rsultat dans page HTML approprie.

La ligne : <%! String pageName = "Main"; %> est une dclaration JSP. Toutes les variables
(ou mthodes) dclares dans une dclaration JSP sont disponibles pour la JSP les dclarant
et pour toutes les pages JSP incluses via la directive include.

Le code et le balisage pour navigation.jspf est comme suit:

<b>Application Menu</b>
<ul>
<li/> <a href="main.jsp">Main</a>
<li/> <a href="secondary.jsp">Secondary</a>

15
</ul> Current page: <%= pageName %>

Le fragment navigation.jspf accde la variable pageName dclare dans la JSP parente


(toute JSP incluant navigation.jspf doit dclarer une variable appele pageName).

Il y a un troisime fichier appel secondary.jsp. Ce fichier est presque identique main.jsp.


Les seules diffrences entre main.jsp et secondary.jsp sont les valeurs de la variable
pageName, le titre de page, et le texte l'intrieur de la seconde cellule dans la table.

Aprs lempaquetage et le dploiement de ces fichiers dans un fichier WAR et en pointant le


navigateur vers http://localhost:8080/jspcontentreuse/main.jsp, nous devrions voir une page
comme celle-ci:

Le menu sur le ct gauche est rendu par navigation.jspf. L'espace principal est rendu par
main.jsp. En cliquant sur le lien hypertexte marqu secondaire, on va se rendre sur la page
secondaire, qui est pratiquement identique la page principale.

Les fichiers JSP incluses via une directive page sont inclus au moment de la compilation,
c'est dire lorsque notre JSP se traduit en une servlet. C'est la raison pour laquelle les JSP
incluses ont accs aux variables dclares dans la JSP parente.

Lorsquon utilise la balise <jsp:include>, la JSP incluse est ajoute lors de l'excution. Par
consquent, elle n'a pas accs une variable dclare dans la JSP parente.

La balise <jsp:include> a deux attributs: un attribut de page qui dfinit la page inclure et un
attribut optionnel flush qui dtermine si le tampon existant devrait tre vid avant la lecture de
la JSP incluse. L'attribut flush a deux possibles valeurs True ou False; par dfaut cest False.

16
Les JSP prcdentes peuvent facilement tre modifies en utilisant la balise <jsp:include>. Il
suffit de remplacer la directive include par la balise <jsp:include>, et bien sr, supprimer
l'expression JSP de navigation.jspf.

Les balises personnalises JSP

La technologie JSP permet aux dveloppeurs de logiciels de crer des balises personnalises.
Les balises personnalises peuvent tre utilises dans une page JSP avec les balises HTML
standards. Il y a plusieurs faons de dvelopper des balises personnalises. Dans cette section,
nous allons tudier deux moyens les plus populaires: hriter de la classe
javax.servlet.jsp.tagext.SimpleTagSupport et la cration d'un fichier de tag.

Hriter de SimpleTagSupport

Une faon avec laquelle on peut crer des balises JSP est dhriter de la classe
javax.servlet.jsp.tagext.SimpleTagSupport. Cette classe fournit des implmentations par
dfaut de toutes les mthodes de l'interface javax.servlet.jsp.tagext.SimpleTag. Ainsi que
quelques mthodes nont dfini dans cette interface. Pour crer une balise personnalise, avec
cette premire approche, il suffit de redfinir la mthode SimpleTagSupport.doTag().

Illustrons cette approche par un exemple. La plupart des formulaires HTML ont un tableau
intgr contenant plusieurs lignes de labels et des champs de saisie. Nous allons crer une tag
personnalise qui va gnrer chacune de ces lignes (pour simplifier, notre Tag va gnrer
seulement des champs de texte):

package customtags;
import java.io.IOException;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class LabeledTextField extends SimpleTagSupport
{
private String label;
private String value = "";
private String name;
@Override
public void doTag() throws JspException, IOException
{
JspContext jspContext = getJspContext();
JspWriter jspWriter = jspContext.getOut();
jspWriter.print("<tr>");

17
jspWriter.print("<td>");
jspWriter.print("<b>");
jspWriter.print(label);
jspWriter.print("</b>");
jspWriter.print("</td>");
jspWriter.print("<td>");
jspWriter.print("<input type=\"text\" name=\"");
jspWriter.print(name);
jspWriter.print("\" ");
jspWriter.print("value=\"");
jspWriter.print(value);
jspWriter.print("\"");
jspWriter.print("/>");
jspWriter.print("</td>");
jspWriter.println("</tr>");
}

public String getLabel()


{
return label;
}
public void setLabel(String label)
{
this.label = label;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getValue()
{
return value;
}
public void setValue(String value)
{
this.value = value;
}
}

Cette classe se compose d'une version redfinie de la mthode doTag() et plusieurs attributs.
Notre mthode doTag() obtient une rfrence sur une instance de javax.servlet.jsp.JspWriter
par le mthode getJSPContext (). Cette mthode est dfinie dans la classe parente de la balise
et retourne une instance de type javax.servlet.jsp.JspContext. On a ensuite appel la mthode
18
GetOut() de JspContext. Cette mthode renvoie une instance de javax.servlet.jsp.JspWriter
qui peut tre utilise pour envoyer la sortie vers le navigateur via print () et println (). Le
reste de la mthode doTag() envoie la sortie au navigateur via ces deux mthodes.

Certains appels de jspWriter.print() dans la mthode doTag() prennent des variables


d'instances comme paramtres. Ces attributs sont dfinis par la JSP contenant la balise via un
fichier de description Tag Library Descriptor.
Afin de pouvoir utiliser des balises personnalises dans nos pages JSP, un fichier de
description Tag Library Descriptor (TLD) : (demotags.tld) doit tre cr dans WEB-INF.
<taglib xsi:schemaLocation="http://java.sun.com/xml/ns/
javaee web-jsptaglibrary_2_1.xsd"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.1">
<tlib-version>1.0</tlib-version>
<uri>DemoTagLibrary</uri>
<tag>
<name>labeledTextField</name>
<tag-class>
customtags.LabeledTextField
</tag-class>
<body-content>empty</body-content>
<attribute>
<name>label</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>value</name>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>

Un fichier TLD doit contenir un lment <tlib-version>, ce qui indique la version de


bibliothque de balises. Il doit aussi contenir un lment <uri>. L'lment <uri> est utilis
dans la JSP contenant le tag. Il est utilis pour identifier de manire unique la bibliothque
de balises. Enfin, et plus important, un fichier TLD doit contenir un ou plusieurs lments
<tag>.

19
Une fois quon le code des tags et les TLD, on est prt les utiliser dans une
JSP(customtagdemo1.jsp) :

<%@ page language="java" contentType="text/html;


charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="d" uri="DemoTagLibrary"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>Custom Tag Demo</title>
</head>
<body>
<form>
<table>

<d:labeledTextField label="Line 1" name="line1" value="This


is line 1"></d:labeledTextField>
<d:labeledTextField label="Line 2" name="line2">
</d:labeledTextField>
<d:labeledTextField label="City" name="city">
</d:labeledTextField>
<d:labeledTextField label="State" name="state">
</d:labeledTextField>
<d:labeledTextField label="Zip" name="zip">
</d:labeledTextField>
<tr>
<td></td>
<td><input type="submit" value="Submit"></td>
</tr>
</table>
</form>
</body>
</html>

Aprs le dploiement de la JSP, le code du tag personnalis, et le fichier TLD dans un fichier
WAR et son dploiement, la prcdente JSP doit rendre dans le navigateur la capture d'cran
suivante:

20
Uniquement le premier champ text est pr-rempli. Car cest le seul pour lequel, on a affect
une valeur.

La page HTML gnre partir de notre JSP est comme suit :

<table>
<tr>
<td><b>Line 1</b></td>
<td><input type="text" name="line1" value="This is line
1"/></td>
</tr>
<tr>
<td><b>Line 2</b></td>
<td><input type="text" name="line2" value=""/></td>
</tr>
<tr>
<td><b>City</b></td>
<td><input type="text" name="city" value=""/></td>
</tr>
<tr>
<td><b>State</b></td>
<td><input type="text" name="state" value=""/></td>
</tr>
<tr>

<td><b>Zip</b></td>
<td><input type="text" name="zip" value=""/></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Submit"></td>
21
</tr>
</table>

Utiliser un fichier de balises pour crer des balises personnalises JSP

Une autre faon de crer des balises personnalises JSP est d'utiliser les fichiers de
balises. Cette mthode ne ncessite pas lcriture du code Java.

Un fichier de balises est trs similaire une page JSP. Les noms des fichiers de balises ont
lextension .tag et doivent tre placs dans un sous-rpertoire appel tags dans le rpertoire
WEB-INF. Le fichier de balises suivant address.tag gnre un champ de saisie dune adresse
:

<%@ tag language="java"%>


<%@ attribute name="addressType" required="true"%>
<jsp:useBean id="address" scope="request"
class="customtags.AddressBean" />
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td align="right" width="70"><b>Line 1</b>&nbsp;</td>
<td><input type="text" name="${addressType}_line1" size="30"
maxlength="100" value="${address.line1}"></td>
</tr>
<tr>
<td align="right"><b>Line 2</b>&nbsp;</td>
<td><input type="text" name="${addressType}_line2" size="30"
maxlength="100" value="${address.line2}"></td>
</tr>
<tr>
<td align="right"><b>City</b>&nbsp;</td>
<td><input type="text" name="${addressType}_city" size="30"
value="${address.city}"></td>

</tr>
<tr>
<td align="right"><b>State</b>&nbsp;</td>
<td>
<select name="${addressType}_state">
<option value=""></option>
<option value="AL" <% if(address.getState().equals("AL"))
out.print (" selected "); %>>Alabama</option>
<option value="AK" <% if(address.getState().equals("AK"))
out.print (" selected "); %>>Alaska</option>
<option value="AZ" <% if(address.getState().equals("AZ"))
out.print (" selected "); %>>Arizona</option>

22
<option value="AR" <% if(address.getState().equals("AR"))
out.print (" selected "); %>>Arkansas</option>
<option value="CA" <% if(address.getState().equals("CA"))
out.print (" selected "); %>>California</option>
<option value="CO" <% if(address.getState().equals("CO"))
out.print (" selected "); %>>Colorado</option>
<option value="CT" <% if(address.getState().equals("CT"))
out.print (" selected "); %>>Conneticut</option>
<option value="DC" <% if(address.getState().equals("DC"))
out.print (" selected "); %>>District of Columbia </option>
<option value="FL" <% if(address.getState().equals("FL"))
out.print (" selected "); %>>Florida</option>
</select>
</td>
</tr>
<tr>
<td align="right"><b>Zip</b>&nbsp;</td>
<td><input type="text" name="${addressType}_zip" size="5"
value="${address.zip}"></td>
</tr>
</table>

Comme on peut le voir dans l'exemple, un fichier de balises est trs similaire un fichier
JSP. Tout comme une page JSP, il peut contenir des scriptlets, dfinir et obtenir des proprits
dun JavaBean. Une diffrence entre les fichiers de balises et les JSP, c'est que les fichiers de
balises utilisent une directive tag au lieu d'une directive de page. Lattribut le plus
couramment utilis de la directive tag est l'attribut import, comme dans la directive page de
JSP, est utilis pour importer des classes ou packages utiliser dans le fichier de balises.

Les fichiers de balises peuvent avoir une directive attribute qui gnre un attribut qui peut
tre fix par le fichier JSP parent. L'exemple prcdent cre un attribut required appel
AddressType.
La valeur de l'attribut name de chaque champ de saisie dans le fichier de balises de lexemple
contient du texte de type : ${addressType}_line1. La premire partie de cette chane
(${addressType}) est une notation spciale pour obtenir la valeur de lattribut
addressType. Cette notation peut galement tre utilise pour obtenir des valeurs des
proprits du JavaBean. La syntaxe d'obtenir des proprits du JavaBean en utilisant cette
notation est ${<nom du bean>.<nom de proprit>}. Lattribut value de chaque champ de
saisie dans lexemple prcdent utilise cette notation pour obtenir la valeur d'une proprit du
bean address. Le bean address est un simple JavaBean qui dclare ces attributs comme
prives et utilisant des mthodes getters et setters pour les manipuler.

Comme on peut le voir dans l'exemple, les fichiers de balises peuvent contenir des
scriptlets. Les scriptlets dans lexemple comparent la valeur de l'attribut dans le bean celle
de chaque lment slectionn, puis dfinissent l'lment appropri slectionner.

23
Un tag personnalis a t dfini dans un fichier de balises est presque identique au tag dfini
en utilisant le code Java (customtagdemo2.jsp ):

<%@ page language="java" contentType="text/html;


charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="ct" tagdir="/WEB-INF/tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<meta http-equiv="Content-Type" content="text/html;


charset=UTF-8">
<title>Custom Tag Demo</title>
</head>
<body>
<form>
<h3>Shipping Address</h3>
<ct:address addressType="shipping" />
</body>
</html>

La directive taglib est utilise pour importer la bibliothque de balises dans la JSP. Toutefois,
dans ce cas, au lieu d'utiliser un attribut uri, un attribut tagdir est utilis pour indiquer
l'emplacement de la bibliothque de balises. Tous les fichiers de balises situs dans le mme
rpertoire font implicitement partie d'une bibliothque de balises; aucun fichier TLD nest
ncessaire. Cependant, il est possible d'ajouter un TLD pour une bibliothque de balises
compose de fichiers de balises. Le TLD pour une telle bibliothque de balises doit tre
nomm implicit.tld et il doit tre plac dans le mme rpertoire que les fichiers de balises
(WEB-INF/tags; les bibliothques de balises doivent tre places dans ce rpertoire ou dans
tout sous-rpertoire du rpertoire tags).

Pour que la prcdente JSP fonctionne correctement, une instance de


customtags.AddressBean doit tre attache la requte.

La servlet (CustomTagDemoServlet.java) suivante crera une instance de cette


classe. Remplira certains champs et transmettra la requte la JSP prcdente.

package customtags;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CustomTagDemoServlet extends HttpServlet
{
@Override

24
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
{
AddressBean addressBean = new AddressBean();
addressBean.setLine1("43623 Park Ridge Ct");
addressBean.setCity("Orlando");
addressBean.setState("FL");
addressBean.setZip("00303");

request.setAttribute("address", addressBean);
try
{
request.getRequestDispatcher("customtagdemo2.jsp").forward
(request,response);
}
catch (ServletException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}

Bien sr, une application relle doit obtenir cette information partir d'une base de
donnes. Cet exemple simple instancie simplement le bean et le remplit avec certains attributs
arbitraires.

Aprs lempaquetage de cette JSP et du fichier de balises dans un fichier WAR, le


dploiement du fichier WAR, et en pointant le navigateur vers l'URL de la servlet (tel que
dfini dans la balise <servlet-mapping> du fichier web.xml :

<?xml version="1.0" encoding="UTF-8"?>


<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema- instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>CustomTagDemo</servlet-name>
<servlet-class>
customtags.CustomTagDemoServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CustomTagDemo</servlet-name>

25
<url-pattern>/customtagdemo</url-pattern>
</servlet-mapping>
</web-app>
En pointant sur http://localhost:8080/customtags/customtagdemo, On doit voir une page
comme celle-ci:

Langage d'Expression unifi

Dans la section prcdente, nous avons vu comment le langage d'expression unifi peut tre
utilis pour rcuprer les valeurs des proprits des JavaBeans. Lorsque les proprits des
JavaBeans sont accessibles, le conteneur Web cherche un JavaBean attach avec un nom
donn soit la page, la request, la session ou l'application, dans cet ordre. Il utilise la
premire porte quil rencontre et invoque la mthode getter correspondante la proprit
quon souhaite obtenir.

Si on sait quelle porte le bean est attach, on peut lobtenir directement partir de celle-ci,
puisque les expressions JSP ont accs aux objets implicites. Dans lexemple suivant, on
attache plusieurs instances d'un JavaBean appel CustomerBean aux diffrentes
portes. Avant d'illustrer la JSP, on jette un coup dil sur le code source pour du bean:

package unifiedexprlang;
public class CustomerBean
{
public CustomerBean()
{
}
public CustomerBean(String firstName, String lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}

26
private String firstName;
private String lastName;
public String getFirstName()
{
return firstName;
}
public void setFirstName(String firstName)
{
this.firstName = firstName;
}
public String getLastName()
{
return lastName;
}
public void setLastName(String lastName)
{
this.lastName = lastName;
}
@Override
public String toString()
{
StringBuffer fullNameBuffer = new StringBuffer();
fullNameBuffer.append(firstName);
fullNameBuffer.append(" ");
fullNameBuffer.append(lastName);
return fullNameBuffer.toString();
}
}

Il s'agit d'un JavaBean assez simple compos de deux proprits et leurs mthodes setters et
getters correspondantes. Pour que cette classe se qualifie comme tant un JavaBean, elle doit
avoir un constructeur public sans argument. En plus de ce constructeur, on a ajout un
constructeur avec deux paramtres pour initialiser les proprits du bean. En outre, la classe
redfinie la mthode toString() de sorte que sa sortie affiche le nom et le prnom du client.

La JSP (exprlang.jsp) suivante obtient les instances de CustomerBean partir des


diffrentes portes travers le langage d'expression unifi et affiche la sortie correspondante
dans la fentre du navigateur:

<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF -
8" pageEncoding="UTF-8"%>
<jsp:useBean scope="page" id="customer6"
class="unifiedexprlang.CustomerBean" />
<jsp:setProperty name="customer6" property="firstName"
value="David" />
<jsp:setProperty name="customer6" property="lastName"
value="Heffelfinger" />

27
<jsp:useBean scope="application" id="customer1"
class="unifiedexprlang.CustomerBean" />
<jsp:setProperty name="customer1" property="firstName"
value="James" />
<jsp:setProperty name="customer1" property="lastName"
value="Jones" />

<jsp:useBean scope="session" id="customer2"


class="unifiedexprlang.CustomerBean" />
<jsp:setProperty name="customer2" property="firstName"
value="Carlos" />
<jsp:setProperty name="customer2" property="lastName"
value="Perez" />

<jsp:useBean scope="request" id="customer3"


class="unifiedexprlang.CustomerBean" />
<jsp:setProperty name="customer3" property="firstName"
value="Moesha" />
<jsp:setProperty name="customer3" property="lastName"
value="Williams" />
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>Unified Expression Language Demo</title>
</head>
<body>
Customer attached to the application Scope:
${applicationScope.customer1}
<br />
<br />
Customer attached to the session scope:
${sessionScope.customer2.firstName}
${sessionScope.customer2.lastName}
<br />
<br /> Customer attached to the request scope:
${requestScope.customer3}
<br />
<br />
Customer attached to the page scope:
${pageScope.customer6}

28
<br />
<br />
List of customers attached to the session:
<%! ArrayList customerList = new ArrayList();%>

<% customerList.add(customer1);
customerList.add(customer2);
customerList.add(customer3);
session.setAttribute("customerList", customerList);
%>
<br />
${sessionScope.customerList[0]}
<br />
${sessionScope.customerList[1].firstName}
${sessionScope.customerList[1].lastName}
<br />
<br />
</body>
</html>
La premire ligne mis en vidence dans cette JSP cherche un bean attach la porte
application, avec un nom de customer1. Seule la mthode toString() du bean est appele.

Les deux prochaines lignes cherchent un bean attach la porte session avec un nom
custumer2. Dans ce cas, on a accs aux proprits individuelles. La premire ligne accde la
proprit prnom et la deuxime ligne accde au nom.

Les deux autres prochaines lignes obtiennent des instances de CustomerBean attach aux
portes request et page respectivement. Seule la mthode toString() est appele puisquon na
pas accs aux proprits.

Les trois dernires lignes illustrent une caractristique trs intressante du langage
d'expression unifie. Dans ce cas, les instances de CustomerBean ne sont pas attaches
directement la porte session. Au lieu de cela, un ArrayList contenant des CustomerBean a
t attach la session. Cet ArrayList a t attach avec un nom customerList. Ainsi, on peut
accder aux lments individuels de l'ArrayList. Cette technique fonctionne galement pour
toute classe implmentant l'interface java.util.Collection.

Aprs son dploiement, et en pointant le navigateur vers l'URL approprie, on doit voir
laffichage de :

29
30

Vous aimerez peut-être aussi