Écrivons une première page JSP simple.
Exemple 5.1. Une première page JSP simple
<!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>Une première JSP</title> </head> <body> <h1>Bonjour le monde !</h1> </body> </html>
Cette page peut être sauvegardée dans un fichier bonjour.jsp
, et rangée à la racine
de notre application web. On y accède par l'URL de cette application web, à laquelle il suffit
d'ajouter le nom du fichier : bonjour.jsp
.
Nous avons donc partiellement résolu notre problème : nous n'avons plus à écrire du code HTML dans du code Java pour produire nos pages web. Cela dit, les JSP proposent de nombreuses fonctionnalités supplémentaires.
Incluons le code suivant à notre page.
On observe cette fois-ci un affichage qui ressemble à ça :
Il est Thu Oct 28 14:00:58 CEST 2010
Il est possible d'inclure des variables Java dans une page JSP, en les plaçant entre les marqueurs
<%=
et %>
. Ce code Java est alors invoqué, et le résultat placé
dans la réponse.
Voyons un dernier exemple, qui nous permet d'écrire trois fois "Bonjour le monde" sans effort.
Exemple 5.3. Une deuxième JSP dynamique
<p>Trois fois <br> <% for (int i = 0 ; i < 3 ; i++) { %> Bonjour le monde ! <br> <% } %> sans effort !</p>
Le tag ouvrant utilisé ici est légèrement différent : <%
. Il indique que la suite
est du code Java, qui doit être exécuté en l'état. D'où l'affichage :
Trois fois Bonjour le monde ! Bonjour le monde ! Bonjour le monde ! sans effort !
Comment tout ceci fonctionne-t-il ? Si l'on explore l'arborescence de Tomcat (ou d'un projet Eclipse
ou Netbeans, si l'on travaille avec l'un de ces deux IDE), on se rend compte de la présence de
deux fichiers : index_jsp.java
et index_jsp.class
. Dans une installation
standard de Tomcat, ces deux fichiers sont dans la sous-arborescence du répertoire work
.
Le premier fichier index_jsp.java
contient le code d'une servlet classique, dans laquelle
on trouve le code suivant :
Exemple 5.4. Génération d'une servlet à partir d'une JSP
out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n"); out.write(" \"http://www.w3.org/TR/html4/loose.dtd\">\n"); out.write("\n"); out.write("<html>\n"); out.write(" <head>\n"); out.write(" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n"); out.write(" <title>JSP Page</title>\n"); out.write(" </head>\n"); out.write(" <body>\n"); out.write(" <h1>Bonjour le monde !</h1>\n"); out.write(" </body>\n"); out.write("</html>\n");
Pour chaque page JSP, Tomcat génère automatiquement une servlet, dans laquelle se trouve le code que l'on aurait eu à écrire pour générer le contenu HTML de notre page. Cette servlet est ensuite compilée, et publiée sous le nom de notre page JSP. C'est bien cette servlet qui nous répond quand on invoque l'URL "index.jsp".
Chaque modification de notre page JSP est détectée par Tomcat, qui reprend la génération de ce code Java et sa compilation. Ce traitement est donc un surcoût sur la première requête.
Observons le nouveau code généré lorsque nous avons ajouté <%= new java.util.Date()%>
dans notre JSP. On ne reproduit ici que le contenu de la balise <h1>
Exemple 5.5. Modification du code généré - 1
out.write("<h1>Bonjour le monde !"); out.print(new java.util.Date() ); out.write("</h1>\n");
On constate bien que le contenu de la balise <%= ... %>
a été ajouté en
paramètre des appels à out.write()
.
Observons enfin la modification du code généré lorsque nous avons ajouté notre boucle.
Exemple 5.6. Modification du code généré - 2
out.write("<p>Trois fois <br>\n"); for (int i = 0 ; i < 3 ; i++) { out.write("\tBonjour le monde ! <br>\n"); } out.write("sans effort</p>\n");
Cette fois, le contenu du code Java placé dans les balises <% ... %>
a été
recopié sans modification dans le code de la servlet. C'est ainsi que ces deux balises fonctionnent.