Patrick Albers – Oriana Licchelli
Servlet : Problème d’état
Problème
Le protocole HTTP est un protocole sans état, il est
donc impossible de garder des informations
d’une requête à l’autre
Solutions
1. Champs de formulaire cachés
2. Réécriture d’URL
3. Cookies
4. Session
2
Cookies (1/2)
Cookie = information stockée dans le client par une application
web, qui sera renvoyée chaque fois que le client accède à
l’application
L’API Servlet fournit la classe javax.servlet.http.Cookie pour
travailler avec les Cookies
– Cookie(String name, String value) construe un cookie
– String getValue() retourne la valeur du cookie
– setValue(String new_value) donne une nouvelle valeur au cookie
Chaque cookie doit être ajouté à la réponse avec la méthode
addCookie(Cookie mon_cook) de l’objet HttpServletResponse
3
Cookies (2/2)
// Création d’un cookie, qui est ajouté au client
Cookie cookie = new Cookie(“N_acces", "12");
response.addCookie(cookie);
// Récupérer les cookies
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
String name = cookies[i].getName();
String value = cookies[i].getValue();
}
}
Il n’existe pas dans l’API Servlet de méthode permettant
de récupérer la valeur d’un cookie par son nom !
4
Session
La session est utilisée pour mémoriser les actions d'un utilisateur
sur plusieurs requêtes HTTP sur une période donnée
Elle est géré par la classe javax.servlet.http.HttpSession, avec les
méthodes de :
– création liées à la requête :
• HttpSession getSession() retourne la session associée à l’utilisateur
– gestion d’association :
• Enumeration getAttributNames() retourne les noms de tous les attributs
• Object getAttribut(String name) retourne l’objet associé au nom
• setAttribut(String na, Object va) modifie na par la valeur va
• removeAttribut(String na) supprime l’attribut associé à na
– Destruction (HttpSession) :
• logout() termine la session
HttpSession est un mécanisme qui permet de stocker des objets et non
de simples chaînes de caractères comme les cookies.
5
Session : exemple
public class HttpSessionServlet extends HttpServlet {
protected void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
PrintWriter out = res.getWriter();
HttpSession session = req.getSession();
Integer count = (Integer) session.getAttribute(“Count");
if (count == null)
count = new Integer(1);
else
count = new Integer(count.intValue() + 1);
session.setAttribute("Count", count);
out.println("Vous avez visité cette page " + count + " fois.");
}}
6
Collaboration de Servlets : include
Client SESSION
Nom
(request,
Oui response) Servlet A
Non Class 1
—
—
Envoyer include(request, response) Class 2
—
—
—
(HTML)
Servlet B
—
—
—
7
Collaboration de Servlets : forward
Client SESSION
Nom
(request,
Oui response) Servlet A
Non —
—
Envoyer —
forward(request, response)
Class 1
Class 2
Servlet B
—
—
—
(HTML)
8
Servlet : exemple
Servlet Emetteur qui permet de distribuer un renvoi au servlet Recepteur
public class Emetteur extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
RequestDispatcher dispat = req.getRequestDispatcher("/Recepteur");
dispat.forward(req,res);
// Pas de code après
}
}
public class Recepteur extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
PrintWriter out = res.getWriter();
out.println(“page html à envoyer au client”);
}
}
9
Se connecter aux bases de données
JDBC : technologie basée sur Java qui permet d'accéder à une base
de donnée de façon indépendante du Système de Gestion des
Bases de données (SGBD)
API de JDBC fournie des méthodes pour accéder virtuellement à
une source de donnée organisée en tableau. Elle permet de :
– faire des requêtes sur une base de données en utilisant des
déclarations SQL
– connecter un programme Java avec un SGBD qui a un driver
pour JDBC
En changent le SGBD, il est seulement nécessaire de changer le
driver pour le nouveau SGBD
JDBC API
Driver pour Oracle Driver pour SQL Server Driver pour MySQL
10
JDBC : API Java
package java.sql
classes et interfaces pour utiliser JDBC :
– DriverManager qui fournie les services basiques pour
manipuler les drivers JDBC
– Connection est une interface utilisée pour ouvrir une
session avec une base de données spécifique
– Statement est une interface qui est utilisé pour exécuter et
recevoir les résultats d'une requête SQL
– ResultSet est une interface qui implémente un tableau de
données qui généralement stocke les résultats d'une
requête
11
JDBC : utilisation
1. méthode registerDriver(Driver driver) de la classe DriverManager pour charger le
driver de un SGBD spécifique
Exemple:
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
2. méthode getConnection(String url) de la classe DriverManager pour établir une
connexion avec la base de donnée
Exemple:
Connection connect = DriverManager.getConnection("jdbc:mysql://localhost/NomBdd?
user=nomUsert&password=motDePasse");
3. méthode createStatement() de l'interface Connection pour créer un « Statement »
qui permettre de lancer les instructions SQLs sur la base de données
Exemple:
Statement stmt = connect.createStatement();
4. méthode exécute(String sql) de l'Interface Statement pour exécuter des
instructions SQL
Exemple:
stmt.execute(sql_select);
5. interface ResultSet pour accéder au résultat de l'exécution d'une requête
Exemple:
ResultSet rset = stmt.getResultSet();
12
JDBC : exemple
13
Exercice 2
1) Dans l’application « biblio », copiez/déposez le fichier jar de
JDBC dans le répertoire WEB-INF/lib
2) Modifiez l’application « biblio » afin d’afficher les informations
de la table « biblio » dans la réponse du servlet.
14
Java Server Page
JSP est l’acronyme de Java Server Pages
Une JSP est un fichier texte ( .jsp ) contenant un
modèle de document statique et des balises
spécifiques pour inclure du code Java et exécuter
une partie de la logique applicative. Le contenu
statique correspond à du code HTML.
Lorsqu’une JSP est appelée pour la première fois :
– Le serveur la traduit en servlet
– En tant que servlet, elle est instanciée
– Puis exécutée
15
JSP : exemple 1 (1/3)
Le but de cet exemple est d’afficher un message et la date
package bonDate;
import java.io.*; import javax.servlet.*; import javax.servlet.http.*;
public class BonjourServlet extends HttpServlet {
protected void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
PrintWriter out = res.getWriter();
out.println("<html><head><title>Exemple</title> </head> ");
out.println("<body>Bonjour tout le monde nous sommes le ");
out.println(new java.util.Date().toString());
out.println(" et tout va bien.");
out.println(" </body></html>");
}
}
16
JSP : exemple 1 (2/3)
Obtenir le même résultat en utilisant une page JSP
<%@ page language="java" contentType="text/html" %>
<html>
<head>
<title>Bonjour tout le monde</title>
</head>
<body>
<h1>Bonjour tout le monde</h1>
Nous sommes le <%= new java.util.Date().toString() %>
et tout va bien.
</body>
</html>
17
JSP : exemple 1 (3/3)
Le fichier JSP est traduit, automatiquement par le serveur Web, en
servlet qui hérite de javax.servlet.jsp.HttpJspPage, et qui implémente la
méthode _jspService(…), équivalente à service(…).
public final class bonjourJsp_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 {
HttpSession session = null;
try {
_jspx_out = out;
out.write("<html>\r\n"); out.write("\t<head>\r\n");
out.write("\t\t<title>Bonjour tout le monde </title>\r\n");
out.write("\t</head>\r\n");out.write("\t<body>\r\n");
out.write("\t\t<h1>Bonjour tout le monde</h1>\r\n");
out.write("\t\tNous sommes le ");
out.print( new java.util.Date().toString() );
out.write(" et tout va bien.\r\n"); out.write("\t</body>\r\n");out.write("</html>");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (_jspx_page_context != null)
_jspx_page_context.handlePageException(t); }
} finally {
if (_jspxFactory != null)
_jspxFactory.releasePageContext(_jspx_page_context); }
}
18
JSP : exemple 1 avec Eclipse
Créer une nouvelle application web avec
cette JSP
19
Les Balises JSP
Les Balises JSP permettent de différencier le code
HTML au code Java :
Balise de directive <%@ … %>
Éléments de scripts :
– Balise de commentaire :
• <%-- blabla --%>
– Balise de déclaration :
• <%! … %>
– Balise de Scriplet :
• <% …%>
– Balise d’expression :
• <%= … %>
20
Directives JSP
Les directives contrôlent le comportement du
compilateur de pages JSP ; elles sont donc
évaluées avant la compilation
Elles sont placées entre les symboles <%@ et %>
Les directives sont :
– page définit les attributs spécifiques à une page
– include indique au compilateur d’inclure un autre fichier
<%@ include file="unAutreFichier" %>
– taglib indique une bibliothèque de balises à utiliser
<%@ taglib prefix="myprefix" uri="taglib/mytag.tld" %>
21
La directive page
La directive page définit les attributs spécifiques à une
page
– import - importe un paquetage Java. Cette directive correspond
à l’instruction import dans le Servlet
<%@ page import="java.util.*, java.sql.*" %>
– langage - définit le langage de script utilisé dans la page
– errorPage - indique la page à afficher si une exception se produit
pendant l’exécution de la JSP
<%@ page errorPage="toto.jsp" %>
– isErrorPage - vaut true si la page est une erreur et false pour
une page normale
<%@ page isErrorPage=true %>
– ...
22
La directive include
<%@ include file="unAutreFichier" %>
Cette inclusion se fait au moment de la
conversion de la page
Tout le contenu du fichier externe est inclus
comme s’il était saisi directement dans la
page JSP
23
JSP : exemple 2
<%@ page language="java" contentType="text/html" %>
<html>
<head><title>exemple2</title></head>
<body>
<jsp:include page= "tete.jsp" flush="true">
<jsp:param name="pageTitre" value="ExempleJsp"/>
<jsp:param name="pageSlogan" value=" " />
</jsp:include>
<%@ include file="/navigation.jsp" %>
<%@ include page="/corps.jsp" %>
<%@ include file="/piedpage.jsp" %>
</body>
</html>
24
Balise des commentaires
Elément de script utilisé pour faire un commentaire
dans le code JSP entre les symboles <%-- et --%>
Les commentaires JSP
– n’apparaissent pas dans le code HTML du client
– mais dans le servlet généré automatiquement pendant la
phase de transformation de la jsp
<%@ page language="java" contentType="text/html" %>
<html> <head> <title>Bonjour tout le monde</title> </head>
<body>
<!-- affichage d'un message classique -->
<h1>Bonjour tout le monde</h1>
Nous sommes le <%= new java.util.Date().toString() %> et tout va bien !
<%-- Utilisation de la classe Date --%>
</body>
</html>
25
Balise de déclaration
Elle permet d’insérer du code dans la classe du Servlet à
extérieur de la méthode _jspService
– elles sont placées entre les symboles <%! et %>
Utilisée pour :
– déclarer un attribut de classe
– spécifier et implémenter des méthodes
Les attributs et les méthodes déclarées sont utilisables dans
toute la page
<%!
private int count = 0;
private int incrementCount() {
return count++;
}
%>
26
Balise de scriplet
Un scriplet est un bloc de code Java qui est placé entre
les symboles <% et %>
– traduit dans la méthode _jspService(…)
Tout code java a accès aux :
– attributs et méthodes définis par la balise déclaration <%! … %>
– objets implicites
<% for (int i = 0; i < 5 ; i++) { %>
HelloWorld <br>
<%
incrementCount();
}
%>
27
Balise d’expression
Évaluation d’une expression en renvoyant sa valeur
de type String en utilisant la balise <%= message %>
– correspondant à un scriplet de la forme
< % out.println(message); %>
<% String[] noms={"mickey","donald"};
for (int i = 0 ; i < noms.length ; i++) {
%>
Le <%= i %> ème nom est <%= noms[i] %>
<% } %>
28
Objets implicites
Les objets implicites sont présents dans la méthode
_jspService(…) du servlet généré
Ils sont identifiés par des noms de variables
uniques :
– request : requête courante (HttpServletRequest)
– response : réponse courante
(HttpServletReponse)
– session : session courante (HttpSession)
– out : flot de sortie qui permet l’écriture sur la
réponse (idem response.getWriter())
– exception : disponible uniquement dans les pages
d'erreurs donnant des informations sur les erreurs
29
public final class example_jsp extends HttpJspBase {
JSP : exemple 3
String contenu[] = {"Pierre","Lucie","Olivier"};
public void _jspService(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException {
out.write("\t<html><head><title>Bonjour</title>\r\n");
out.write("\t</head>\r\n"); out.write("\t<body>\r\n");
for (int i = 0; i <contenu.length; i++) {
out.write("\t\t\tLe ");
out.print( i+1 );
out.write(" ème nom est ");
out.print( contenu[i] );
out.write(" <p>\r\n");
out.write("\t\t");
<%@ page language="java"
} contentType="text/html" %>
<html> out.write("\t\t\r\n");
<head> out.write("\t</body>\r\n");
}
<title>Bonjour </title>
}
</head>
<body>
<%! String contenu[] = {"Pierre","Lucie","Olivier"}; %>
<% for (int i = 0; i <contenu.length; i++) { %>
Le <%= i+1 %> ème nom est <%= contenu[i] %> <p>
<% } %>
</body>
</html>
30
JSP : Cycle de vie
Le cycle de vie d'une JSP est identique à un
Servlet :
– La méthode jspInit() est appelée après le chargement de
la page
– La méthode _jspService() est appelée à chaque requête
– La méthode jspDestroy() est appelée lors du
déchargement
31
Technique de gestion des erreurs
Erreurs déclenchées par l'intermédiaire des exceptions et
transmises à une page d'erreur
– Chaque page JSP peut déclarer une seule page d'erreur, qui reçoit des
informations sur l’erreur par la méthode GET
– directive page dans la page où une erreur (exception) peut se produire
<%@ page errorPage="erreur.jsp" %>
– attribut isErrorPage à true dans la page d’erreur
<%@ page isErrorPage=true %>
L'exception lancée, peut être manipulée par l'objet implicite
exception en utilisant les différentes méthodes :
– exception.getMessage(), exception.printStackTrace(), etc.
Attention : la référence exception n'est utilisable que dans les
balises de Scriplet et Expression
32
JSP : exemple 5
<%@ page language="java" contentType="text/html" %>
<%@ page errorPage="errorpage.jsp" %>
<html> <head> <title>Page avec une erreur</title> </head>
<body bgcolor="white">
<% int var = 90; %>
Division par <% float var2 = var / 0; %> <%= var2 %>
</body>
</html>
<%@ page language="java" contentType="text/html" %>
<%@ page isErrorPage="true" %>
<html> <head> <title>Page gérant une erreur</title> </head>
<body bgcolor="white">
Une erreur est survenue :
<%= exception.getMessage() %>
</body>
</html>
33
Collaboration de JSP
Client SESSION
Nom JSP B
Servlet A Class 1 —
Oui
—
Non (request, —
response) —
Envoyer include(request, response)
JSP A
—
— —
forward(request, response) include(request, response)
—
—
Class 2
Servlet B
—
—
—
(HTML)
34
Partage du contrôle
Le partage du contrôle concerne l’utilisation
des tags action JSP include et forward
Balise d’inclusion
La balise include permet d’inclure, au
moment de la requête, un fichier HTML ou
JSP ou Servlet
<jsp:include page="/NomJSP.jsp" />
<jsp:include page="/NomHTML.html" />
<jsp:include page="/NomServlet" />
35
Partage du contrôle
Balise de redirection
forward redirige la requête vers une autre ressource
<jsp:forward page=" /NomJSP.jsp" />
– Il est possible de passer un ou plusieurs paramètres
vers la ressource appelée grâce à la balise
<jsp:param>
<jsp:forward page=“/fichier.jsp">
<jsp:param name="attr1" value="val1" />
</jsp:forward>
36
Partage du contrôle
On peut faire la même chose avec un scriptlet...
<%
RequestDispatcher dispatch = request.getRequestDispatcher("/fichier.jsp");
request.setAttribute("attr1","val1");
dispatch.forward(request,response);
%>
37
Servlet ou JSP ?
Les pages JSP sont plus faciles à écrire
car elles ressemblent à des documents
structurés et sont manipulables dans des
environnements d’édition Web classiques
Les servlets sont la plupart du temps
utilisés pour :
– implémenter la logique de l'application
– implémenter des services
38
Exemple Jsp + Servlet avec Eclipse
Dans eclipse :
– Créer un nouveau projet pour créer un formulaire
sur Web
• index.html : formulaire à remplir avec les
informations sur l’utilisateur (nom, prénom, genre,
année de naissance)
• FormServlet.java : pour calculer l’âge
• VisualPers.jsp : pour visualiser un message
personnalisé avec aussi l’âge
39
Exercice 3 : la Bibliothèque
Déployer une application « GestionBiblio » qui permet la
gestion de la BDD « Bibliothèque »
1. Créer une page index.html contenant plusieurs formulaires
permettant de :
• trouver un livre à partir de son titre, tous les livres d’un même auteur
• emprunter/rendre un livre
• ajouter/supprimer un livre de la bibliothèque
2. Créer pour chaque formulaire une servlet et une page JSP pour
l’affichage
40