Chapitre 4
JavaServer Pages
emna.kallel@enetcom.usf.tn
EmnaKALLEL
Problème d'une Servlet :
HTML dans Java
2
1. C‟estlaid!
out.println(docType);
out.println("<html>");
out.println("<head>n<title>Clock</title>n</head>");
out.println("<body>n"+
"<h1>Time on server</h1>n"+
"<p>"+ today+"</p>n"+
"</body>");
out.println("</html>");
2. Difficile de séparer les différentes tâches du
développement (Web code vs. Business code)
Solution : Java dans HTML
3
• Une JSP est identique à une page HTML
dans laquelle on peut ajouter du code Java
(même principe qu'avec PHP)
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Clock</title>
</head>
<body>
<h1>Time on server</h1>
<p> <%= new java.util.Date() %> </p>
</body>
</html>
JSP
• Les servlets facilitent le traitement avec java
des requêtes et réponses HTTP, mais
ils ne sont pas appropriés à l‟écriturede codeHTML
– out.println("<html><head><title>"+title+"</title>…");
• Les JSP permettent d‟intégrerdu code java
dans une page HTML
– <h1>Time on server</h1>
<p><%= new java.util.Date() %></p>
MyJSP.jsp MyJSP_jsp.java MyJSP_jsp.class obj:MyJSP_jsp
traduit en
• Mais au final une JSP n’est qu’une servlet
chargé et initialisé
en tant que
compilé en
Automatiquement géré par le conteneur 4
2.
Clock.jsp
Une JSP en1 étape
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Clock</title>
</head>
<body>
<h1>Time on server</h1>
%> </p>
<p> <%= new java.util.Date()
</body>
</html>
webapps
<html>
...
...
...
</html>
• Ecrire une JSP Clock.jsp
et la mettre dans webapps
(le répertoire de notre application Web)
5
• Servlet généré par Tomcat
public final class Clock_jsp
extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent{
public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws java.io.IOException, ServletException{
response.setContentType("text/html");
JspWriter out = response.getWriter();
// ...
out.write("<h1>Time on server</h1>rn");
out.write("<p>");
out.print( new java.util.Date() );
out.write("</p>rn");
// ...
}
Correspondance JSP/Servlet
• JSP d‟origine
<h1>Time on server</h1>
<p><%= new java.util.Date() %></p>
7
Syntaxe de base
• Texte HTML
– <h1>Blah</h1>
– Passé au client. Réellement traduit en servlet par le code
• out.print("<h1>Blah</h1>");
• Commentaires HTML
– <!-- Commentaire -->
– Pareil que les autres éléments HTML: passés au client
• Commentaires JSP
– <%-- Commentaires --%>
– Ne sont pas envoyés au client
10
Types des éléments de scripts
• Expressions
– Format : <%= expression %>
– Evaluée et insérée dans la sortie du servlet
Se traduit par out.print(expression)
• Scriptlets
– Format : <% code %>
– Inséré tel quel dans la méthode _jspService du servlet
• Déclarations
– Format : <%! code %>
– Pour déclarer une variable ou bien une fonction / procédure.
• Include / Import / …
− Format : <%@ directive … %>
− Ex : <%@ include file="unAutreFichier" %>
<%@ page import="java.util.*" %>
<%@ taglib prefix="myprefix" uri="taglib/mytag.tld" %>11
3.
9
Expressions JSP:
<%= valeur%>
Expressions JSP
10
• Format
– <%= Expression Java %>
• Résultat
– Expression évaluée, convertie en String, et placée dans la page
HTML à la place qu‟elleoccupe dans laJSP
– L‟expression est placée dans _jspService en paramètre du
out.print()
• Exemples
– Heurecourante: <%= new java.util.Date() %>
– Hostname: <%= request.getRemoteHost() %>
}
Correspondance JSP/Servlet
• JSP d‟origine
<h1>Un nombre aléatoire</h1>
<%= Math.random() %>
• Code du servlet résultant de la traduction
public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException{
response.setContentType("text/html");
HttpSession session = request.getSession();
JspWriter out = response.getWriter();
out.println("<h1>Un nombre aléatoire</h1>");
out.println(Math.random());
...
14
Expressions JSP: Exemple
12
<body>
<h2>JSP Expressions</h2>
<ul>
<li>Current time: <%= new java.util.Date() %> </li>
<li>Server: <%= application.getServerInfo() %> </li>
<li>Session ID: <%= session.getId() %> </li>
<li>The <code>testParam</code> form parameter:
<%= request.getParameter("testParam") %>
</ul>
</body>
</html>
4.
public class ThreeParamsextends HttpServlet{
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException{
...
out.println(docType+
"<html>n"+
"<head><title>"+title+"</title></head>n"+
"<body bgcolor="#FDF5E6">n"+
"<h1 align="CENTER">"+ title +"</h1>n"+
"<ul>n"+
"<li><b>param1</b>:"
+ request.getParameter("param1")+"</li>n"+
"<li><b>param2</b>:"
+ request.getParameter("param2")+"</li>n"+
"<li><b>param3</b>:"
+ request.getParameter("param3")+"</li>n"+
"</ul>n"+
"</body></html>");
}
}
Servlets vs JSP:
Lire 3 paramètres (Servlet)
17
Servlets vs JSP:
Lire 3 paramètres (JSP)
<!DOCTYPE …>
<html>
<head>
<title>Reading Three Request Parameters</title>
</head>
<body>
<h1>Reading Three Request Parameters</h1>
<ul>
<li><b>param1</b>:
<%= request.getParameter("param1") %> </li>
<li><b>param2</b>:
<%= request.getParameter("param2") %> </li>
<li><b>param3</b>:
<%= request.getParameter("param3") %> </li>
</ul>
</body></html>
19
15
Scriptlets JSP:
<% Code %>
Scriptlets JSP
• Format
– <% Code Java %>
• Résultat
– Code inséré tel quel dans _jspService()
• Exemple
– <%
String queryData = request.getQueryString();
out.println("Attached GET data :" + queryData);
%>
– <% response.setContentType("text/plain"); %>
22
5.
Correspondance JSP/Servlet
• JSPd‟origine
<h2>foo</h2>
<%= bar()%>
<% baz(); %>
• Code du servlet résultant de la traduction
public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException{
response.setContentType("text/html");
JspWriter out = response.getWriter();
out.println("<h2>foo</h2>");
out.println(bar());
baz();
...
} 23
Scriptlets JSP: Exemple
• On veut permettre à l‟utilisateur de choisir
la couleur de fond de la page HTML
– Quel est le problème avec ce code?
<body bgcolor = " <%= request.getParameter("bgColor") %> ">
24
Si on ne donne pas un couleur de fond de la
page ??
Scriptlets JSP: Exemple
<!DOCTYPE …>
<html>
<head>
<title>Color Testing</title>
</head>
<%
String bgColor = request.getParameter("bgColor");
if ((bgColor == null)||(bgColor.trim().equals(""))){
bgColor ="WHITE";
}
%>
<body bgcolor=" <%= bgColor %> ">
<h2 align="CENTER">Testing a Background of
"<%= bgColor %>".</h2>
</body></html> 25
Scriptlets JSP: Résultat
20
6.
Utilisation des scriptletspour
créer des parties conditionnelles
21
• Postulat
– Les scriptlets sont insérés tels quels dans le servlet
– Pas besoin d‟avoirdes expressions Javacomplètes
– Cependant, les expressions complètes sont la plupart du temps
plus claires et faciles à maintenir
• Exemple
– <% if (Math.random() < 0.5) { %>
Vous avez <b>gagné</b> !
<% } else { %>
Vous avez <b>perdu</b>!
<%} %>
• Code du servlet résultant de la traduction
– if(Math.random() < 0.5) {
out.println("Vous avez <b>gagné</b> !");
} else {
out.println("Vous avez <b>perdu</b> !");
}
22
Déclarations JSP:
<%! Code %>
Déclarations JSP
23
• Format
– <%! Java Code %>
• Résultat
– Insérées telle quelle dans la définition de la classe du servlet, en
dehors de toute méthode existante
• Exemples
– <%! private int someField = 5; %>
– <%! private void someMethod(...) {...} %>
• Remarque de conception
– Les attributs sont clairement utiles. Pour les méthodes, il est la
plupart du temps préférable de les définir dans une classe Java
séparée
Déclarations JSP: Exemple
24
<!DOCTYPE …>
<html>
<head>
<title>JSP Declarations</title>
<link rel=STYLESHEET
href="JSP-Styles.css"
type="text/css">
</head>
<body>
<h1>JSP Declarations</h1>
<%! private int accessCount = 0; %>
<h2>Accesses to page since server reboot:
<%= ++accessCount %> </h2>
</body></html>
7.
Déclarations JSP: Résultats
2526
Les directives de page:
<%@ directive …
• Donnent des informations sur le servlet qui
sera généré pour la page JSP
• 3 directives
- La directive page: Caractéristiques spécifiques à
la page
- La directive taglib: Référencer des bibliothèques
de balises externes personnalisées.
- La directive include: Inclure des ressources
externes (HTML, XML, …) ou une JSP à la JSP
pendant la phase de transformation 27
Les directives de page Exemples
<% page language = "java" contentType="text/html; charset=UTF-
8"
pageEncoding="UTF-8" %>
<% page import ="java.util.Date" %>
28
8.
Les attributs dela directive taglib
Attribut Rôle
uri Identifier de manière unique une bibliothèque de balises. Emplacement:
fichier .tld décrivant les balises de la bibliothèque packagées dans un jar.
tagdir Définir le répertoire contenant les balises. Il doit être un sous répertoire
sous /WEB-INF/tags. Utilisé lorsque les balises ne sont pas packagées dans
un jar
prefix Définir le préfixe pour utiliser les balises de la bibliothèque
29
Exemple
<% page language = "java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<% taglib prefix =prefix tagdir="/WEB-INF/tags" %>
<% taglib uri = "http//java.sun.com/jsp/core " prefix="c "%>
<! --…-- >
<!DOCTYPE html>
<html>
< !--…-- >
<body>
<prefix:nom_balise/>
<! -- … -- >
</body>
</html>
30
Exemple de l’attribut file de la directive
include
Centraliser la création du pied de page dans un seul et même
fichier puis l’inclure dans les différentes pages.
Fichier piedDePage.html (/WEB-INF/fragments)
<footer>
Editions ENI
</footer>
Inclure ce fichier dans pageProtegee.jsp
<% page language = "java" contentType="text/html; charset=UTF-
8"
pageEncoding="UTF-8" %>
<! --…-- >
<!DOCTYPE html>
<html>
< !--…-- >
<body>
<! -- … -- >
<%@ include file =" ..fragments/piedDePage.html" %>
</body>
</html>
31
32
Intégration
des servlets et des JSP:
Application du design pattern Model-
View-Controller (MVC)
9.
Exemple MVC
33
MVC
2
34
controller
3
<html>
...
J
.
S
.
.
P
...
</html>
result.jsp Etudiant.class
POJO
ViewModel
<html>
...
...
...
</html>
index.jsp
Client1 Conteneur
Controller
Servlet
MVC
POJO
<html>
...
J
.
S
.
.
P
...
</html>
1
2
Rq
3
setAttribute
("Model", e)
4
Servlet
6
7
new Etudiant();
GET …?nom=emna
doGet(Rq,Rp)
35
8
getAttribute("Model");
forward(req, res)
5
Model: Etudiant.java
package Modele;
public class Etudiant
{
public String nom;
public String prenom;
public String sexe;
public String[] transport;
public int CP;
public Etudiant()
{
nom = "";
prenom = "";
sexe = "";
transport = null;
CP = -1;
}
}
10.
Controller :Controller.java
37
public classController extends javax.servlet.http.HttpServlet
implements javax.servlet.Servlet{
//...
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException{
Etudiant e = new Etudiant();
e.nom = request.getParameter("nom");
e.prenom = request.getParameter("prénom");
e.sexe = request.getParameter("sexe");
e.transport = request.getParameterValues("transport");
e.CP = request.getParameter("CP");
request.setAttribute("Model", e); // On ajoute l'attribut model à la
requête
RequestDispatcher view = request.getRequestDispatcher("result.jsp");
//Déléguer la génération de la réponse à la JSP depuis une servlet
view.forward(request, response); // On forward la requête la JSP
}
Index.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-
1« pageEncoding="ISO-8859-1"%>
<%@ page import="Modele.Etudiant" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 >
<html><head><title>Entrez une Personne</title></head>
<body>
<% Etudiant e = (Etudiant)request.getAttribute("Model");
if(e == null) e = new Etudiant(); %>
<Form method="post" action="Controller" >
Nom :<input type="text" name="nom" value="<%= e.nom %>"/><br />
Prénom :<input type="text" name="prenom" value="<%= e.prenom %>"/><br/>
Sexe :<select name="sexe">
<option value="h" <% if(e.sexe.compareTo("h") == 0) { %> selected =
"selected" <% } %> >Homme</option>
<option value="f" <% if(e.sexe.compareTo("f") == 0) { %> selected =
"selected" <% } %> >Femme</option>
</select><br />
Code Postal : <input type="text" name="CP" <% if(e.CP != -1) { %>
value="<%= e.CP %>" <% } %> /><br />
<input type="submit" value="Submit" /><br />
</Form></body></html>
Result.jsp
<body>
<%
Modele.Etudiant e =
(Modele.Etudiant)request.getAttribute("Model");
%>
<center><b>Vos identifiants ont été bien enregistrés</b></center>
<table border=1>
<tr><td>Nom</td>
<td><%= e.nom.toUpperCase() %></td></tr>
<tr><td>Prénom</td>
<td><%= e.prenom %></td></tr>
<tr><td>Sexe</td>
<td><% if( e.sexe.compareTo("h") == 0)
{%>
Homme
<%}
else
{
%>
Femme
<% } %>
</td>