1.
Structure d'une page JSP
1.1.
Définition et exemples
Une page JSP – Java Server Page – est une page
HTML qui intègre du code Java.
D'un point de vue de la structure, une page
JSP est très proche d'une page PHP ou ASP. Une page JSP est un
fichier qui porte l'extension .jsp.
<%@
page language="java" contentType="text/html;
charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@
page import="java.io.*, java.util.*" %>
<!DOCTYPE
html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Clock page JSP</title>
</head>
<body>
<%
Date today = new Date();
%>
<p>Date et heure :
<%
out.println(today.toString()); %>
</p>
</body>
</html>
ou bien
<%@
page language="java" contentType="text/html;
charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@
page import="java.io.*, java.util.*" %>
<!DOCTYPE
html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Clock page JSP</title>
</head>
<body>
<%
Date today = new Date();
%>
<p>Date et heure :
<%=today.toString()
%>
</p>
</body>
</html>
Nous avons besoin, comme pour d'autres
langages de scripts (ex : PHP), d'indiquer au serveur où commence
et s'arrête le code HTML et le code Java. Pour cela, la
spécification JSP définit des balises qui peuvent être employées
pour délimiter le code. Ces balises permettent de définir
trois catégories d'éléments :
- les directives : informations sur la
page
- les scripts : placement du code Java dans la
page
- les actions : inclusion de code basé sur des
balises dans la page
1.2.
Les directives
Les directives sont des éléments qui
permettent de préciser des informations relatives à la page. Elles
commencent par <%@ et se terminent par %>. Il
existe les trois directives suivantes : page, include
et taglib (non étudiée ici). Une directive n'affecte que la
page jsp qui la contient. Chaque directive inclut le nom de la
directive, suivi des noms et valeurs des attributs.
La directive de page permet de définir
les attributs de la page JSP, comme les importations de classes ou
de paquetages, le type de contenu, l'encodage, la page
invoquée en cas d'erreur …
La directive de page peut être définie
plusieurs fois dans un même document. Il est recommandé de toujours
placer cette directive en tout début de document pour une question
de logique et de lisibilité.
Si aucune directive n'est utilisée dans une
page JSP, le moteur JSP utilisera ses propres paramètres par
défaut, par exemple le type de contenu par défaut est
text/html.
La directive d'inclusion permet
d'inclure le texte d'un fichier dont le nom est donné dans la
directive.
Ex. : <%@ include file="entete.html"
%>
1.3.
Les scripts
Les scripts sont des éléments qui permettent
de placer le code Java dans les pages JSP. Il existe trois types de
scripts :
·
les déclarations : pour
déclarer et/ou initialiser une variable d'instance, ou déclarer une
méthode d'instance
<%!
private string
miseEnFormeMessage(String message)
{
return "<strong class=\"erreur\">" + message +
"</strong>" ;
}
%>
Les déclarations
peuvent être placées à n'importe quel endroit dans une page JSP,
mais il est préférable comme pour les directives, de les placer en
début de fichier.
·
les scriptlets : pour
contenir les instructions Java
Les scriptlets sont
des blocs de code Java incorporés dans une page. L'objet out peut
être utilisé avec la méthode print (ou println) pour générer du
contenu texte à destination du client. Les visiteurs qui invoquent
la page JSP ne pourront pas voir le code Java contenu dans cette
page même s'ils affichent le code source de leur page avec le
navigateur web, ce dernier ne contenant que la sortie générée après
traitement.
<ul>
<%
Enumeration<String> lesNomsParametres =
request.getParameterNames();
while ( lesNomsParametres.hasMoreElements() )
{
String leNom = lesNomsParametres.nextElement() ;
out.println("<li>" + leNom + "</li>");
}
%>
</ul>
Quelques
différences entre scriptlet et déclaration :
·
une scriptlet ne peut être employée pour définir une méthode. Seule
une déclaration le permet.
·
les variables déclarées dans une déclaration sont des variables
d'instance, donc accessibles dans toutes les méthodes et tous les
scriptlets de la page.
·
les expressions : pour
renvoyer des informations aux utilisateurs.
Les expressions
sont utilisées pour renvoyer au client les valeurs d'expressions
Java. Elles sont souvent utilisées comme raccourcis pour simplifier
le code.
Ainsi,
<% out.println(maChaine) ;
%>
est équivalent à
:
<%= maChaine %>
Attention, une
expression ne peut se terminer par un point-virgule.
Dans les parties HTML, les commentaires sont
écrits comme ceci :
<!-- un commentaire
HTML renvoyé au client -->
ou
<%-- un commentaire
JSP qui ne sera pas renvoyé au client --%>
Par contre, il faut utiliser les commentaires
Java // et /* */ dans les scriptlets.
1.4.
Les actions (non étudiées ici)
Les actions sont écrites sous forme d'éléments
XML et permettent de condenser en une seule ligne un traitement qui
serait plus long à écrire à l'aide d'un script Java.
2.
Coopération entre servlet et page JSP
Servlet
|
Page Jsp
|
Primeur à la logique de traitement
|
Primeur à la logique de
présentation
|
Il est possible de respecter les
responsabilités de chacun, logique de traitement aux servlets et
logique de présentation aux pages JSP, car une servlet, une fois
son traitement réalisé et les résultats mémorisés, peut passer le
flux d'exécution à une page JSP.
Extrait
de la classe servlet calculerMontantServlet.java
// appelée sur soumission des données du
formulaire avec prix unitaire HT et quantité
public
void doGet (HttpservletRequest requete, HttpServletResponse
reponse) throws IOException
{
ArrayList<String> erreursAppel = newArrayList<String>();
// lecture et contrôle des données entrées par
l'utilisateur
String strPuHT = requete.getParameterName("txtPuHT");
Double puHT;
if ( strPuHT != null && ! strPuHT.trim().equals("") )
{
try {
puHT = Double.parseDouble(strPuHT);
}
catch ( Exception ex ) {
erreursAppel.add("Prix unitaire doit être numérique");
}
else {
erreursAppel.add("Prix unitaire obligatoire");
}
// idem pour le paramètre txtQte
int qte = 0;
// réalise le calcul du montant HT à payer
double totalHT = qte * puHT ;
// prépare le modèle, càd informations à restituer à
l'utilisateur
// ces informations sont ajoutées en tant qu'attributs
supplémentaires
// à la requête
requete.setAttribute("puHT", puHT) ;
requete.setAttribute("qte", qte) ;
requete.setAttribute("totalHT", totalHT) ;
// transmet le flux d'exécution à la page vueAPayer.jsp
requete.getDispatcher("/WEB-INF/vues/vueAPayer.jsp").forward(requete,
reponse);
}
}
Page
vueAPayer.jsp
Appelée par la servlet
calculerTotalHTServlet.java
<%@
page language="java" contentType="text/html;
charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@
page import="java.io.*, javax.servlet.http.*, java.util.*"
%>
<!DOCTYPE
html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Clock page JSP</title>
</head>
<body>
<p>
Prix
unitaire HT : <%= request.getAttribute("puHT") %><br
/>
Quantité
: <%= request.getAttribute("qte") %><br />
Total
HT à payer : <%= request.getAttribute("totalHT")
%>
</p>
</body>
</html>