Java EE – Les pages JSP
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 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" %>
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.
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.
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>