Afin de simplifier l'utilisation des scriptlets, l'API JSP introduit la notion de bean attaché à une page. Un bean attaché à une page se comporte comme une variable que l'on peut utiliser en tout endroit de cette page. Ce bean est attaché à un contexte, qui peut être la page, la requête, la session ou l'application. Enfin ce bean peut être un bean existant, ou créé dans le cadre même de la page.
Rappelons qu'un bean est un objet Java simple, qui doit posséder les propriétés suivantes :
il doit implémenter Serializable
;
il doit posséder un constructeur vide, soit celui qui existe par défaut, soit déclaré explicitement ;
il doit exposer des propriétés, sous forme de paires getters / setters.
Un bean est déclaré en utilisant le tag <jsp:userBean>
. Cette déclaration
permet d'associer un nom à un bean. Ce nom peut être ensuite utilisé dans la page, comme s'il
s'agissait d'un champ normal.
Exemple 5.11. Déclaration d'un bean dans une page
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <jsp:useBean id="marin" beanName="marin" scope="request" type="org.paumard.cours.model.Marin"/> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <p>Using <%=marin%> ; </p> </body> </html>
La déclaration précédente comporte plusieurs éléments, sous forme d'attributs XML :
id
: désigne le nom du champ qui porte la référence à ce bean. Ici marin
.
beanName
: la présence de cet attribut indique que l'on utilise un bean
qui a été créé par ailleurs. Ce bean doit se trouver sur l'un des contextes définis dans l'API
servlet : la page, la requête, la session ou l'application. La valeur de cet attribut donne
la clé à laquelle ce bean a été associé, par invocation d'une méthode
setAttribute(beanName, ...)
.
scope
: attribut qui indique le contexte dans lequel le bean existe. Cet
attribut peut prendre les valeurs page
, request
, session
ou
application
. Dans le cas d'un bean existant, ce contexte doit obligatoirement
être précisé. Le moteur de JSP ira chercher ce bean dans le contexte indiqué, par invocation
d'une méthode getAttribute()
.
type
: cet attribut indique la classe du bean déclaré. Cette classe doit bien
sûr être connue de l'application Web. Dans notre exemple, on affiche simplement ce bean
dans la page. Sa méthode toString()
sera automatiquement appelée.
Une fois ce bean déclaré, il peut être utilisé le corps de la page JSP, comme indiqué sur l'exemple.
La création d'un nouveau bean suit un processus légèrement différent. Tout d'abord, on ne déclare
pas l'attribut beanName
, qui indique que le bean doit exister dans un contexte donné
par l'attribut scope
. Ensuite, plutôt que d'indiquer la classe de ce bean dans l'attribut
type
, on le déclare dans l'attribut class
.
Dans ce cas, le moteur de JSP crée ce bean, et le range en tant qu'attribut du contexte indiqué
dans l'attribut scope
.
On peut enfin préciser les valeurs des propriétés de ce bean de ceux façons :
explicitement, en utilisant une valeur dans l'attribut value
de l'élément
setProperty
;
en l'associant à une valeur présente dans les paramètres de la requête, en utilisant
l'attribut param
de l'élément setProperty
.
Voyons tout ceci sur un exemple.
Exemple 5.12. Création d'un bean dans une page
<jsp:useBean id="marin" scope="page" class="org.paumard.cours.model.Marin"> <jsp:setProperty name="marin" property="nom" value="Surcouf"/> <jsp:setProperty name="marin" property="prenom" param="prenom"/> <jsp:setProperty name="marin" property="age" param="age"/> </jsp:useBean>
Dans ce deuxième exemple, on crée un bean de type Marin
, et on l'associe au nom
de champ marin
. Le contexte de ce bean est la page, il ne sera donc pas disponible
ailleurs que dans cette page. En particulier, si cette page fait appel à d'autres pages, ou à
d'autres servlets, ces autres éléments n'auront pas accès à ce bean.
Les trois propriétés nom
, prenom
et age
de ce bean
sont fixées par les sous-éléments setProperty
. Ces sous-élements prennent en attribut :
name
: le nom du bean, tel que déclaré dans l'attribut id
de l'élément
useBean
.
property
: le nom de la propriété que l'on fixe. Il doit exister un
setter associé.
value
: si cet attribut est précisé, alors la propriété prendra la valeur indiquée.
param
: si cet attribut est utilisé, alors la propriété prendra la valeur
du paramètre de la requête donc le nom est indiqué. Cela permet de créer directement
un pont entre les paramètres présents sur la requête et les propriétés d'un bean.
Jusqu'à présent nous avons utilisé des éléments de scripts entre les tags JSP particuliers
<%=
et >
. On peut utiliser une syntaxe plus légère, comme dans
l'exemple suivant.
Exemple 5.13. Lecture d'une propriété
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <jsp:useBean id="marin" beanName="marin" scope="session" type="org.paumard.cours.model.Marin"/> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <p>Nom = ${marin.nom}</p> </body> </html>
Cette syntaxe consiste à référencer un bean par son nom dans la page (valeur de l'attribut
id
de l'élément useBean
qui a servi à le déclarer), et à
indiquer la propriété que l'on veut exploiter en utilisant le séparateur .
. Le
tout doit être mis entre accolades, et précédé par le caractère $
.
Dans ce cas, la propriété sera affichée dans la page. Si elle est non nulle, alors le moteur de JSP
utilisera sa méthode toString()
.