Вы находитесь на странице: 1из 16

Application web de gestion de

comptes en banques

• Objectif
– Il s'agit à partir des classes Compte, Client developpées lors des TP précédents
de réaliser une application Web permettant de gérer les comptes d'un client donné.
La figure page suivante présente le fonctionnement envisagé pour l’interface cette
application.

• Cet exercice permettra d'introduire différents points dans l'utilisation des


servlets et JSP
– EL (expression Language),
– JSTL (Standard Tag Library…),
– Inclusion de fragments de JSP,
– Filtres de servlets

Philippe GENOUD © UJF Grenoble – 15/03/2007 1

Retour à la page de login en


indiquant la cause de l'échec 1 Page liste des comptes
Page d'accueil

Annexe 3 : interface de l'application Banque IMA on line


échec

Authentification ok
de l'utilisateur

Affiche la liste des comptes accessibles par le client

Permet de Page pour effectuer un transfert


sélectionner L'utilisateur n'a plus accès
le compte à l'application à moins de
source et le Déconnexion repasser par la phase
compte d'authentification
destination
et le montant
du transfert
2 Page de déconnexion

Réalisation du
Page affichage des transfert
2
résultats du transfert

Page indiquant si le transfert a réussi ou non


Et en cas d'échec la raison de ce dernier
2
Philippe GENOUD © UJF Grenoble – 15/03/2007 2
Application web de gestion de
comptes en banques
• Question 1 :
– A partir de ce schéma, indiquer les différents composants que vous mettriez en
œuvre pour la réalisation de cette application, sachant bien entendu que vous avez
à votre disposition les composants métier développés dans les TPs précédents.
– Pour chaque composant vous indiquerez :
• son nom, sa nature (page HTML, page JSP, Servlet…)
• son rôle (vous préciserez en quelques phrases les différents traitements qu’il effectue en
indiquant si nécessaire quels objets sont crées et/ou sur quels objets portent ces
traitements).
– Vous préciserez également la manière dont ces différents composants échangent
de l’information entre eux.

• Question 2 :
– Réaliser l'application web, dans l'environnement Netbeans 5.5 avec Tomcat

Philippe GENOUD © UJF Grenoble – 15/03/2007 3

Retour à la page de login en


indiquant la cause de l'échec 1 Page liste des comptes
Page d'accueil

Annexe 3 : interface de l'application Banque IMA on line


échec

Authentification ok
de l'utilisateur

Affiche la liste des comptes accessibles par le client

Permet de Page pour effectuer un transfert


sélectionner L'utilisateur n'a plus accès
le compte à l'application à moins de
source et le Déconnexion repasser par la phase
compte d'authentification
destination
et le montant
du transfert
2 Page de déconnexion

Réalisation du
Page affichage des transfert
2
résultats du transfert

Page indiquant si le transfert a réussi ou non


Et en cas d'échec la raison de ce dernier
2
Philippe GENOUD © UJF Grenoble – 15/03/2007 4
"
="
d
w
ss
pa
u
/o
et
"
="

ine is
ct
spon
id

a
xa
t_

as K m
en

ent
i
cl

corre

O
clie

se
un cli

t d _id
pas
nt_i ntier

mo lient
ep
id ne
un

à auc
dn

c
e

client_
'est
Retour à la page de login en
indiquant la cause de l'échec 1 Page liste des comptes
Page d'accueil

échec

Authentification ok
de l'utilisateur

Affiche la liste des comptes accessibles par le client

POST
client_id="5000"
passwd="monMotDePasse"

Philippe GENOUD © UJF Grenoble – 15/03/2007 5

Retour à la page de login en


indiquant la cause de l'échec 1 Page liste des comptes
Page d'accueil

échec

Authentification ok
de l'utilisateur

Affiche la liste des comptes accessibles par le client

Création à partir de client_id et passwd


Création à partir de client_id et passwd
Message d'erreur d'un objet Client
Message d'erreur d'un objet Client
transmis avec la requête Enregistrement de ce Client dans la session
<JSP …> transmis avec la requête Enregistrement de ce Client dans la session
<JSP …>

