Comme je vous le disais plus tôt, les sessions s'utilisent grâce à un objet. Les méthodes les plus couramment utilisées permettent de déposer et récupérer des valeurs dans notre objet. Ces valeurs sont stockées sous la forme "
clé - valeur".
En fait, nous ordonnons à notre objet session de stocker une valeur que nous allons ranger grâce à une clé, un peu comme ceci :
Dans le cas du tableau ci-dessus, nous devrons, pour récupérer la valeur "
monLogin", interroger notre objet de session en lui demandant de nous fournir la valeur de la clé "
login". En fait, vous pouvez voir que son utilisation est très simple : nous allons pouvoir faire un premier essai, mais avant, voici une description succincte de notre objet :
HttpSession.
Je vous propose un petit exemple afin de nous faire les dents… Celui-ci sera très simple, une page HTML qui demande un "
login - mot de passe" via un formulaire (jusqu'ici, rien de spécial), une servlet qui va récupérer les informations du formulaire pour les mettre en session ; enfin, cette même servlet va rediriger la requête vers une autre servlet qui aura pour rôle d'afficher le contenu de notre session et d'y ajouter un objet qui aura pour rôle compter le nombre de fois que la page a été appelée (un bête incrément, quoi

). Allez, un petit schéma s'impose.
Voici les codes sources utilisés.
connexion.jsp
Code : JSP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 | <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Connexion à l'application</title>
</head>
<body>
<form name="session" method="POST" action="session.do" />
<table>
<tr>
<td>Login : </td>
<td><input type="text" name="login" /> </td>
</tr>
<tr>
<td>Mot de passe : </td>
<td><input type="password" name="password" /> </td>
</tr>
<tr>
<td colspan="2" style="text-align:center"><input type="submit" name="valider" /></td>
</tr>
</table>
</form>
</body>
</html>
|
Servlet 1 : TestSession.java
Code : Java 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 | package com.sdz.session;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class TestSession extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//On récupère les identifiants et on les stocke dans notre objet de session
String login = req.getParameter("login");
String password = req.getParameter("password");
HttpSession session = req.getSession();
session.setAttribute("login", login);
session.setAttribute("password", password);
//Maintenant, nous allons utiliser cet objet dans une autre servlet
resp.sendRedirect("result.do");
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
|
Servlet 2 : ResultatSession.java
Code : Java 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 | package com.sdz.session;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class ResultatSession extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
HttpSession session = req.getSession();
PrintWriter out = resp.getWriter();
//On rajoute un attribut s'il n'existe pas
//Et s'il existe, on incrémente cet attribut
Object increment = session.getAttribute("increment");
if(increment == null){
session.setAttribute("increment", new Integer(1));
}
else{
int value = ((Integer)increment).intValue();
session.setAttribute("increment", ++value);
}
//On affiche l'identifiant de session unique
out.println("<h2>Numéro de la session en cours : " + session.getId() + "</h2>");
//On parcourt maintenant le contenu de notre objet session
Enumeration e = session.getAttributeNames();
while(e.hasMoreElements()){
String key = (String)e.nextElement();
out.println("<p>Clé : " + key + " - Valeur : " + session.getAttribute(key) + "</p>");
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
|
Le descripteur de déploiement : web.xml
Code : XML 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 | <web-app>
<servlet>
<servlet-class>com.sdz.session.TestSession</servlet-class>
<servlet-name>firstSession</servlet-name>
</servlet>
<servlet>
<servlet-class>com.sdz.session.ResultatSession</servlet-class>
<servlet-name>resultSession</servlet-name>
</servlet>
<servlet-mapping>
<servlet-name>firstSession</servlet-name>
<url-pattern>/session.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>resultSession</servlet-name>
<url-pattern>/result.do</url-pattern>
</servlet-mapping>
</web-app>
|
Voilà ce que j'ai obtenu avec ces codes :
Dans notre exemple, nous avons utilisé une servlet pour afficher le contenu de notre objet session. Vous auriez aussi pu utiliser une page JSP : votre objet est accessible directement via la variable session. Elle fait partie des variables préchargées et peut être directement utilisable depuis une page JSP.
sendRedirect ou RequestDispatcher ?
Une petite nouveauté s'est glissée ici, c'est la notion de redirection. Ceci peut s'avérer très pratique lorsqu'on souhaite réorienter une requête vers une servlet particulière ou vers une JSP. Ceci se fait via l'objet
HttpResponse en invoquant la méthode
sendRedirect(String urlName). Cette méthode a une petite cousine qui, elle, est à invoquer via l'objet
HttpRequest, vous la connaissez déjà et vous l'avez déjà utilisée, rappelez-vous, lorsque vous faites ceci :
Code : Java | RequestDispatcher dispatch = request.getRequestDispatcher("firstJsp.jsp");
dispatch.forward(request, response);
|
La principale différence réside dans la façon de travailler de ces deux méthodes. Imaginez-vous sur un chantier de maçonnerie avec plusieurs ouvriers.
Utiliser la méthode
sendRedirect() reviendrait à demander à quelqu'un d'autre de faire le travail à votre place alors qu'utiliser l'objet
RequestDispatcher reviendrait à demander un coup de main à un collègue, vous êtes toujours en charge de la tâche mais quelqu'un vient en soutien. Lorsque l'objet
RequestDispatcher fait travailler quelqu'un d'autre,
sendRedirect() simule une requête de la part d'un client. D'ailleurs, il vous suffit de tester les deux méthodes ; vous verrez dans la barre d'adresse que l'URL est différente selon le cas et, donc, que la servlet en charge de traiter la requête HTTP n'est pas la même :
Avec la méthode
requestDispatcher

Avec la méthode
sendRedirect
Fin de l'aparté.
Vous pouvez voir qu'avec cet exemple (après plusieurs appuis sur
F5 dans la page récapitulative), notre application se rappelle de vous en conservant des informations. C'est très simple d'utilisation et très pratique car ce sont des objets qui sont mémorisés : vous pouvez donc très bien mettre ce qui vous chante dans votre session.
Vous aurez aussi remarqué que l'identifiant de session, qu'on récupère avec la méthode
getId(), retourne toujours la même chaîne de caractères. C'est ce qu'on appelle le
sessid. C'est grâce à cet identifiant que notre serveur sait à qui il parle et qu'il retrouve les informations : en fait, ce ne sont pas vraiment vos informations, mais les informations de la session car, si vous le souhaitez, vous pouvez avoir plusieurs sessions dans une même application. Dans notre exemple, faites la même chose sous deux navigateurs différents (Firefox et IE, par exemple) avec des données différentes et vous devriez obtenir ceci :
Du coup, une question doit germer dans vos esprits : comment le conteneur fait pour reconnaître telle ou telle session ?
Allez, je suis sympa, je vais vous expliquer.