Académique Documents
Professionnel Documents
Culture Documents
Plan
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.
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 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.
<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 :
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>.
</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.
<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 :
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).
http://localhost:8080/jspimplicitobjects/implicitobjects.jsp,
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:
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>.
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.
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.
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:
Avec celui-ci:
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:
Avec celui-ci:
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.
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):
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.
<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 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.
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>");
}
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.
19
Une fois quon le code des tags et les TLD, on est prt les utiliser dans une
JSP(customtagdemo1.jsp) :
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.
<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>
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
:
</tr>
<tr>
<td align="right"><b>State</b> </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> </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 ):
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).
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.
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:
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.
<%@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" />
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