Authentification …
échec de l'utilisateur ok

accueil.jsp listeComptes.jsp

LoginServlet.java

Récupérer les paramètres protected void doPost(HttpServletRequest request,


Récupérer les paramètres
de la requête HttpServletResponse response)
POST de la requête
client_id="5000"
passwd="monMotDePasse"

Philippe GENOUD © UJF Grenoble – 15/03/2007 6


Retour à la page de login en
indiquant la cause de l'échec 1 Page liste des comptes
Page d'accueil

échec

Authentification ok
de l'utilisateur

Affiche la liste des comptes accessibles par le client

Création à partir de client_id et passwd


Création à partir de client_id et passwd
Message d'erreur d'un objet Client
Message d'erreur d'un objet Client
transmis avec la requête Enregistrement de ce Client dans la session
<JSP …> transmis avec la requête Enregistrement de ce Client dans la session
<JSP …>

Authentification …
de l'utilisateur

accueil.jsp listeComptes.jsp

LoginServlet.java

Récupérer les paramètres protected void doPost(HttpServletRequest request,


Récupérer les paramètres
de la requête HttpServletResponse response)
POST de la requête
client_id="5000"
passwd="monMotDePasse"
String clientIdS = request.getParameter("client_id");
String passwd = request.getParameter("passwd");
Ce sont des
string !
int clientId = Integer.parseInt(clientIdS );

NumberFormatException

Philippe GENOUD © UJF Grenoble – 15/03/2007 7

Retour à la page de login en


indiquant la cause de l'échec 1 Page liste des comptes
Page d'accueil

échec

Authentification ok
de l'utilisateur

Affiche la liste des comptes accessibles par le client

Création à partir de client_id et passwd


Création à partir de client_id et passwd
Message d'erreur d'un objet Client
Message d'erreur d'un objet Client
transmis avec la requête Enregistrement de ce Client dans la session
<JSP …> transmis avec la requête Enregistrement de ce Client dans la session
<JSP …>

Authentification …
de l'utilisateur

accueil.jsp listeComptes.jsp

LoginServlet.java

Récupérer les paramètres protected void doPost(HttpServletRequest request,


Récupérer les paramètres
de la requête HttpServletResponse response)
POST de la requête
client_id="5000"
passwd="monMotDePasse" ...
String loginError = "Client ID n'est pas un nombre";
request.setAttribute("erreurLogin",loginError);
getServletContext().getRequestDispatcher(
"/accueil.jsp").forward(request, response);

Philippe GENOUD © UJF Grenoble – 15/03/2007 8


