Vous êtes sur la page 1sur 10

Problème d'une Servlet :

HTML dans Java


Chapitre 4 1. C‟est laid!
out.println(docType);
out.println("<html>");
JavaServer Pages out.println("<head>\n<title>Clock</title>\n</head>");
out.println("<body>\n"+
"<h1>Time on server</h1>\n"+
"<p>"+ today+"</p>\n"+
"</body>");
Emna KALLEL out.println("</html>");

2. Difficile de séparer les différentes tâches du


emna.kallel@enetcom.usf.tn développement (Web code vs. Business code)

Solution : Java dans HTML JSP


• Une JSP est identique à une page HTML • Les servlets facilitent le traitement avec java
des requêtes et réponses HTTP, mais
dans laquelle on peut ajouter du code Java ils ne sont pas appropriés à l‟écriture de code HTML
– out.println("<html><head><title>"+title+"</title>…");
(même principe qu'avec PHP)
• Les JSP permettent d‟intégrer du code java
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN"> dans une page HTML
<html> – <h1>Time on server</h1>
<head> <p><%= new java.util.Date() %></p>
<title>Clock</title>
</head> • Mais au final une JSP n’est qu’une servlet
<body>
chargé et initialisé
<h1>Time on server</h1> traduit en compilé en en tant que
<p> <%= new java.util.Date() %> </p>
</body>
</html> MyJSP.jsp MyJSP_jsp.java MyJSP_jsp.class obj:MyJSP_jsp

3 Automatiquement géré par le conteneur 4


Une JSP en 1 étape Correspondance JSP/Servlet
• Ecrire une JSP Clock.jsp
et la mettre dans webapps • JSP d‟origine
<h1>Time on server</h1>
(le répertoire de notre application Web) <p><%= new java.util.Date() %></p>
• Servlet généré par Tomcat
<!DOCTYPE HTML PUBLIC public final class Clock_jsp
"-//W3C//DTD HTML 4.0 Transitional//EN"> extends org.apache.jasper.runtime.HttpJspBase
<html> implements org.apache.jasper.runtime.JspSourceDependent{
<head> public void _jspService(HttpServletRequest request,
webapps <title>Clock</title> HttpServletResponse response)
</head> throws java.io.IOException, ServletException{
<body>
<h1>Time on server</h1> response.setContentType("text/html");
<p> <%= new java.util.Date() %> </p> JspWriter out = response.getWriter();
</body> // ...
</html> out.write("<h1>Time on server</h1>\r\n");
<html>
... out.write("<p>");
... out.print( new java.util.Date() );
... out.write("</p>\r\n");
</html>
5 // ... 7
Clock.jsp }

Syntaxe de base Types des éléments de scripts


• Texte HTML • Expressions
– <h1>Blah</h1> – Format : <%= expression %>
– Passé au client. Réellement traduit en servlet par le code – Evaluée et insérée dans la sortie du servlet
• out.print("<h1>Blah</h1>"); Se traduit par out.print(expression)
• Commentaires HTML • Scriptlets
– <!-- Commentaire --> – Format : <% code %>
– Pareil que les autres éléments HTML: passés au client – Inséré tel quel dans la méthode _jspService du servlet
• Commentaires JSP • Déclarations
– <%-- Commentaires --%> – Format : <%! code %>
– Ne sont pas envoyés au client – Pour déclarer une variable ou bien une fonction / procédure.
• Include / Import / …
− Format : <%@ directive … %>
− Ex : <%@ include file="unAutreFichier" %>
<%@ page import="java.util.*" %>
10 <%@ taglib prefix="myprefix" uri="taglib/mytag.tld" %>11
Expressions JSP
• Format
– <%= Expression Java %>

Expressions JSP: • Résultat


– Expression évaluée, convertie en String, et placée dans la page
HTML à la place qu‟elle occupe dans la JSP
<%= valeur %> – L‟expression est placée dans _jspService en paramètre du
out.print()
• Exemples
– Heurecourante: <%= new java.util.Date() %>
– Hostname: <%= request.getRemoteHost() %>

9 10

Correspondance JSP/Servlet Expressions JSP: Exemple


<body>
• JSP d‟origine <h2>JSP Expressions</h2>
<h1>Un nombre aléatoire</h1> <ul>
<li>Current time: <%= new java.util.Date() %> </li>
<%= Math.random() %>
<li>Server: <%= application.getServerInfo() %> </li>
• Code du servlet résultant de la traduction <li>Session ID: <%= session.getId() %> </li>
public void _jspService(HttpServletRequest request, <li>The <code>testParam</code> form parameter:
HttpServletResponse response)
<%= request.getParameter("testParam") %>
throws ServletException, IOException{
response.setContentType("text/html"); </ul>
HttpSession session = request.getSession(); </body>
JspWriter out = response.getWriter(); </html>
out.println("<h1>Un nombre aléatoire</h1>");
out.println(Math.random());
...
14 12
}
Servlets vs JSP: Servlets vs JSP:
Lire 3 paramètres (Servlet) Lire 3 paramètres (JSP)
public class ThreeParams extends HttpServlet{ <!DOCTYPE …>
public void doGet(HttpServletRequest request, <html>
HttpServletResponse response) <head>
throws ServletException, IOException{ <title>Reading Three Request Parameters</title>
... </head>
out.println(docType+
<body>
"<html>\n"+
"<head><title>"+title+"</title></head>\n"+ <h1>Reading Three Request Parameters</h1>
"<body bgcolor=\"#FDF5E6\">\n"+ <ul>
"<h1 align=\"CENTER\">"+ title +"</h1>\n"+ <li><b>param1</b>:
"<ul>\n"+ <%= request.getParameter("param1") %> </li>
"<li><b>param1</b>:" <li><b>param2</b>:
+ request.getParameter("param1")+"</li>\n"+ <%= request.getParameter("param2") %> </li>
"<li><b>param2</b>:" <li><b>param3</b>:
+ request.getParameter("param2")+"</li>\n"+ <%= request.getParameter("param3") %> </li>
"<li><b>param3</b>:" </ul>
+ request.getParameter("param3")+"</li>\n"+ </body></html>
"</ul>\n"+
"</body></html>");
}
17 19
}

Scriptlets JSP
• Format
– <% Code Java %>
Scriptlets JSP:
• Résultat
<% Code %> – Code inséré tel quel dans _jspService()
• Exemple
– <%
String queryData = request.getQueryString();
out.println("Attached GET data :" + queryData);
%>
– <% response.setContentType("text/plain"); %>

15 22
Correspondance JSP/Servlet Scriptlets JSP: Exemple
• JSP d‟origine • On veut permettre à l‟utilisateur de choisir
<h2>foo</h2>
<%= bar()%> la couleur de fond de la page HTML
<% baz(); %>
– Quel est le problème avec ce code?
• Code du servlet résultant de la traduction
public void _jspService(HttpServletRequest request,
HttpServletResponse response) <body bgcolor = " <%= request.getParameter("bgColor") %> ">
throws ServletException, IOException{
response.setContentType("text/html");
JspWriter out = response.getWriter();
out.println("<h2>foo</h2>"); Si on ne donne pas un couleur de fond de la
out.println(bar());
baz(); page ??
...

} 23 24

Scriptlets JSP: Exemple Scriptlets JSP: Résultat


<!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 20
Utilisation des scriptlets pour
créer des parties conditionnelles
• Postulat
– Les scriptlets sont insérés tels quels dans le servlet
– Pas besoin d‟avoir des expressions Java complètes
– Cependant, les expressions complètes sont la plupart du temps Déclarations JSP:
plus claires et faciles à maintenir
• Exemple
– <% if (Math.random() < 0.5) { %>
<%! Code %>
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> !");
}
21 22

Déclarations JSP Déclarations JSP: Exemple


• Format <!DOCTYPE …>
– <%! Java Code %> <html>
• Résultat <head>
– Insérées telle quelle dans la définition de la classe du servlet, en <title>JSP Declarations</title>
dehors de toute méthode existante <link rel=STYLESHEET
• Exemples href="JSP-Styles.css"
– <%! private int someField = 5; %>
– <%! private void someMethod(...) {...} %> type="text/css">
</head>
• Remarque de conception
<body>
– 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 <h1>JSP Declarations</h1>
séparée <%! private int accessCount = 0; %>
<h2>Accesses to page since server reboot:
<%= ++accessCount %> </h2>
23
</body></html> 24
Déclarations JSP: Résultats

Les directives de page:


<%@ directive …

25 26

Les directives de page Exemples


• Donnent des informations sur le servlet qui <% page language = "java" contentType="text/html; charset=UTF-
sera généré pour la page JSP 8"
pageEncoding="UTF-8" %>
• 3 directives
- La directive page: Caractéristiques spécifiques à <% page import ="java.util.Date" %>
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
28
Les attributs de la directive taglib Exemple
<% page language = "java" contentType="text/html; charset=UTF-8"
Attribut Rôle pageEncoding="UTF-8" %>
<% taglib prefix =prefix tagdir="/WEB-INF/tags" %>
uri Identifier de manière unique une bibliothèque de balises. Emplacement: <% taglib uri = "http//java.sun.com/jsp/core " prefix="c "%>
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 <!DOCTYPE html>
<html>
sous /WEB-INF/tags. Utilisé lorsque les balises ne sont pas packagées dans
< !--…-- >
un jar <body>
prefix Définir le préfixe pour utiliser les balises de la bibliothèque <prefix:nom_balise/>
<! -- … -- >
</body>
</html>

29 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
Intégration
<% page language = "java" contentType="text/html; charset=UTF-
8" des servlets et des JSP:
pageEncoding="UTF-8" %>
<! --…-- >
<!DOCTYPE html> Application du design pattern Model-
<html> View-Controller (MVC)
< !--…-- >
<body>
<! -- … -- >
<%@ include file =" ..fragments/piedDePage.html" %>
</body>
</html>
32
31
MVC
Exemple MVC
Client1 Conteneur

Controller

Servlet
<html>
...
2 controller
3 ...
...
</html> <html>
...
index.jsp J.S..P POJO
...
</html> View Model
result.jsp Etudiant.class
34

33

MVC Model: Etudiant.java


package Modele;
GET …?nom=emna public class Etudiant
doGet(Rq,Rp)
{
1 new Etudiant(); public String nom;
2 3
public String prenom;
Servlet public String sexe;
8 public String[] transport;
forward(req, res) setAttribute
public int CP;
5 ("Model", e)
4
<html> public Etudiant()
7 ...
J.S..P Rq POJO {
... nom = "";
</html> 6
getAttribute("Model"); prenom = "";
sexe = "";
35 transport = null;
CP = -1;
}
}
Index.jsp
Controller :Controller.java <%@ page language="java" contentType="text/html; charset=ISO-8859-
1« pageEncoding="ISO-8859-1"%>
<%@ page import="Modele.Etudiant" %>
public class Controller extends javax.servlet.http.HttpServlet <%@ page import="java.util.*" %>
implements javax.servlet.Servlet{ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 >
//... <html><head><title>Entrez une Personne</title></head>
protected void doGet(HttpServletRequest request,
<body>
HttpServletResponse response)
throws ServletException, IOException{ <% Etudiant e = (Etudiant)request.getAttribute("Model");
Etudiant e = new Etudiant(); if(e == null) e = new Etudiant(); %>
e.nom = request.getParameter("nom"); <Form method="post" action="Controller" >
e.prenom = request.getParameter("prénom"); Nom :<input type="text" name="nom" value="<%= e.nom %>"/><br />
e.sexe = request.getParameter("sexe"); Prénom :<input type="text" name="prenom" value="<%= e.prenom %>"/><br/>
e.transport = request.getParameterValues("transport"); Sexe :<select name="sexe">
e.CP = request.getParameter("CP"); <option value="h" <% if(e.sexe.compareTo("h") == 0) { %> selected =
request.setAttribute("Model", e); // On ajoute l'attribut model à la "selected" <% } %> >Homme</option>
requête <option value="f" <% if(e.sexe.compareTo("f") == 0) { %> selected =
"selected" <% } %> >Femme</option>
RequestDispatcher view = request.getRequestDispatcher("result.jsp");
</select><br />
//Déléguer la génération de la réponse à la JSP depuis une servlet Code Postal : <input type="text" name="CP" <% if(e.CP != -1) { %>
view.forward(request, response); // On forward la requête la JSP value="<%= e.CP %>" <% } %> /><br />
37 <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>

Vous aimerez peut-être aussi