Accueil.jsp
<body>
<form name="form1" method="post" action="bima">
<p>numéro d'identification
<input type="text" name="client_id" /> Réafficher les valeur
</p> des paramètres
<p>mot de passe précédents
<input type="password" name="passwd"/>
</p>
<input type="submit" value="Se connecter : " name="connect" />
</form>
Accueil.jsp
<H1>
<font color="#FF0000">
<% String loginError = (String) request.getAttribute("erreurLogin");
if (loginError
Le message d'erreur si != null)
il est présent
out.println(loginError);
%>  ${requestScope.erreurLogin}
</font> ${requestScope.erreurLogin} EL
</H1>
Message d'erreur
Message d'erreur
transmis avec la requête
Réafficher les valeur transmis avec la requête
des paramètres
précédents Authentification
de l'utilisateur
<input type="text" name="client_id"
value=" "/>

LoginServlet.java
Ecriture lourde.
<% String client_id = protected void doPost(HttpServletRequest request,
String cientID = request.getParameter("client_id"); HttpServletResponse response)
if (clientId != null)
out.println(clientID); ...
%>
 ${param.client_id}
String loginError = "Client ID n'est pas un nombre";
${param.client_id} EL request.setAttribute("erreurLogin",loginError);
getServletContext().getRequestDispatcher(
Simplifiée par utilisation de EL (Expression "/accueil.jsp").forward(request, response);
Language introduit avec JSP 2.0)

Philippe GENOUD © UJF Grenoble – 15/03/2007 9

Retour à la page de login en


indiquant la cause de l'échec 1 Page liste des comptes
Page d'accueil

échec

Authentification ok
de l'utilisateur

Affiche la liste des comptes accessibles par le client

Création à partir de client_id et passwd


Création à partir de client_id et passwd
Message d'erreur d'un objet Client
Message d'erreur d'un objet Client
transmis avec la requête Enregistrement de ce Client dans la session
<JSP …> transmis avec la requête Enregistrement de ce Client dans la session
<JSP …>

Authentification …
de l'utilisateur

accueil.jsp listeComptes.jsp

LoginServlet.java

Récupérer les paramètres protected void doPost(HttpServletRequest request,


Récupérer les paramètres
de la requête HttpServletResponse response)
POST de la requête
client_id="5000"
passwd="monMotDePasse" ...
ClientBadPasswdException Client c = new Client(dataSource, clientId, clientPasswd

HttpSession session = request.getSession();


ClientNotFoundException
session.setAttribute("client", c) ;
SQLdException getServletContext().getRequestDispatcher(
"/ListeDeComptes.jsp").forward(request, response);
CompteException

Philippe GENOUD © UJF Grenoble – 15/03/2007 10


La page listeComptes.jsp (scriplets java)

Nom et prénom du client

ListeComptes.jsp

Nom et prénom du client


N° Id du client

Pour chaque compte auquel le client a accès

N° Id du compte

solde du compte
solde du compte

Fin pour

Philippe GENOUD © UJF Grenoble – 15/03/2007 11

La page listeComptes.jsp (scriplets java)

 Il faut que la classe Client


ait un constructeur sans
paramètre (JavaBean)
Nom et prénom du client

Nom et prénom du client


N° Id du client

Pour chaque compte auquel le client a accès

N° Id du compte

solde du compte
solde du compte

Fin pour public Client implements Iterable<Compte> {

...
Iterator<Compte> iterator() {

} Pour utiliser boucle foreach,
} Client doit implémenter
interface Iterable
Philippe GENOUD © UJF Grenoble – 15/03/2007 12
Utilisation de EL (JSP 2.0) pour la page listeComptes.jsp
Import et useBean inutiles
Le conteneur JSP cherche automatiquement un attribut de nom client dans les différents scopes (page, request,
session …) ${client}  <%= pageContext.findAttribute("client") %>

Nom et prénom du client

Nom et prénom du client


N° Id du client

Pour chaque compte auquel le client a accès


Code généré à la compilation de la JSP

N° Id du compte L'expression est évaluée à l'exécution


(via java.lang.reflect).
solde du compte clien est null  "" (chaîne vide)
solde du compte
EL (Expression Language) limite
Fin pour
utilisation du langage Java
 Facilité et lisibilité pour non spécialiste.

Mais cela a aussi des inconvénients …


Moins de vérifications sont effectuées
à la compilation de la JSP
Philippe GENOUD © UJF Grenoble – 15/03/2007 13

Page JSP contenant une expression EL erronée (par ex. faute de frappe)

${client.clientID
${client.clientID}}
clientID au lieu de clientId
Compilation

Exécution

Erreur détectée non


pas à la compilation de
la jsp en une servlet,
mais à son exécution !

Philippe GENOUD © UJF Grenoble – 15/03/2007 14


Utilisation de EL (JSP 2.0) pour la page listeComptes.jsp (suite)

Nom et prénom du client

Nom et prénom du client


N° Id du client

Pour chaque compte auquel le client a accès 1ère solution


Remettre du java ?
N° Id du compte Oui… mais il faut que dans le scope de la page
il y ait un attribut "c" de type Compte
solde du compte
solde du compte
2ème solution
Fin pour Utiliser la JSTL (Java
Standard Tag Library)

Philippe GENOUD © UJF Grenoble – 15/03/2007 15

Utilisation de EL + JSTL (JSP 2.0) pour la page listeComptes.jsp (fin)

Les librairies de Tag utilisées doivent être indiquées avec une directive @taglib

Nom et prénom du client

Nom et prénom du client


N° Id du client

Pour chaque compte auquel le client a accès Tag foreach de la core librairie de JSTL

N° Id du compte Ne pas oublier d'intégrer les


jar de JSTL dans les
solde du compte librairies du projet
solde du compte

Fin pour

Philippe GENOUD © UJF Grenoble – 15/03/2007 16


Les différents composants (JSP, Servlet) de l'application
Retour à la page de login en
indiquant la cause de l'échec 1 Page liste des comptes
Page d'accueil

échec

Authentification ok
de l'utilisateur
<JSP
<JSP …>
…> <JSP
<JSP …>
…>

… …

LoginServlet

accueil.jsp listeComptes.jsp

Permet de Page pour effectuer un transfert


sélectionner L'utilisateur n'a plus accès
le compte à l'application à moins de
source et le Déconnexion repasser par la phase
compte 2' d'authentification
destination <JSP
<JSP …>
…>
et le montant …
… LogoutServlet
du transfert
2 Page de déconnexion
transfert.jsp
1

Réalisation du TransfertServlet
Page affichage des transfert
2'
2
résultats du transfert

<JSP
<JSP …>
…>

bye.jsp
1 <JSP
<JSP …>
…>

2'
2 apresTransfert.jsp
Philippe GENOUD © UJF Grenoble – 15/03/2007 17

Page pour effectuer un transfert

<JSP
<JSP …>
…>

Sélectionnez le compte à créditer


transfert.jsp
Sélectionnez le compte à débiter
POST Le compte à débiter et le compte à
source="1234567" créditer doivent être différents
destination="2345679"
Montant=5000 Indiquez un montant

Montant du transfert n'est pas un nombre


Récupérer les paramètres
Récupérer les paramètres
de la requête et vérfier leur validité
de la requête et vérfier leur validité
TransfertServlet
Si problème retour à la page Transfert.jsp
Si problème retour à la page Transfert.jsp
avec message d'erreur placé en
avec message d'erreur placé en
attribut de la requête
attribut de la requête

Réalisation de l'opération de transfert


Réalisation de l'opération de transfert
forwarding à la page apresTransfert.jsp avec en
forwarding à la page apresTransfert.jsp avec en
attribut dans la requête un message indiquant le
attribut dans la requête un message indiquant le
resultat de l'opération
resultat de l'opération

Transfert effectué
Page affichage des Montant du transfert supérieur au maximum autorisé
résultats du transfert

<JSP
<JSP …>
…>

apresTransfert.jsp 18
Philippe GENOUD © UJF Grenoble – 15/03/2007
1

La même page est réaffichée sans


mise à jour du solde des comptes !

La page correspondant à
http://localhost:8090/BANQUE_IMA/transfert.jsp
2
est dans le cache du navigateur

Philippe GENOUD © UJF Grenoble – 15/03/2007 19

Empêcher les pages d'être mises en cache


 en-têtes Cache-Control Expires dans la réponse HTTP
Caching Tutorial for Web Authors and Webmasters http://www.mnot.net/cache_docs/

Insérer le fragment de jsp suivant dans chacune des pages jsp de l'application
noCacheHeader.jspf
<%
response.setHeader("Expires", "Sat, 6 May 1995 12:00:00 GMT");

// Set standard HTTP/1.1 no-cache headers.


response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");

// Set IE extended HTTP/1.1 no-cache headers (use addHeader).


response.addHeader("Cache-Control", "post-check=0, pre-check=0");

// Set standard HTTP/1.0 no-cache header.


response.setHeader("Pragma", "no-cache");
%>

Dans le code des pages JSP Dans le fichier web.xml

<%@include file="/jspf/noCacheHeader.jspf" %> <jsp-config>


<jsp-property-group>
Inclus le fichier dans le source JSP avant que celui- <url-pattern>*.jsp</url-pattern>
<include-prelude>
ci ne soit interprété (traduit en servlet) par le moteur
/jspf/noCacheHeader.jspf
JSP </include-prelude>
</jsp-property-group>
Insertion à la compilation et non pas à l’exécution
</jsp-config>
 un changement du fichier inclus ne
provoque pas une régénération de la servlet En tête commun à toutes les pages définies par
url-pattern
<include-coda> … </include-coda> pour pied de page
Philippe GENOUD © UJF Grenoble – 15/03/2007 20
L'utilisateur n'a plus accès
à l'application à moins de
Déconnexion repasser par la phase
d'authentification

Rediriger vers la page Bye.jsp en plaçant le nom et


LogoutServlet Rediriger vers la page Bye.jsp en plaçant le nom et
prénom de l'utilisateur comme attributs de la
prénom de l'utilisateur comme attributs de la
requête
requête
Terminer la session
Terminer la session

nom="DUPONT" protected void doPost(HttpServletRequest request,


HttpServletResponse response) {
prenom="Jean"

Page de déconnexion HttpSession session = request.getSession();


Client c = session.setAttributeet("client) ;
request.setAttribute("nom",c.getNom());
request.setAttribute("prenom",c.getPrenom());

getServletContext().getRequestDispatcher(
"/Bye.jsp").forward(request, response);
<JSP
<JSP …>
…>

… session.invalidate();

}
Bye.jsp
HttpServletRequest

HttpSession getSession() retourne la session courrante associée à la requête


ou si la requête n'a pas de session en crée une nouvelle et la retourne

HttpSession getSession(boolean create) idem à getSession si create == true, si create == false


et que la requête n'a pas de session renvoie null

HttpSession
void invalidate() invalide cette session et retire (unbinds) tous les objets qui lui étaient associés.

Philippe GENOUD © UJF Grenoble – 15/03/2007 21

ServeurTomcat
GET
GET BANQUE_IMA_0EL
BANQUE_IMA_0EL
session1
crée
request.getSession()
Accueil.jsp

POST
POST BANQUE_IMA_0EL/bimaLogin
BANQUE_IMA_0EL/bimaLogin
1 client_id
client_id == "5000"
"5000"
passwd crée client
passwd == "toto"
"toto"
LoginServlet

ajoute client

récupère client

ListeComptes.jsp

GET
GET BANQUE_IMA_0EL/bimaLogout
BANQUE_IMA_0EL/bimaLogout
LogoutServlet

Bye.jsp invalide
3

La requête POST est à nouveau


envoyée au serveur

POST
POST BANQUE_IMA_0EL/bimaLogin
BANQUE_IMA_0EL/bimaLogin
client_id
client_id == "5000"
"5000"
4 crée session2
passwd
passwd == "toto"
"toto"
request.getSession()

Ne faire ce traitement que si la crée client


LoginServlet

session ne vient pas d'être créée (on


est passé par la page accueil.jsp) ajoute client

Sinon rediriger vers la page d'accueil récupère client

ListeComptes.jsp
Philippe GENOUD © UJF Grenoble – 15/03/2007 22
LoginServlet.java

protected void doPost(HttpServletRequest request,


HttpServletResponse response) {

String clientIdS = request.getParameter("client_id");


String passwd = request.getParameter("passwd");
int clientId = Integer.parseInt(clientIdS );

HttpSession session = request.getSession(); Récupère un objet session et le crée


si pas de session associée à la requête

if (session.isNew()) {
getServletContext().getRequestDispatcher(
"/accueil.jsp").forward(request, response);
return;
}

Client c = new Client(dataSource, clientId, clientPasswd);


Ne faire ce traitement que si la
session.setAttribute("client", c) ; session ne vient pas d'être créée (on
est passé par la page accueil.jsp)
getServletContext().getRequestDispatcher(
"/listeComptes.jsp").forward(request, response); Sinon rediriger vers la page d'accueil

Philippe GENOUD © UJF Grenoble – 15/03/2007 23

ServeurTomcat
GET
GET BANQUE_IMA_0EL
BANQUE_IMA_0EL
session1
crée
request.getSession()

POST Accueil.jsp
POST BANQUE_IMA_0EL/bimaLogin
BANQUE_IMA_0EL/bimaLogin
1 client_id
client_id == "5000"
"5000"
passwd crée client
passwd == "toto"
"toto"
LoginServlet

ajoute client

récupère client

ListeComptes.jsp

2 GET
GET BANQUE_IMA_0EL/transfert.jsp
BANQUE_IMA_0EL/transfert.jsp
récupère client

transfertl.jsp

3 GET
GET BANQUE_IMA_0EL/bimaLogout
BANQUE_IMA_0EL/bimaLogout
LogoutServlet

4 Bye.jsp invalide

GET
GET BANQUE_IMA_0EL/transfert.jsp
BANQUE_IMA_0EL/transfert.jsp
session2
crée request.getSession()

Le client n'existe pas, mais comme on récupère client


utilise EL affichage de chaînes vides
transfertl.jsp
(sinon on aurait NullPointerException)

Philippe GENOUD © UJF Grenoble – 15/03/2007 24


Pour toutes les JSP et Servlets de l'application ne faire le traitement
que si une session est présente et que l'objet client est présent

HttpSession = request.getSession(false);

if (session == null || session.getAttribute("client") == null) {


getServletContext().getRequestDispatcher(
"/accueil.jsp").forward(request, response);
return;
}

Mettre en œuvre ce traitement pour toutes les jsp


et les servlets TransfertServlet et LogoutServlet

Pour mettre en place ce traitement facilement utiliser un filtre de servlets

Introduits à partir de la version 2.3 de l'API des servlets les filtres permettent
d'intercepter les requêtes et réponses des servlets

Nombreuses utilisations des filtres :

• authentificiation
• redirection
• modification des entêtes
• cryptage des données
•…

Philippe GENOUD © UJF Grenoble – 15/03/2007 25

Un filtre : classe Java qui implémente l'interface javax.servlet.Filter

request request

Servlet

response response

public class SimpleFilter implements Filter {

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)


throws IOException, ServletException {

HttpServletRequest httpRequest = (HttpServletRequest) request;


System.out.println("Dans SimpleFilter filtrage de la requete " + httpRequest.getRequestURL());
Appel au prochain objet (une filtre ou la
chain.doFilter (request, response);
servlet) dans la chaîne de filtrage

System.out.println ("Dans SimpleFilter filtrage de la réponse ...");


}

...
}
Philippe GENOUD © UJF Grenoble – 15/03/2007 26
Le déploiement des filtres s'effectue au travers du fichier web.xml

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" ...>

<!– Definition des filtres présents dans l'application Web -->


<filter>
<filter-name>SimpleFilter</filter-name>
<filter-class>bima.filters.SimpleFilter</filter-class>
</filter>
...

<!– association des filtres à des servlets ou des urls -->


<filter-mapping>
<filter-name>SimpleFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-– Définition des servlets -->


<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>bima.controler.LoginServlet</servlet-class>
</servlet>
...
<!– servlets mappings -->
...
</web-app>

Philippe GENOUD © UJF Grenoble – 15/03/2007 27

Plusieurs filtres peuvent être définis et appliqués à la même URL.


Chaînage effectué par appel à chain.doFilter (request, response);

request request request request

MaServlet

response response response response


Filtre1 Filtre2 Filtre3

public class Filtre1Class implements Filter {


<!– Definition des filtres présents -->
public void doFilter(ServletRequest request, <filter>
ServletResponse response, FilterChain chain) <filter-name>Filtre1</filter-name>
throws IOException, ServletException { <filter-class>Filtre1Class</filter-class>
</filter>
System.out.println("Dans Filtre1 filtrage de la requete" ); <filter>
chain.doFilter (request, response); <filter-name>Filtre3</filter-name>
System.out.println ("Dans Filtre1 filtrage de la réponse"); <filter-class>Filtre3Class</filter-class>
public
} class Filtre2Class implements Filter { </filter>
<filter>
public void doFilter(ServletRequest request,
... <filter-name>Filtre2</filter-name>
ServletResponse response, FilterChain chain) <filter-class>Filtre2Class</filter-class>
}
throws IOException, ServletException { </filter>

System.out.println("Dans Filtre2 filtrage de la requete" );


chain.doFilter (request, response); <!– association des filtres à des urls -->
System.out.println ("Dans Filtre2 filtrage de la réponse"); <filter-mapping>
public class Filtre3Class implements Filter {
} <filter-name>Filtre1</filter-name> L'ordre
public void doFilter(ServletRequest request, <url-pattern>/uneURL</url-pattern> d'exécution est
... </filter-mapping>
ServletResponse response, FilterChain chain)
}
throws IOException, ServletException { <filter-mapping> défini par l'ordre
<filter-name>Filtre2</filter-name> des mappings
System.out.println("Dans Filtre3 filtrage de la requete" ); <url-pattern>/uneURL</url-pattern> dans le
chain.doFilter (request, response); </filter-mapping>
System.out.println ("Dans Filtre3 filtrage de la
Dans Filtre1 réponse");
filtrage de la requete <filter-mapping> descripteur de
} Dans Filtre2 filtrage de la requete <filter-name>Filtre3</filter-name> déploiement
Dans Filtre3 filtrage de la requete <url-pattern>/uneURL</url-pattern>
... Dans Filtre3 filtrage de la réponse </filter-mapping>
} Dans Filtre2 filtrage de la réponse
Dans Filtre1 filtrage de la réponse
Philippe GENOUD © UJF Grenoble – 15/03/2007 28
Un filtre peut "courcircuiter" la chaîne de filtrage pour effectuer des aiguillages

t
u es
request req MaServlet
se
p on
res

req
response ue
st
FiltreAiguilleur re s
pon
se UnPageJSP

<!– Definition des filtres présents -->


<filter>
<filter-name>FiltreAiguilleur</filter-name>
<filter-class>UnFiltre</filter-class>
</filter>
public class UnFiltre implements Filter { <!– association des filtres à des urls -->
<filter-mapping>
public void doFilter(ServletRequest request, <filter-name>FiltreAiguilleur</filter-name>
ServletResponse response, FilterChain chain) <url-pattern>/maServlet</url-pattern>
throws IOException, ServletException { </filter-mapping>

if (condition) {
RequestDispatcher rd = request.getRequestDispatcher("/UnePageJSP.jsp");
rd.dispatch(request,respeonse);
}
else
chain.doFilter (request, response);
}

...
}

Philippe GENOUD © UJF Grenoble – 15/03/2007 29

Par défaut le filtre n'est appliqué qu'aux requêtes issues directement du client mais pas aux
requêtes forwardées
<web-app
<web-app version="2.4"
version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns="http://java.sun.com/xml/ns/j2ee" ...>
...>
public class Servlet1 extends HttpServlet {
<!– Definition des filtres présents dans l'application Web -->
protected void doGet(HttpServletRequest request, HttpServletResponse response) <filter>
throws ServletException, IOException { <filter-name>Filtre1</filter-name>
System.out.println("Dans servlet 1"); <filter-class>filters.Filter1</filter-class>
request.getRequestDispatcher("/Servlet2").forward(request,response); </filter>
}
<filter>
… <filter-name>Filtre2</filter-name>
} <filter-class>filters.Filter2</filter-class>
</filter>
public class Servlet2 extends HttpServlet {
<!– association des filtres à des servlets ou des urls -->
protected void doGet(HttpServletRequest request, HttpServletResponse response) <filter-mapping>
throws ServletException, IOException { <filter-name>Filtre1</filter-name>
System.out.println("Dans servlet 2"); <url-pattern>/Servlet1</url-pattern>
response.setContentType("text/html;charset=UTF-8"); </filter-mapping>
PrintWriter out = response.getWriter();
out.println("<html>"); <filter-mapping>
out.println("<head>"); <filter-name>Filtre2</filter-name>
out.println("<title>Servlet Servlet2</title>"); <url-pattern>/Servlet2</url-pattern>
out.println("</head>"); </filter-mapping>
out.println("<body>");
out.println("<h1>Servlet Servlet2 at " + request.getContextPath () + "</h1>");
out.println("</body>"); <!-–
<!-– Définition
Définition des
des servlets
servlets -->
-->
out.println("</html>"); <servlet>
<servlet>
out.close(); <servlet-name>Servlet1</servlet-name>
<servlet-name>Servlet1</servlet-name>
} <servlet-class>servlet.Servlet1</servlet-class>
<servlet-class>servlet.Servlet1</servlet-class>
</servlet>
</servlet>
Dans Filtre1 filtrage de la requete http://localhost:8090/Test/Servlet1
… ……
Dans servlet 1
} <!–
<!– servlets
servlets mappings
mappings -->
-->
Dans servlet 2
...
...
Dans Filtre1 filtrage de réponse
</web-app>
</web-app>

request request
Servlet1
request
forward Servlet2
response
response response
Filtre1

Philippe GENOUD © UJF Grenoble – 15/03/2007 30


Depuis version 2.4 des servlets possibilité de contrôler dans le fichier de déploiement
Dans quel "contexte de dispatching" les filtres doivent être invoqués
<web-app
<web-app version="2.4"
version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns="http://java.sun.com/xml/ns/j2ee" ...>
...>
<!– Definition des filtres présents dans l'application Web -->
<filter>
<filter-name>Filtre1</filter-name>
<filter-class>filters.Filter1</filter-class>
</filter>

<filter>
<filter-name>Filtre2</filter-name>
<filter-class>filters.Filter2</filter-class>
</filter>
Filtre appliqué :
- au requêtes issues du client <!– association des filtres à des servlets ou des urls -->
<filter-mapping>
- au requêtes issues d'un forward <filter-name>Filtre1</filter-name>
<url-pattern>/Servlet1</url-pattern>
<dispatcher>REQUEST</dispatcher> </filter-mapping>

<dispatcher>FORWARD</dispatcher> <filter-mapping>
<filter-name>Filtre2</filter-name>
<url-pattern>/Servlet2</url-pattern>
</filter-mapping>

<!-–
<!-– Définition
Définition des
des servlets
servlets -->
-->
<servlet>
<servlet>
Dans Filtre1 filtrage de la requete http://localhost:8090/Test/Servlet1 <servlet-name>Servlet1</servlet-name>
<servlet-name>Servlet1</servlet-name>
Dans servlet 1 <servlet-class>servlet.Servlet1</servlet-class>
<servlet-class>servlet.Servlet1</servlet-class>
Dans Filtre2 filtrage de la requete http://localhost:8090/Test/Servlet2 </servlet>
</servlet>
Dans servlet 2 ……
Dans Filtre2 filtrage de la réponse <!–
<!– servlets
servlets mappings
mappings -->
-->
Dans Filtre1 filtrage de réponse ...
...
</web-app>
</web-app>

request request
Servlet1
request
request
forward Servlet2
response
response
response response
Filtre1 Filtre2

Philippe GENOUD © UJF Grenoble – 15/03/2007 31

Exercices :

1) En utilisant un mécanisme de filtrage modifier l'application


pour qu'après s'être déconnecté l'utilisateur soit directement
redirigé vers la page d'accueil si il tente d'accéder à l'une des
pages de l'application

2) La page transfert.jsp utilise des scriptlets java,


la modifier pour, comme pour les autres pages JSP de l'application
ne faire appel qu'à l'EL.

3) Mettre en place une page d'erreur sur laquelle on sera


automatiquement redirigé en cas de SQLException

Philippe GENOUD © UJF Grenoble – 15/03/2007 32

Вам также может понравиться