Vous êtes sur la page 1sur 80

1

Java avanc pour le dveloppement


dapplications Web
Ecole Suprieure de Technologie de Sal
Pr Y.Lefdaoui
1
Contenu du cours
Servlets et API
Cycle de vie
Traitement des donnes de formulaires
Suivi de session
Collaboration de Servlets
Accs aux BD avec JDBC
Mise en uvre de la technologie JSP
Le modle MVC
Dveloppement d'applications
Web
2
2
Prsentation des Technologie Servlets
Dveloppement d'applications Web 3
Le Web en Java - 1
Le dveloppement Web en Java se base sur
plusieurs frameworks standard
LAPI Servlets (actuellement version 2.5)
JSP ou JavaServer Pages (actuellement version 2.1)
Nous tudierons les deux premiers dans ce cours
Les servlets permettent de construire des pages
Web dynamiques en embotant la prsentation
HTML dans le code.
Inversement, les pages JSP embotent le code
dans la prsentation HTML
3
Le Web en Java - 2
Gnralement on utilise les deux techniques
simultanment pour implmenter le pattern MVC :
Le browser de lutilisateur, via une page html (ou jsp) appelle
une servlet en remplissant un formulaire prcisant sa
demande. La servlet sexcute sur le serveur, effectue le
travail logique demand, stocke le ou les rsultats dans la
requte ou la session puis forwarde vers une page jsp (les
Views).
Celle-ci rcupre les rsultats stocks et se charge de leur
prsentation en HTML/CSS. Cette page html est envoye au
browser.
Lidal est de ncrire quune seule servlet qui fait le
dispatching (Contrleur)
Quest ce qu'une servlet
Servlet: Server-side applet
Une servlet est un programme Java utilis pour tendre les
fonctionnalits d'un serveur Web et pour accder des systmes
dj existants.
Permet de grer des requtes HTTP et de fournir au client une
rponse HTTP
Une Servlet sexcute dans un moteur de Servlet ou conteneur
de Servlet permettant dtablir le lien entre la Servlet et le
serveur Web
Une Servlet sexcute par l'intermdiaire d'une machine virtuelle
C'est une application :
ct serveur
Utilise pour gnrer du contenu dynamique
Charge dynamiquement quand elle est demande.
Dveloppement d'applications Web 6
4
Architecture Servlets
Dveloppement d'applications Web 7
Les Servlets peuvent tre toutes
gres par des thread spars au
sein dun mme processus de
machine virtuelle
Avantages des servlets
Les servlets ont de nombreux avantages par
rapport aux autres technologies ct serveur.
Tout d'abord, tant donn qu'il s'agit d'une technologie
Java, les servlets fournissent un moyen d'amliorer les
serveurs web sur n'importe quelle plateforme, d'autant
plus que les servlets sont indpendantes du serveur web
Une servlet sexcute dans un conteneur de servlet qui
est indpendant du serveur web
D'autre part les servlets sont beaucoup plus performantes
que les scripts, car il s'agit de pseudo-code (code java
compil), charg automatiquement lors du dmarrage du
serveur ou bien lors de la connexion du premier client.
Typage fort de Java
Gestion des erreurs par exception
5
Avantages des servlets
Les servlets sont donc actives (rsidentes en mmoire)
et prtes traiter les demandes des clients grce des
threads,
tandis qu'avec les langages de script traditionnels un
nouveau processus est cr pour chaque requte HTTP.
Cela permet donc une charge moins importante au
niveau du processeur du serveur
L'un des principaux atouts des servlets est la
rutilisation, permettant de crer des composants
encapsulant des services similaires, afin de pouvoir les
rutiliser dans des applications futures.
Enfin une servlet tant une application Java, peut
utiliser toutes les API Java afin de communiquer avec
des applications extrieures, se connecter des bases
de donnes, accder aux entre-sorties.
Architecture du package servlet.jar
Les servlets sont des classes Java implmentant des
classes et des interfaces provenant des packages :
javax.servlet : un package gnrique indpendant du
protocole utilis
javax.servlet.http: un package spcifique au protocole
HTTP 1.0
Accessoirement le package java.io doit tre import,
notamment pour grer les entres-sorties et les
exceptions.
Le package javax.servlet est fourni dans le JSDK (Java
Servlet Development Kit. (Fichier servlet.jar)
6
Architecture du
package servlet.jar
Ainsi toutes les servlets implmentent
directement ou indirectement l'interface
Servlet, en drivant une classe qui
l'implmente: c'est--dire gnralement la
classe HttpServlet, elle-mme issue de
GenericServlet.
La classe GenericServlet
(javax.servlet.GenericServlet) dfinit une
classe abstraite (implmentation de base
de l'interface Servlet).
Servlet
GenericSr
vlet
service()
HttpServl
et
doPost()
doGet()
NotreServ
let
doPost()
doGet()
HttpServletRequest
Mthode Description
String getMethod()
Rcupre la mthode HTTP utilise par le
client
String getHeader(String Key)
Rcupre la valeur de l'attribut Key de l'en-
tte
String getRemoteHost() Rcupre le nom de domaine du client
String getRemoteAddr() Rcupre l'adresse IP du client
String getParameter(String
Key)
Rcupre la valeur du paramtre
Key (cl) d'un formulaire.
Lorsque plusieurs valeurs sont
prsentes, la premire est
retourne
String[] getParameterValues(String
Key)
Rcupre les valeurs correspondant au
paramtre Key (cl) d'un formulaire,
c'est--dire dans le cas d'une slection
multiple (cases cocher, listes choix
multiples) les valeurs de toutes les entits
slectionnes
Enumeration getParameterNames()
Retourne un objet Enumeration contenant la
liste des noms des paramtres passs la
requte
String getServerName() Rcupre le nom du serveur
String getServerPort() Rcupre le numro de port du serveur
7
Les request headers
HttpServletResponse
Mthode Description
String setStatus(int StatusCode) Dfinit le code de retour de la rponse
void setHeader(String Nom, String Valeur) Dfinit une paire cl/valeur dans les en-ttes
void setContentType(String
type)
Dfinit le type MIME de la rponse
HTTP, c'est--dire le type de
donnes envoyes au navigateur
void setContentLength(int len) Dfinit la taille de la rponse
PrintWriter getWriter()
Retourne un objet PrintWriter
permettant d'envoyer du texte au
navigateur client. Il se charge de
convertir au format appropri les
caractres Unicode utiliss par Java
ServletOutputStream getOutputStream()
Dfinit un flot de donnes envoyer au client, par
l'intermdiaire d'un objet ServletOutputStream, driv de
la classe java.io.OutputStream
void sendredirect(String
location)
Permet de rediriger le client vers l'URL
location
8
Gestion des servlets
Moteur de
Servlets
Rponse HTTP 1
Rponse HTTP 2
Thread
Thread
Crer un pool
de threads
Servlet
Instancier la servlet
Appeler la mthode init()
Requte HTTP 2
Affecter une requte un thread
Requte HTTP 1
Affecter une requte un thread Appeler la mthode service()
Appeler la mthode service()
Appeler la mthode destroy()
Terminer le pool de threads
Initialisation
Excution
service
Excution
service
Le cycle de vie d'un servlet
Tous les servlets ont le mme cycle de vie
Le container charge le servlet
La fonction init() est appele (initialisation de variables,
connection des bases de donnes)
Le servlet rpond aux requtes des clients
Le contaire dtruit le servlet
La fonction destroy() est appele (fermeture des
connections)
9
Cycle de vie dune servlet
Le serveur cre un pool de threads auxquels il va pouvoir
affecter chaque requte
La servlet est charge au dmarrage du serveur ou lors de la
premire requte
La servlet est instancie par le serveur
La mthode init() est invoque par le conteneur
Lors de la premire requte, le conteneur cre les objets
Request et Response spcifiques la requte
La mthode service() est appele chaque requte dans un
nouveau thread. Les objets Request et Response lui sont
passs en paramtre
Grce l'objet request, la mthode service() va pouvoir
analyser les informations en provenance du client
Grce l'objet response, la mthode service() va fournir une
rponse au client
La mthode destroy() est appele lors du dchargement de la
servlet, c'est--dire lorsqu'elle n'est plus requise par le
serveur. La servlet est alors signale au garbage collector .
Architecture Servlets
Dveloppement d'applications Web 18
Les Servlets peuvent tre toutes
gres par des thread spars au
sein dun mme processus de
machine virtuelle
10
Interface dune servlet
Pour crer une servlet il est indispensable de mettre en
oeuvre l'interface javax.servlet.Servlet permettant au
conteneur d'assurer le cycle de vie de la servlet.
La mise en place de l'interface (gnralement ralise
en tendant javax.servlet.GenericServlet ou
javax.servlet.HttpServlet) fait appel cinq mthodes :
public void init(ServletConfig config) throws
ServletException
public void service(ServletRequest req, ServletResponse
res) throws ServletException, IOException
public ServletConfig getservletConfig()
public String getServletInfo()
public void destroy()
Premire Servlet
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class PremiereServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws
ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD><TITLE> Titre </TITLE></HEAD>");
out.println("<BODY>");
out.println("Ma premire servlet");
out.println("</BODY>");
out.println("</HTML>");
out.close();
}
}
11
Dploiement dune servlet
Avec Tomcat
Pour dfinir une application Web, crer le fichier
<tomcat_dir>/conf/catalania/localhost/nomAPP.xml
<Context path="/nomAPP" reloadable="true"
docBase="D:\eclipse-SDK-3.0-
win32\eclipse\workspace\nomAPP" workDir="D:\eclipse-SDK-
3.0-win32\eclipse\workspace\nomAPP\work" />
Dans cet exemple, l'application web se nomme nomAPP
Mettre les classes dans <docBase>/WEB-INF/classes
web.xml
Le fichier web.xml donne des instructions sur le
dploiement du servlet dans le container
web-app
La description d'une Web Application
Servlet
La relation entre le nom du servlet et la classe qui
l'implante
Servlet-mapping
La relation entre le nom du servlet et l'url qui permet
d'y accder
12
Descripteur de dploiement de la
servlet : web.xml
Crer le fichier <docBase>/WEB-INF/web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
<web-app>
<servlet>
..
</servlet>
</web-app>
Descripteur de dploiement de la
servlet : web.xml
<web-app>
<servlet>
<servlet-name> ps </servlet-name>
<servlet-class> PremiereServlet </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ps</servlet-name>
<url-pattern>/first</url-pattern>
</servlet-mapping>
</web-app>
13
Charger et invoquer une Servlet
D'une manire gnrale, une URL du type :
http://host:port/nomApp/first?param1=value1&
Machine ou
se trouve le
serveur de
servlets
Numro de port
sur lequel il est
lcoute
Alias
correspondant
<url-pattern>
Liste des
paramtres et
de leurs
valeurs
Web appli.
Serveur
Vous devez disposer dun servlet container (Tomcat).
Crez une configuration dans Eclipse.
dans Eclipse : ouvrez l'onglet Servers (Windows
Show View Other Server Servers)
dans cet onglet cliquez droite : New Server
choisissez Tomcat, cliquez Next, entrez l'adresse o est
install Tomcat via le bouton Browse et cliquez sur
Finish
dans l'onglet Servers apparat maintenant Tomcat;
double cliquez dessus; dans la fentre qui s'ouvre,
suivez le lien "Open launch configuration
Cliquez sur OK
14
Installation
Dans Eclipse, vous crez un Dynamic Web
Project : New Project Web Dynamic Web
Project.
Si votre projet utilise aussi des EJB 3.0, un
serveur dapplication est obligatoire et dans ce
cas dans Eclipse, crez un Enterprise Application
Project (New Project J2EE Enterprise
Application Project, donnez un nom, faites Next,
puis Next, cochez Generate deployment
descriptor, cliquez sur New Module et
selectionnez EJB Module et Web Module)
Quelle que soit la technique utilise, vrifiez que
les jar pour les servlets et JSP (servlet-api.jar et
jsp-api.jar) soient dans votre classpath.
Dploiement
Avant dexcuter une servlet ou une page JSP, vous
devez dployer votre application.
Pour cela il vous faut crer un fichier war (web archive)
si vous travaillez avec un Dynamic Web Project seul.
Si vous dveloppez un Enterprise Application Project, il
faut crer un fichier ear (entreprise archive, qui contient
le fichier war et le fichier jar o sont placs les EJB).
Pour dployer, il suffit de copier ce fichier war ou ce
fichier ear dans la directory webapps de Tomcat ou
deploy de JBoss.
La cration de larchive dployer et le dploiement
peut se faire en une seule tape dans Eclipse en
exportant le projet concern sous forme de WAR ou EAR
dans la directory voulue.
15
Application Web: les besoins
Applications Web
fonctions rparties entre plusieurs systmes
reposent sur les architectures n-tiers
Chaque systme contient une partie de
lapplication
les parties manquantes sont excutes sur les autres
systmes
les informations sont changes sur le rseau
3 parties
partie prsentation
partie applicative/oriente mtier
partie stockage
Dveloppement d'applications Web 29
Premire servlet
Dveloppement d'applications Web 30
16
HttpServlet : requte et rponse
La mthode service() et par consquent les mthodes de
traitement de requtes (ex : doPost()) sont appeles
un objet requte
un objet rponse
Dveloppement d'applications Web 31
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SampleServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
...
}
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
...
}
}
HttpServlet :
objet requte HttpServletRequest
HttpServletRequest hrite de ServletRequest
Cet objet encapsule la requte HTTP et fournit des mthodes pour accder
aux informations
du client
de l'environnement du serveur
Exemples de mthodes
String getMethod() : retourne le type de requte
String getServeurName() : retourne le nom du serveur
String getParameter(String name) : retourne la valeur d'un paramtre
String[] getParameterNames() : retourne le nom des les paramtres
String getRemoteHost() : retourne l'IP du client
String getServerPort() : retourne le port sur lequel le serveur coute
String getQueryString() : retourne la chane dinterrogation
Dveloppement d'applications Web 32
17
HttpServlet :
objet requte HttpServletRequest
Exemple : Servlet qui affiche un certains nombre
d'informations issues de HttpServletRequest
Dveloppement d'applications Web 33
public class InfosServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse
res)
throws ServletException, IOException {
response.setContentType("text/plain");
PrintWriter out= response.getWriter();
out.println("Protocol: " + request.getProtocol());
out.println("Scheme: " + request.getScheme());
out.println("ServerName: " + request.getServerName());
out.println("ServerPort: " + request.getServerPort());
out.println("RemoteAddr: " + request.getRemoteAddr());
out.println("RemoteHost: " + request.getRemoteHost());
out.println("Method: " + request.getMethod());
...
}
}
HttpServlet :
objet rponse HttpServletResponse
HttpServletResponse hrite de ServletResponse
Cet objet est utilis pour construire un message de rponse
HTTP renvoy au client, il contient les mthodes
ncessaires pour dfinir le type de contenu, en-tte et code
de retour un flot de sortie pour envoyer des donnes (par
exemple HTML) au client
Exemples de mthodes
void setStatus(int) : dfinit le code de retour de la rponse
void setContentType(String) : dfinit le type de contenu MIME
ServletOutputStreamgetOutputStream() : flot pour envoyer des
donnes binaires au client
void sendRedirect(String) : redirige le navigateur vers l'URL
Dveloppement d'applications Web 34
18
HttpServlet :
objet rponse HttpServletResponse
Exemple 1 : crit un message de type TEXT au client
Utilisation de la mthode PrintWriter getWriter()
Dveloppement d'applications Web 35
public class HelloWorldPrintWriter extends HttpServlet {
public void doGet(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
out.println("Premier Message");
out.println(" Vous etes en session de formation");
out.println(" Mise en uvre des servlets");
}
}
HttpServlet :
objet rponse HttpServletResponse
Exemple 2 : effectue une re-direction vers un site web
Utilisation de la mthode sendRedirect(String)
Dveloppement d'applications Web 36
public class SendRedirect extends HttpServlet {
public void doGet(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException {
res.sendRedirect("http://www.google.fr");
}
}
19
HttpServlet :
objet rponse HttpServletResponse
Exemple 3 : effectue un tlchargement de fichier sur le client
Dveloppement d'applications Web 37
public class DownloadFileServlet extends HttpServlet {
protected void doGet(HttpServletRequest arg0, HttpServletResponse
arg1)
throws ServletException, IOException {
try {
InputStream is = new FileInputStream("c:/dd.txt");
OutputStream os = arg1.getOutputStream();
arg1.setContentType("text/plain");
arg1.setHeader("Content-
Disposition","attachment;filename=toto.txt");
int count;
byte buf[] = new byte[4096];
while ((count = is.read(buf)) > -1)
os.write(buf, 0, count);is.close();os.close();
} catch (Exception e) {
// Y a un problme.
}}}
HttpServlet :
objet rponse HttpServletResponse
Exemple 4 : effectue un pull client
Dveloppement d'applications Web 38
public class PullClientServlet extends HttpServlet {
private int count = 10;
protected void doGet(HttpServletRequest req, HttpServletResponse
resp)
throws ServletException, IOException {
resp.setContentType("text/plain");
PrintWriter out = resp.getWriter();
if (count > 0) {
resp.setHeader("Refresh","1");
count--
out.println(count + "...");
} else {
out.println("Fin");
}}}
Toutes les 1 seconde
la page est recharge
et cela 10 fois de suite
20
Traitement de donnes
des formulaires
Dveloppement d'applications Web 39
Traitement de donnes
Un formulaire HTML
permet de saisir les donnes
mcanisme pour envoyer les donnes au serveur Web
Rappel: les balises
FORM": pour dfinir un formulaire
INPUT": pour dfinir un lment dinterface
text,
password,
checkbox,
radio,
submit, reset
TEXTAREA": zone de texte sur plusieurs lignes
SELECT": liste droulante
Dveloppement d'applications Web 40
21
Paramtres provenant des
formulaires : principe
Rcupration de paramtres en
provenance dun formulaire
Les paramtres de formulaires sont
rcuprables via HttpServletRequest
La rcupration se fait par les
mthodes suivantes :
Enumeration getParameterNames()
String getParameterValues(String name)
String getParameter(String name)
Traitement des donnes (2)
Attributs de <FORM>
action: URL o envoyer les donnes
method: mthode utiliser pour lenvoi (GET/POST)
Les donnes sont envoyes lorsque lon clique sur un
bouton de type submit
Dveloppement d'applications Web 42
<FORM METHOD=POST ACTION=http://host/servlet/demandeServlet>
Nom: <INPUT type=text name=Nom/>
<BR>
<INPUT type=submit valeur=Envoyer/>
</FORM>
22
Traitement des donnes (3)
Les mthodes GET et POST
GET: les champs du formulaire sont ajouts lURL de
lattribut
ACTION sous la forme nom=valeur
URL?nom1=val1&nom2=val2&
POST: les donnes sont passes dans le corps du message
HTTP
Dveloppement d'applications Web 43
Traitement des donnes (4)
Lecture des donnes
mthode String getParameter(String name)
dans le formulaire
<INPUT type=text name=nom />
dans la mthode doXXX()
String n = req.getParameter(nom);
Exemple de lecture des paramtres
Dveloppement d'applications Web 44
public class UIFormServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
out.println("Nom : " + req.getParameter("nom"));
out.println("Prnom : " + req.getParameter("prenom"));
if (req.getParameterValues("radio1")[0].equals("mas")) {
out.print("C'est un homme. Il");
} else {
out.print("C'est une femme. Elle");
}out.print(" a crit sur ce magnifique cours que ");
out.println(req.getParameter("textarea"));
}}
23
Traitement des donnes issues dun
formulaire
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class AfficheFormulaire extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse rep)
throws ServletException, IOException {
rep.setContentType("text/html");
PrintWriter out = rep.getWriter();
String docType = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +
"Transitional//EN\">\n";
String titre = "Liste des paramtres";
out.println(docType + "<HTML>\n" +
"<HEAD><TITLE>" + titre + "</TITLE></HEAD>\n" +
"<BODY>\n" + "<H1 ALIGN=CENTER>" + title + "</H1>\n" +
"<TABLE BORDER=1 ALIGN=CENTER>\n" +
"<TR BGCOLOR=\"#eeeeee\">\n" +
"<TH>Nom<TH>Valeur");
Enumeration nomParams = req.getParameterNames();
Dveloppement d'applications Web 45
Les paramtres d'initialisation
Les servlets peuvent avoir des paramtres d'initialisation.
Ces paramtres peuvent tre changs sans avoir
recompiler l'application
<init-param>
<param-name>testValue</param-name>
<param-value>12</param-value>
<description>une valeur quelconque</description>
</init-param>
Ces paramtres peuvent tre utiliss avec la mthode
javax.servlet.getInitParameter()
24
Exemple
Les lments du chemin de
requte
ContextPath : le chemin du contexte de
dploiement
ServletPath : la section du chemin qui a
dclench le mapping
PathInfo : la partie de la requte qui nest ni le
ContextPath ni le ServletPath
Request.getContextPath()
Request.getServletPath()
Request.getPathInfo()
25
Exemples
Paramtres Attributs de contexte : principe
Les paramtres de contexte
Association de paramtres un ensemble de Servlets :
contrairement aux paramtres d'initialisation de Servlet
prcdents,
ceux-ci sont commun toutes les Servlets de l'application
web.
Dclaration : dans web.xml
<web -app >
<context - param >
<param - name > parametrecontext </param - name >
<param - value > valeurcontext </param - value >
</ context - param >
<! -- declaration des Servlets -->
</web - app >
Rcupration dans la Servlet :
ServletContext context = getServletContext ();
chainecontext = context . getInitParameter (" parametrecontext ");
26
Manipulation dattributs du contexte par ServletContext :
void setAttribute(String name, Object o)
Object getAttribute(String name)
Enumeration getAttributeNames()
void removeAttribute(String name)
Dveloppement d'applications Web 51
<?xml v e r s i on =" 1.0 " encoding ="ISO -8859 -1 " ?>
<!DOCTYPE web - app PUBLIC " -// Sun Microsystems , Inc .// DTD
Application web 2.3// EN" " file:
/// opt / j2sdkee / conf /web - app_2_3 .dtd ">
<web-app >
<context-param >
<param-name > parametreDeContexte </param-name >
<param-value > valeurContextuelle </param-value >
< description >test de parametre </ description >
</ context-param >
<servlet >
<servlet-name > ParamContext </ servlet-name >
<servlet-class > ParamContext </ servlet-class >
</ servlet >
<servlet-mapping >
<servlet-name > ParamContext </ servlet-name >
<url-pattern >/ Servlet / ParamContext </url-pattern >
</ servlet-mapping >
</web-app >
Dveloppement d'applications Web 52
27
Attributs de contexte : exemple
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>Increment</servlet-name>
<servlet-class>AttributContextIncrement</servlet-class>
</servlet>
<servlet>
<servlet-name>Lecteur</servlet-name>
<servlet-class>AttributContextLecteur</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Increment</servlet-name>
<url-pattern>/Servlet/Increment</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Lecteur</servlet-name>
<url-pattern>/Servlet/Lecteur</url-pattern>
</servlet-mapping>
</web-app>
Attributs de contexte : exemple
AttributContextLecteur.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class AttributContextLecteur extends HttpServlet {
ServletContext context;
public void init() {
context = getServletContext().getContext("/AttributContext");
}
public void doGet(HttpServletRequest requete, HttpServletResponse reponse)
throws ServletException,
IOException {
reponse.setContentType("text/html");
PrintWriter out= reponse.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<h1> Lecteur valeur de compteur partage :
"+context.getAttribute("compteur")+"</h1>");
out.println("<a href=/AttributContext/Servlet/Increment>incremente</a>");
out.println("<a href=/AttributContext/Servlet/Lecteur>lecteur</a>");
out.println("</form>");
out.println("</body>");
out.println("</html>");
}
}
28
Paramtres
Attributs de contexte : exemple
AttributContextIncrement.java
import java.io.*;
import java.lang.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class AttributContextIncrement extends HttpServlet {
ServletContext context;
public void init() {
context = getServletContext().getContext("/AttributContext");
if (context.getAttribute("compteur") == null)
context.setAttribute("compteur","0");
}
public int incremente() {
try {
int compteur = Integer.parseInt(""+context.getAttribute("compteur"))+1;
context.setAttribute("compteur",""+compteur);
return compteur;
}
catch (NumberFormatException exception) {
log("TestAttributContext1 : probleme de conversion en int");
log(""+exception);
}
return -1;
}
Paramtres Attributs de contexte :
exemple
AttributContextIncrement.java
public void doGet(HttpServletRequest requete, HttpServletResponse
reponse) throws ServletException,
IOException {
reponse.setContentType("text/html");
PrintWriter out= reponse.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<h1> Increment valeur de compteur partage :
"+incremente()+"</h1>");
out.println("<a
href=/AttributContext/Servlet/Increment>incremente</a>");
out.println("<a href=/AttributContext/Servlet/Lecteur>lecteur</a>");
out.println("</form>");
out.println("</body>");
out.println("</html>");
}
}
29
Partage du contrle
Principe dinvocation
Appel dune ressource partir dune autre Servlet
Deux types dinvocations possibles :
linclusion
la dlgation
Linterface ServletRequest met disposition un
distributeur de requtes par URL absolue ou relative :
RequestDispatcher getRequestDispatcher(String path)
Linterface ServletContext met disposition un distributeur
de requtes par nom au lieu dune URL :
RequestDispatcher getNamedDispatcher(String name)
Partage du contrle
RequestDispatcher
Deux mthodes importantes
Il y a transmission des objets requte
(ServletRequest) et rponse (ServletResponse)
void forward(ServletRequest req, ServletResponse rep)
: dlgue totalement la ressource appelle, la
rponse sera celle de la ressource
void include(ServletRequest req, ServletResponse rep)
: invoque et inclut la rponse de la ressource la
rponse de la servlet
30
Partage du contrle
Dlgation
Ache.java
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Affiche extends HttpServlet {
public void doGet(HttpServletRequest requete, HttpServletResponse reponse)
throws ServletException, IOException {
reponse.setContentType("text/html; charset=UTF-8");
PrintWriter out= reponse.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title> Exemple de dlgation </title>");
out.println("</head>");
out.println("<body>");
out.println("<p> <b>Nombre despaces :
</b>"+requete.getAttribute("resultat")+"</p>");
out.println("<p><b> Phrase : </b>\""+requete.getParameter("phrase")+"\"</p>");
out.println("</body>");
}
}
Partage du contrle (4/8)
Dlgation
AnalyseTexte.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class AnalyseTexte extends HttpServlet {
public void doGet(HttpServletRequest requete,
HttpServletResponse reponse) throws ServletException,
IOException {
String phrase = requete.getParameter("phrase");
String url;
if (phrase != null && !phrase.trim().equals(""))
url = "/Servlet/Affiche";
else
url = "/delegation.html";
requete.setAttribute("resultat", ""+calculNbMotif(" ",
phrase));
RequestDispatcher rd = requete.getRequestDispatcher(url);
rd.forward(requete,reponse);
}
31
Partage du contrle
Dlgation
AnalyseTexte.java
int calculNbMotif(String motif, String phrase) {
int nbMotifs = 0;
int indice = 0;
while ((indice = phrase.indexOf(motif, indice)) != -1) {
nbMotifs++;
indice++;
}
return nbMotifs;
}
}
Utilit
Couramment utilise pour dlguer lachage, le traitement
tant fait dans la premire servlet. Le rsultat est transmis une
autre servlet via des attributs puis est ach.
Partage du contrle
Inclusion
Ache.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;
public class Affiche extends HttpServlet {
public void doGet(HttpServletRequest requete, HttpServletResponse reponse)
throws ServletException, IOException {
requete.setCharacterEncoding("ISO-8859-1");
String phrase = requete.getParameter("phrase");
String caracteres = requete.getParameter("caracteres");
if (phrase == null || phrase.trim().equals("")) {
RequestDispatcher rd = requete.getRequestDispatcher("/inclusion.html");
rd.forward(requete,reponse);
return;
}
reponse.setContentType("text/html; charset=ISO-8859-1");
reponse.setLocale(new Locale(Locale.FRENCH.getLanguage(), Locale.FRANCE.getCountry()));
PrintWriter out= reponse.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title> Exemple dinclusion </title>");
out.println("</head>");
out.println("<body>");
32
Partage du contrle (7/8)
Inclusion
Ache.java
out.println("<p><b> Phrase :
</b>\""+requete.getParameter("phrase")+"\"</p>");
for(int i=0; i<caracteres.length(); i++) {
requete.setAttribute("motif",
""+caracteres.charAt(i));
RequestDispatcher rd =
requete.getRequestDispatcher("/Servlet/Analyse");
out.println("<p> <b> Nombre de
\""+caracteres.charAt(i)+"\" :</b>");
rd.include(requete,reponse);
out.println("</p>");
}
out.println("</body>");
}
}
Partage du contrle (8/8)
Inclusion
AnalyseTexte.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class AnalyseTexte extends HttpServlet {
public void doGet(HttpServletRequest requete, HttpServletResponse reponse)
throws ServletException, IOException {
String phrase = requete.getParameter("phrase");
String motif = (String)requete.getAttribute("motif");
PrintWriter out = reponse.getWriter();
out.println(calculNbMotif(motif,phrase));
}
int calculNbMotif(String motif, String phrase) {
int nbMotifs = 0;
int indice = 0;
while ((indice = phrase.indexOf(motif, indice)) != -1) {
nbMotifs++;
indice++;
}
return nbMotifs;
}
}
33
Architecture de dveloppement d'une
application WEB
Une application WEB peut contenir plusieurs Servlets
Pour tester et dployer une Servlet, il faut un systme
d'excution appel conteneur de Servlets ou moteur de
Servlets
Le conteneur ralise le lien entre la Servlet et le serveur WEB
Transforme code Java (bytecode) en HTML
Associe des URL's virtuels une Servlet
Dveloppement d'applications Web 65
Architecture de dveloppement d'une
application WEB
Une application WEB est contenue dans un rpertoire physique sur le
serveur
Une application WEB possde une hirarchie de rpertoires et de
fichiers
Dveloppement d'applications Web 66
Fichiers pour la prsentation
Fichiers de configuration de
l'application WEB au format XML
Classes (bytecode) des Servlets
Fichiers bibliothques sous
diffrents formats
Respecter scrupuleusement la
hirarchie des rpertoires et
le nom des fichiers
34
Les contextes ...
Un contexte constitue une vue sur le
fonctionnement dune mme application web
Possibilit daccder chacune des ressources de
lapplication web correspondant au contexte
Servlets
Pages JSP
...
Utilisation du fichier web.xml pour la description de
dploiement du contexte
Dveloppement d'applications Web 67
Une application WEB ne
contient quun seul
contexte
Le fichier web.xml :cest quoi ?
Le fichier web.xml regroupe les informations de fonctionnement
de l'application WEB (description de dploiement du contexte)
Utilisation du format XML eXtensible Markup Language
Syntaxe universelle pour la structuration des donnes cre par le
World Wide Web Consortium (W3C) en 1996
Langage bas sur des balises permettant de donner une signification
au document (HTML s'intresse essentiellement l'affichage)
Extensible par la possibilit de crer de nouvelles balises
Balises XML sensibles la case et la rigueur (balise ouvrante =
obligation d'une balise fermante)
La structure du document est dfini par un fichier XSD (XML Schema
Description)
Dveloppement d'applications Web 68
35
Le fichier web.xml : cest quoi ?
Dveloppement d'applications Web 69
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>Application WEB affichant
HelloWorld</display-name>
<servlet>
<servlet-name>HelloWorldServlet</servlet-
name>
<servlet-class>HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-
name>
<url-pattern>/msg.hello</url-pattern>
</servlet-mapping>
</web-app>
Fichier web.xml typique
En-tte du fichier web.xml
Balise principale
Balise de description de
l'application WEB
Balise de description
d'une Servlet
Nom de la Servlet
"Identification"
Classe de la Servlet
Dfinition d'un chemin
virtuel
Nom de la Servlet considr
"Identification"
Dfinition du chemin virtuel
La prsence du fichier
web.xml est obligatoire
pour que vos servlets WEB
fonctionnent
Le fichier web.xml : cest quoi ?
Le fichier web.xml permet la dfinition de chemin virtuel :
mais comment sont-ils utiliss pour appeler les Servlets ?
Dveloppement d'applications Web 70
...
<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/HelloWorldServlet/msg.hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>*.toutpourservlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/index.html</url-pattern>
</servlet-mapping>
...
http://localhost:8080/HelloWorldServlet
http://localhost:8080/HelloWorldServlet/bonjour.toutpourservlet
http://localhost:8080/HelloWorldServlet/hello.toutpourservlet
http://localhost:8080/HelloWorldServlet/HelloWorldServlet/msg.hello
36
Cycle de vie d'une Servlet
Cration et initialisation de la Servlet
Utilisation de paramtres initiaux
Traitement des services demands par les clients (au travers
de la mthode service() notamment), le cas chant
Persistance dinstance
Destruction de la Servlet et passage au ramasse-miettes de
la machine virtuelle
Dconnexion avec une base de donnes
Dveloppement d'applications Web 71
Au contraire les applications serveur de
type CGI sont cres chaque requte et
dtruites aprs le traitement des rponses
Cycle de vie d'une Servlet :
persistance dinstance
Entre chaque requte du client les Servlets persistent
sous forme dinstances dobjet
Au moment o le code dune Servlet est charg, le
serveur ne cre quune seule instance de classe
Linstance (unique) traite chaque requte effectue sur
la Servlet
Les avantages (rappels)
Lempreinte mmoire reste petite
Le surcot en temps li la cration dun nouvel objet pour la
Servlet est limin
La persistance est possible cest--dire la possibilit de conserver
ltat de lobjet chaque requte (un exemple le compteur)
Dveloppement d'applications Web 72
37
Cycle de vie d'une Servlet :
persistance dinstance
Exemple : Servlet qui incrmente un compteur chaque
requte du client
Dveloppement d'applications Web 73
public class SimpleCounterServlet extends HttpServlet {
private int count = 0;
protected void doGet(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
count++;
out.println("Depuis son chargement, on a accd cette
Servlet " +
count " fois.");
}
}
Cycle de vie d'une Servlet :
rechargement dune Servlet
A chaque rechargement dune Servlet par le conteneur
de Servlet, il y a cration dune nouvelle instance et
donc destruction de lancienne
Le rechargement dune Servlet a lieu quand il y a :
Modification dau moins une classe de lapplication WEB
Demande explicite de ladministrateur du serveur WEB
Redmarrage du conteneur de Servlets
Dveloppement d'applications Web 74
Le conteneur de Servlets ne sintresse quau
Servlet et par consquent si vous modifiez
autre chose que des classes il ny aura aucun
rechargement implicite de Servlets
38
Cycle de vie d'une Servlet :
mthode init()
Exemple : Servlet qui incrmente un compteur chaque
requte du client avec une valeur initiale de 6
Dveloppement d'applications Web 75
public class InitCounterServlet extends HttpServlet {
private int count;
public void init() throws ServletException {
count = 6;
}
protected void doGet(HttpServletRequest req, HttpServletResponse
res)
throws ServletException, IOException {
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
count++;
out.println("Depuis son chargement, on a accd cette Servlet "
+
count " fois.");
}}
Cycle de vie d'une Servlet :
mthode init()
Possibilit dutiliser des paramtres dinitialisation
exploits exclusivement par la mthode init()
Les paramtres dinitialisation sont dfinis dans le fichier
web.xml de lapplication WEB
Dveloppement d'applications Web 76
...
<web-app ...>
<display-name>Servlet simulant un compteur</display-name>
<servlet>
<servlet-name>InitConfigFileCounterServlet</servlet-name>
<servlet-class>InitConfigFileCounterServlet</servlet-class>
<init-param>
<param-name>initial_counter_value</param-name>
<param-value>50</param-value>
<description>Valeur initiale du compteur</description>
</init-param>
</servlet>
...
</web-app>
39
Cycle de vie d'une Servlet :
mthode init()
Exemple : Servlet qui incrmente un compteur
et qui est initialise par le fichier web.xml
Dveloppement d'applications Web 77
public class InitConfigFileCounterServlet extends HttpServlet {
private int count;
public void init() throws ServletException {
String initial = this.getInitParameter("initial_counter_value");
try {
count = Integer.parseInt(initial);
} catch(NumberFormatException e) {
count = 0;
}
}
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
...
count++;
out.println("Depuis son chargement, on a accd cette Servlet " +
count " fois.");
}}
Cycle de vie d'une Servlet :
mthode destroy()
Une Servlet doit librer toutes les ressources quelle a
acquises et qui ne pourront tre passes au ramasse-
miettes
Exemples de ressources
Connexion une base de donnes
Ouverture dun fichier sur le disque serveur
La mthode destroy() donne une dernire chance
dcrire les informations qui ne sont pas encore
sauvegardes
La mthode destroy() est galement utilises pour crire les
informations persistantes qui seront lues lors du prochain appel
init()
Dveloppement d'applications Web 78
40
Cycle de vie d'une Servlet :
mthode destroy()
Exemple : Servlet qui incrmente un compteur qui
sauvegarde ltat avec destroy() et qui recharge avec init()
Dveloppement d'applications Web 79
public class InitDestroyCounterServlet extends HttpServlet {
private int count;
public void destroy() {
FileWriter fileWriter = null; PrintWriter printWriter = null;
try {
fileWriter = new FileWriter("InitCounter.initial");
printWriter = new PrintWriter(fileWriter);
printWriter.println(count);
}
catch (IOException e) {
...
} finally {
if (printWriter != null) printWriter.close();
}}
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
...
}}
Cycle de vie d'une Servlet :
mthode destroy()
Dveloppement d'applications Web 80
...
public void destroy() {
// Voir transparent prcdent
}
public void init() throws ServletException {
FileReader fileReader = null;
BufferedReader bufferedReader = null;
try {
fileReader = new FileReader("InitCounter.initial");
bufferedReader = new BufferedReader(fileReader);
String initial = bufferedReader.readLine();
count = Integer.parseInt(initial);
} catch (IOException e) {
...
} finally {
if (bufferedReader != null)
bufferedReader.close();
}}}
Exemple (suite) : Servlet qui incrmente un compteur qui
sauvegarde ltat avec destroy() et qui recharge avec init()
41
Paramtres de contexte :
principe
Les paramtres de contexte
Association de paramtres un ensemble de Servlets :
contrairement aux paramtres dinitialisation de Servlet
prcdents, ceux-ci sont commun toutes les Servlets de
lapplication web.
Dclaration : dans web.xml
<web-app>
<context-param>
<param-name>parametrecontext</param-name>
<param-value>valeurcontext</param-value>
</context-param>
<!-- dclaration des Servlets -->
</web-app>
Rcupration dans la Servlet :
ServletContext context = getServletContext();
chainecontext =
context.getInitParameter("parametrecontext");
Paramtres de contexte :
exemple
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<context-param>
<param-name>parametreDeContexte</param-name>
<param-value>valeurContextuelle</param-value>
<description>test de parametre</description>
</context-param>
<servlet>
<servlet-name>ParamContext</servlet-name>
<servlet-class>ParamContext</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ParamContext</servlet-name>
<url-pattern>/Servlet/ParamContext</url-pattern>
</servlet-mapping>
</web-app>
42
Paramtres de contexte :
exemple
ParamContext.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ParamContext extends HttpServlet {
public void doGet(HttpServletRequest requete,
HttpServletResponse reponse) throws ServletException,
IOException {
ServletContext context = getServletContext();
String chainecontext =
context.getInitParameter("parametreDeContexte");
reponse.setContentType("text/plain");
PrintWriter out = reponse.getWriter();
out.println("Parametre de contexte = "+chainecontext);
}
}
Gestion de l'tat avec cookies et sessions
Dveloppement d'applications Web 84
Cours Java Avance
43
Suivi de session
HTTP gre les paires requte/rponse
ouverture, requte, rponse, fermeture
Le protocole HTTP est un protocole sans tat
Impossibilit alors de garder des informations dune
requte lautre (identifier un client dun autre)
Obligation dutiliser diffrentes solutions pour
remdier au problme dtat
Authentifier lutilisateur
Champs de formulaire cachs
Rcriture dURL
Cookies persistants
Suivi de session
Dveloppement d'applications Web 85
Cookies persistants :
Cookie
Un cookie est une information envoye au navigateur
(client) par un serveur WEB qui peut ensuite tre relue par
le client
Lorsquun client reoit un cookie, il le sauve et le renvoie
ensuite au serveur chaque fois quil accde une page sur
ce serveur
La valeur dun cookie pouvant identifier de faon unique
un client, ils sont souvent utiliss pour le suivi de session
Dveloppement d'applications Web 86
44
Cookies persistants :
Cookie
LAPI Servlet fournit la classe javax.servlet.http.Cookie pour
travailler avec les Cookies
Cookie(String name, String value) : construit un cookie
String getName() : retourne le nom du cookie
String getValue() : retourne la valeur du cookie
setValue(String new_value) : donne une nouvelle valeur au cookie
setMaxAge(int expiry) : spcifie lge maximum du cookie
Pour la cration dun nouveau cookie, il faut lajouter la
rponse (HttpServletResponse)
addCookie(Cookie mon_cook) : ajoute la rponse un cookie
La Servlet rcupre les cookies du client en exploitant la rponse
(HttpServletRequest)
Cookie[] getCookies() : rcupre lensemble des cookies du site
Dveloppement d'applications Web 87
Cookies persistants :
Cookie
Code pour crer un cookie et lajouter au client
Cookie cookie = new Cookie("Id", "123");
res.addCookie(cookie);
Code pour rcuprer les cookies
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
String name = cookies[i].getName();
String value = cookies[i].getValue();
}
}
Dveloppement d'applications Web 88
45
Cookies persistants :
Cookie
Exemple : gestion de session (identifier un client dun
autre) par lintermdiaire des cookies persistants
Dveloppement d'applications Web 89
public class CookiesServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
...
String sessionId = null;
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if (cookies[i].getName().equals("sessionid")) {
sessionId = cookies[i].getValue();
}}}
if (sessionId == null) {
sessionId = new java.rmi.server.UID().toString();
Cookie c = new Cookie("sessionid", sessionId);
res.addCookie(c);
out.println("Bonjour le nouveau");
} else {
out.println("Encore vous"); ... }
}}
Suivi de session :
HttpSession
Le plus gros problme des cookies est que les
navigateurs ne les acceptent pas toujours
Lutilisateur peut configurer son navigateur pour quil
refuse ou pas les cookies
Les navigateurs nacceptent que 20 cookies par site, 300
par utilisateur et la taille dun cookie peut tre limite
4096 octets
Dveloppement d'applications Web 90
46
Suivi de session :
HttpSession
Solutions : utilisation de lAPI de suivi de session HttpSession
Mthodes de cration lies la requte (HttpServletRequest)
HttpSession getSession() : retourne la session associe lutilisateur
HttpSession getSession(boolean p) : cration selon la valeur de p
Gestion dassociation (HttpSession)
Enumeration getAttributNames() : retourne les noms de tous les attributs
Object getAttribut(String name) : retourne lobjet associ au nom
setAttribut(String na, Object va) : modifie na par la valeur va
removeAttribut(String na) : supprime lattribut associ na
Destruction (HttpSession)
invalidate() : expire la session
logout() : termine la session
Dveloppement d'applications Web 91
Mcanisme trs puissant
permettant de stocker des objets et
non de simples chanes de
caractres comme les cookies
Suivi de session :
HttpSession
Exemple : suivi de session pour un compteur
Dveloppement d'applications Web 92
public class HttpSessionServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse
res)
throws ServletException, IOException {
res.setContentType("text/plain"); 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.initValue() + 1);
session.setAttribute("count", count);
out.println("Vous avez visit cette page " + count + " fois.");
}
}
47
Scurit :
authentification
La scurit consiste conserver les informations sensibles dans les
mains des utilisateurs
Authentification : capable de vrifier lidentit des parties impliques
Habilitation : limiter laccs aux ressources un ensemble dutilisateurs
Confidentialit : garantir la communication des parties impliques
Nous distinguons plusieurs types d'autorisation :
BASIC : fournit par le protocole HTTP bas sur un modle
simple de demande/rponse (codage Base64)
FORM : authentification ne reposant pas celle du protocole
HTTP
Dveloppement d'applications Web 101
Dveloppement d'applications Web 102
Scurit :
types d'autorisation
48
Applets vs. servlets
Les servlets sont le pendant des
applets ct serveur
mais sans interface graphique utilisateur
elle est limite la puissance du langage HTML

par contre, elles ne sont pas astreintes aux


mmes rgles de scurit que les applets
peuvent tablir une connexion avec dautres
clients (RMI, )
peuvent faire des appels systme (utilisation pont
JDBC-ODBC)
manipuler des ressources locales (sur le serveur),
...
lapproche servlet est donc plus scurise
Dveloppement d'applications Web 103
Scurit :
deux familles d'identification pour les Servlets
Gre par le conteneur de Servlets :
Spcification d'un domaine de scurit dans le fichier de
configuration web.xml
Les utilisateurs sont grs (l'utilisateur existe-il, le mot
de passe est-il correct, ) uniquement par le
conteneur de Servlets
Base sur les rles (BASIC)
A base de formulaire (FORM)
Effectue lintrieur des Servlets :
Les utilisateurs sont stocks dans une base de donnes, un fichier,

La vrification est effectue dans les Servlets (besoin d'un codage)


Personnalise (BASIC)
Personnalise base de formulaire (FORM)
Dveloppement d'applications Web 104
49
Authentification base sur
les rles
Dveloppement d'applications Web 105
public class SecurityRolesServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse
res)throws ServletException, IOException {
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
out.println("Bonjour : " + req.getRemoteUser());
out.println("Information Top-Secrte");
out.println("Type d'authentification : " + req.getAuthType());
out.println("Est-un administrateur : " +
req.isUserInRole("admin"));
}
}
Authentification base sur
les rles
Besoin de modification du fichier de configuration
web.xml de l'application WEB considre
Dveloppement d'applications Web 106
...
<web-app ...>
<display-name>Gestion d'une authentification par "Roles"</display-name>
<servlet>
<servlet-name>SecuriteRolesServlet</servlet-name>
<servlet-class>SecuriteRolesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SecuriteRolesServlet</servlet-name>
<url-pattern>/SecuriteRolesServlet</url-pattern>
</servlet-mapping>
<security-constraint>
<web-resource-collection>
<web-resource-name>SecretProtection</web-resource-name>
<url-pattern>/SecuriteRolesServlet</url-pattern>
<http-method>GET</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>test</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Authentification de SecuriteRoleServlet</realm-name>
</login-config>
</web-app>
50
Authentification personalise
base sur les rles :
Exemple : Servlet qui aprs identification personnalise
affiche un message de bienvenue
Dveloppement d'applications Web 107
public class SecurityFormRolesServlet extends HttpServlet
{
protected void doGet(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.println("Bonjour : " + req.getRemoteUser());
req.getSession().invalidate();
}
}
Termine explicitement la
session. Obligation de
sidentifier chaque fois
que la Servlet est appele
Authentification personalise
base sur les rles :
Besoin de modification du fichier de configuration web.xml de
l'application WEB considre
Dveloppement d'applications Web 108
...
<web-app ...>
...
<servlet> ... </servlet>
<servlet-mapping> ... </servlet-mapping>
<security-constraint> ... </security-constraint>
<login-config>
<auth-method>
FORM
</auth-method>
<form-login-config>
<form-login-page>
/loginpage.html
</form-login-page>
<form-error-page>
/errorpage.html
</form-error-page>
</form-login-config>
</login-config>
</web-app>
51
Authentification personalise
base sur les rles :
Le formulaire de la page loginpage.html doit employer la
mthode POST pour la transmission des donnes des valeurs
spciales pour les noms des composants
Dveloppement d'applications Web 109
<FORM METHOD=POST ACTION="j_security_check">
Nom dutilisateur : <INPUT TYPE=TEXT NAME="j_username"><br>
Mot de passe : <INPUT TYPE=PASSWORD NAME="j_password"><br>
<INPUT TYPE=SUBMIT>
</FORM>
Partage du contrle
Principe dinvocation
Appel dune ressource partir dune autre Servlet
Deux types dinvocations possibles :
linclusion
la dlgation
Linterface ServletRequest met disposition un
distributeur de requtes par URL absolue ou relative :
RequestDispatcher getRequestDispatcher(String path)
Linterface ServletContext met disposition un distributeur
de requtes par nom au lieu dune URL :
RequestDispatcher getNamedDispatcher(String name)
52
Partage du contrle
RequestDispatcher
Deux mthodes importantes
Il y a transmission des objets requte
(ServletRequest) et rponse (ServletResponse)
void forward(ServletRequest req, ServletResponse rep)
: dlgue totalement la ressource appelle, la
rponse sera celle de la ressource
void include(ServletRequest req, ServletResponse rep)
: invoque et inclut la rponse de la ressource la
rponse de la servlet
Connexion une base de donnes via
JDBC
Dveloppement d'applications Web 112
53
Se connecter aux bases de
donnes
Utilisation de lAPI JDBC (Java DataBase Connectivity)
JDBC est une API du niveau SQL, elle permet dexcuter des
instructions SQL et de retrouver les rsultats (sil y en a)
LAPI est un ensemble dinterfaces et de classes conues pour
effectuer des actions sur toute base de donnes (mySQL, ORACLE,
SYBASE, ODBC)
Utilisation dun gestionnaire de pilotes JDBC
Un pilote JDBC spcifique une base de donnes implmente
linterface java.sql.Driver
Peut dialoguer avec tout pilote conforme l API JDBC o les pilotes
sont disponibles java.sun.com/products/jdbc
Utilisation de linterface JDBC en quatre tapes
Charger le pilote
Se connecter la base
Crer et excuter une requte SQL
Traiter le rsultat si ncessaire
Dveloppement d'applications Web 113
Connexion aux bases de donnes :
charger un pilote
Le pilote est obligatoire, il convertit les appels JDBC en appels natifs. Il est
ncessaire de connatre le nom de la classe du pilote JDBC que lon veut
utiliser
Pilote ORACLE : oracle.JDBC.driver.OracleDriver
Pilote JDBC/ODBC : sun.jdbc.odbc.JdbcOdbcDriver
Pilote mySQL : com.mysql.jdbc.Driver
Le chargement du pilote se fait en utilisant la mthode
Class.forName(String Pilote) throws ClassNotFoundException
Dveloppement d'applications Web 114
54
Se connecter aux bases de donnes :
La connexion la base se fait en utilisant la mthode
DriverManager.getConnection("URL","user","pass") throws SQLException
Connection ma_connexion =
DriverManager.getConnection("jdbc:mysql://localhost/Espoir","me",
"pass");
Dveloppement d'applications Web 115
Se connecter aux bases de donnes : crer et excuter
une requte SQL
La requte ne peut tre cre et excute que si le pilote et la
connexion la base se sont valides
Il faut avant tout crer une instruction SQL sur la base
createStatement() throws SQLException
Il faut enfin excuter la requte en crivant concrtement le
requte SQL executeQuery(String requete) throws
SQLException
Dveloppement d'applications Web 116
Statement mon_statement = ma_connexion.createStatement();
ResultSet mon_resultat = mon_statement.executeQuery("SELECT * FROM
`table`");
55
Se connecter aux bases de donnes :
traiter le rsultat
Enfin il faut traiter un objet de type ResultSet il existe de
nombreuses mthodes
boolean next() : avancer dune ligne de la table rsultante
String getString(String columName) : interroger un champ String
par son nom
String getString(int columnIndex) : interroger un champ String par
son index
int getInt() : interroger un champ Integer par son nom ou index

Dveloppement d'applications Web 117
while (mon_resultat.next()) {
String colonne1 =
mon_resultat.getString(1);
out.println("Nom:" + colonne1);
}
Se connecter aux bases de
donnes
Exemple : Servlet qui interroge une base de donnes mySQL
Dveloppement d'applications Web 118
public class DataBaseServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/html");
PrintWriter out = res.getWriter();
try {
Class.forName("org.apache.derby.jdbc.ClientDriver");
Connection ma_connexion =
DriverManager.getConnection("jdbc:derby://localhost:1527/PersonDB");
Statement mon_statement = ma_connexion.createStatement();
ResultSet mon_resultat = mon_statement.executeQuery("SELECT NOM,
PRENOM, AGE FROM PERSONNE");
while (mon_resultat.next()) {
out.print("Nom : " + mon_resultat.getString(1));
out.print(" Prnom : " + mon_resultat.getString(2));
out.println(" Age : " + mon_resultat.getInt(3));
out.println("<br>");
}
} catch(SQLException e) {
...
}
}
56
Statements "prpars"
(Prepared statements)
PreparedStatement prep = con. prepareStatement
("INSERT into Data values ( ?, ? )");
Connection.prepareStatement , la place de:
Connection.createStatement
quand on veut rpter le mme "statement" plusieurs fois
les "?" remplacent les diffrentes donnes qu'on va
envoyer la bd chaque fois avec les mthodes setXXX ,
par ex:
prep.setString (1, "Ali"); prep.setInt(2, 70);
NOTE: Il faut faire attention aux types des donnes!
Par ex: setInt , setFloat , setDouble pour Integer, Float et
Double, setString pour char et varchar, et setDate pour dates.
*** On excute avec executeUpdate() ***
Dveloppement d'applications Web 119
Les meta-donnes
Le ResultSet contient aussi des meta data (donnes sur
les colonnes, le nombre de colonnes, etc. (PAS le
nombre de lignes!)
ResultSetMetaData rsMeta = (ResultSetMetaData) rs.
getMetaData ();
// Get the N of Cols in the ResultSet
int noCols = rsMeta. getColumnCount ();
// initalize the Vector that holds labels
String [] resColNames = new String [noCols];
for (int c=1; c<=noCols; c++) {
String el = rsMeta. getColumnLabel (c);
resColNames[c-1]= el; }
Dveloppement d'applications Web 120
57
Traitement d'un ResultSet dont on ne
connat pas la structure
Rcupration de toutes les colonnes et stockage dans une
table (sans savoir ce qui a dans le ResultSet: (Ex. avec une
matrice ( ne pas copier, faudrait utiliser Vector() la place
..... )
int noCols = rsMeta. getColumnCount ();
int line=0;
String [][] resultData = new String [100][noCols];
while (rs.next()) {
for (int c=1; c<=noCols; c++) {
String el = rs.getString(c);
resultData[line][c-1] = el;
}
line++; }
Dveloppement d'applications Web 121
Gestion des erreurs SQL
catch(SQLException ex) {
System.err.println("==> SQLException: ");
while (ex != null) {
System.out.println("Message: " + ex. getMessage
());
System.out.println("ErrorCode: " + ex.
getErrorCode ());
ex = ex. getNextException ();
System.out.println("");
}
}
Dveloppement d'applications Web 122
58
JSP : Techniques de gnration de
contenu dynamique en JSP
123
JSP : Java Server Page
La plupart des applications Web produisent des pages
HTML dynamiquement en modifiant uniquement les
champs de donnes et pas la structure de base de la
page.
Les JSP sont la technologie la plus approprie pour ce type
Une page JSP contient un modle de document
statique et des balises spcifiques pour inclure du
texte ou excuter une partie de la logique applicative.
Le contenu statique est servi comme du HTML normal. de
contenu
Dveloppement d'applications Web 124
introduction
59
Une JSP est un fichier texte ( .jsp ) contenant du
code HTML et des fragments de code Java contenus
dans des balises spcifiques, excuts sur le serveur
WEB
Versions 1.0 et maintenant 1.2
En fait, le fichier JSP est traduit en servlet qui est
compile, puis instancie lors de son invocation via
une URL
Dveloppement d'applications Web
125
Introduction (2)
Dveloppement d'applications Web
126
Introduction (3)
60
lments de scripting
Permettent d'inclure du code Java dans la servlet
gnre partir de la JSP
Types d'lments diffrents destination de la servlet
Les scriptlets <% %>,
Les expressions <%=%>,
Les dclarations <%!%>
Les commentaires <%----%>
A destination du conteneur :
les directives <%@%>
Dveloppement d'applications Web 127
Vue globale
<%@ include file=entete.jsp %>
<% ! private int nbAppels;
private int getNbAppels() {
return ++nbAppels;
}
%>
<html>
<head><title>Autre exemple</title></head>
<body>
Cette page a t appele <%=getNbAppels()%> fois.
<% if (nbAppels==1) { out.println(premier appel) } %>
<% if (nbAppels==10) { %> dixime appel <% } %>
</body>
</html>
Dveloppement d'applications Web 128
61
Les diffrents types de balises
Expression : <%=%>
Instructions retranscrites au niveau de la mthode
service (_jspService()) de la servlet
L'expression est value et son rsultat est retourn
sous la forme dune chane de caractres pour affichage
sur la sortie (objet implicite out)
Transcrit dans la mthode _jspService()par lexpression
out.println()
Format
JSP 1.1 <%= Expression %>
JSP 1.2 <jsp:expression>Expression</jsp:expression>
Aucun point virgule n'est requis en fin d'expression
Dveloppement d'applications Web 129
Expression : <%=%>
<html>
<body>
Hello World!
<br>
Current time is <%= new java.util.Date()%>
</body>
</html>
Dveloppement d'applications Web 130
62
Les diffrents types de balises
Scriptlets : <%%>
Permet d'inclure des blocs de code Java quelconques au niveau
de la mthode service (_jspService()) de la servlet
Spcifier les en-ttes de rponse et les codes de status
Mettre jour une base de donnes
Excuter du code contenant des boucles et des conditionelles
Les variables dclares dans les scriptlets sont considres
comme des variables locales
Format
JSP 1.1 <% Code Java %>
JSP 1.2 <jsp:scriptlet> Code Java </jsp:scriptlet>
Dveloppement d'applications Web 131
Scriptlets : <%%>
<%
String[] noms = {"titi", "toto"};
for(int i = 0; i < noms.length; i++){
%>
Le nom <%= i %> ime nom est
<%= noms[i] %>
<%
}
%>
Dveloppement d'applications Web 132
63
Scriptlets avec boucle
<%
Iterator i = cart.getItems().iterator();
while (i.hasNext()) {
ShoppingCartItem item =(ShoppingCartItem)i.next();
BookDetails bd = (BookDetails)item.getItem();
%>
<tr>
<td align="right" bgcolor="#ffffff">
<%=item.getQuantity()%>
</td>
<td bgcolor="#ffffaa">
<strong><a href="
<%=request.getContextPath()%>/bookdetails?bookId=
<%=bd.getBookId()%>"><%=bd.getTitle()%></a></strong>
</td>
<%
// End of while
}
%>
Dveloppement d'applications Web 133
Illustration de la
transformation en Servlet
Supposez que le fragment de code
suivant est crit dans une page JSP
<H2> TextHTML </H2>
<%= MaExpression() %>
<% MonScriptletCode(); %>
Dveloppement d'applications Web 134
64
Code de la servlet rsultante
public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType(text/html);
HttpSession session = request.getSession(true);
JSPWriter out = response.getWriter();
// Le fragment HTML est envoy sur le flux de sortie
out.println(<H2>TextHTML</H2>);
// L'expression est convertie en String et envoye sur la
sortie
out.println(MaExpression());
// Le scriptlet est insr directement comme code Java
//l'intrieur de la mthode _jspService()
MonScriptletCode();
...
}
Dveloppement d'applications Web 135
Prsentation des directives
136
65
lments des JSP
JSP peut contenir en plus du code HTML
quatre types d'lments :
des directives: informations globales relatives la
page.
des dclarations: permettant de dclarer des
mthodes et attributs.
des scriptlets: du code Java qui sera traduit en
code dans la mthode service() de la servlet
rsultant.
des expressions: permettant d'envoyer facilement
des chanes cres dynamiquement vers le
navigateur.
Dveloppement d'applications Web 137
Les diffrents types de balises
Directives : <%@%>
Messages envoys au conteneur JSP lui indiquant la faon dont
il doit transcrire la page JSP en servlet
N'est jamais transform en instruction d'criture sur le flot de
sortie
Ces instruction sont values avant la compilation
Syntaxe :
<%@directive attribut1="valeur"
attribut2="valeur"%>
Dveloppement d'applications Web 138
66
Trois type de directives
page : informations destines au conteneur relatives la
page
<%@ page import="java.util.*"%>
include : inclusion littrale de fichier texte ou de code
la JSP au moment de la traduction
<%@ include file="header.html" %>
Dveloppement d'applications Web 139
Information relatives la page
directive : <%@page%>
Langage utilis
<%@ page language="java"%>
Importation de classe java
<%@ page import="java.util.*, java.net.*" %>
Accessibilit aux donnes de session
<%@ page session="true|false " %>
Gestion des exceptions
<%@ page errorPage="pathToErrorPage" %>
Toute exception non gre dans le code sera sinon remonte
la classe mre de la JSP Spcification d'une page d'erreur
<%@ page isErrorPage="true"%>
Dveloppement d'applications Web 140
67
La directive : <%@include%>
Exemples :
<%@include file="chemin relatif en rfrence la
racine du site"%>
<%@include file="/a_inclure.html"%>
Le fichier est inclus (littralement) au moment de la
traduction de la page donc avant la compilation
Il peut contenir du HTML (document statique), ou une
autre page JSP contenant des "scripting elements", des
directives, des actions
Dveloppement d'applications Web 141
Intgration des objets implicites
dans les pages JSP
Dveloppement d'applications Web 142
68
Les objets implicites
Accessibles depuis la page JSP sans
avoir besoin de les dclarer
pralablement
Dclars et cres par le conteneur
Correspondes des instances de classes
dfinies dans le package servlet
Dveloppement d'applications Web 143
Les objets accessibles depuis les balises JSP
application correspond au ServletContext obtenu via
getServletConfig().getContext()
Permet d'enregistrer des donnes globales partages
par toutes les servlets de l'application web
session correspond HttpSession
resquest correspond HttpServletRequest
Pour rcuprer les paramtres associs au GET ou POST,
les en-ttes des requtes et donc les Cookies
page fait rfrence l'instance courante de la page
(comme le this)
Dveloppement d'applications Web 144
69
Les objets implicites accessibles
depuis les balises JSP
response correspond HttpServletResponse
Peu souvent utilis, on lui prfre en gnral l'objet out
out correspond response.getWriter()
Flux de sortie permettant d'envoyer la rponse au client
Fait rfrence un objet de la classe
javax.servlet.jsp.JspWriter
config correspond ServletConfig
pageContext fait rfrence l'objet
javax.servlet.jsp.PageContext
Permet d'accder diffrents attributs de la page
Dveloppement d'applications Web 145
Les objets implicites accessibles
depuis les balises JSP
exception fait rfrence un objet de
type java.lang.Throwable
Permet d'attraper les exceptions
Dveloppement d'applications Web 146
70
Exemple avec un formulaire,
code HTML
Dveloppement d'applications Web 147
<html>
<head>
<title>Mon Formulaire</title>
</head>
<body>
<h1>Mon Formulaire</h1>
<form action="ResultForm.jsp" method="post">
<table><tbody>
<tr><td>Votre Nom <input type="text" name="nom"></td></tr>
<tr><td>Votre Prnom <input type="text" name="prenom"></td></tr>
<tr><td><input type="submit" name="submit" value="Valider">
<input type="submit" name="submit" value="Reset"></td></tr>
</tbody></table>
</form>
</body>
</html>
Exemple, page JSP
Dveloppement d'applications Web 148
<%@ page language="java" session="false" %>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head><title>Rsultat de mon formulaire</title></head>
<body bgcolor="#FFFFFF">
<h3>Mes informations</h3>
<%
if (request.getParameter("submit").equals("Valider")){
%>
<table><tbody>
<tr><td><b>Nom:</b><%=request.getParameter("nom")%></td></
tr>
<tr><td><b>Prnom:</b><%=request.getParameter("prenom")%><
/td></tr>
<tr><td><form action="Formulaire.html">
<input type="submit" value="Retour">
</form></td></tr>
</tbody></table>
<%}else{%>
<jsp:forward page="Formulaire.html"/>
<%}%>
</body>
</html>
71
La JSP traduite en Servlet (1)
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class ResultForm_jsp extends
org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
private static java.util.Vector _jspx_dependants;
public java.util.List getDependants() {
return _jspx_dependants;
}
public void _jspService(HttpServletRequest request, HttpServletResponse
response)
throws java.io.IOException, ServletException {
JspFactory _jspxFactory = null;
PageContext pageContext = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
Dveloppement d'applications Web 149
La JSP traduite en Servlet (2)

try {
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, false, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
out = pageContext.getOut();
_jspx_out = out;
out.write("\n");
out.write("<!DOCTYPE HTML PUBLIC \"-//w3c//dtd html 4.0
transitional//en\">\n");
out.write("<html>\n");
out.write("<head>\n");
out.write("<title>Rsultat de mon formulaire</title>\n");
out.write("</head>\n");
out.write("<body bgcolor=\"#FFFFFF\">\n");
out.write("\n");
out.write("<h3>Mes informations</h3>\n");
Dveloppement d'applications Web 150
72
La JSP traduite en Servlet (3)

if (request.getParameter("submit").equals("Valider")){
out.write("\n");
out.write("<table>\n");
out.write("\t<tbody>\n");
out.write("\t\t<tr><td><b>Nom :</b>");
out.print(request.getParameter("nom"));
out.write("</td></tr>\n");
out.write("\t\t<tr><td><b>Prnom :</b>");
out.print(request.getParameter("prenom"));
out.write("</td></tr>\n");
out.write("\t\t<tr><td><form action=\"Formulaire.html\">
<input type=\"submit\" value=\"Retour\"></form></td></tr>\t\n");
out.write("\t</tbody>\n");
out.write("</table>\n");
}else{
out.write('\n');
if (true) {
_jspx_page_context.forward("Formulaire.html");
return;
}
out.write('\n');
}
Dveloppement d'applications Web 151
Re-direction vers une autre
page l'action <jsp:forward>
Mme principe que pour les servlets la requte est
transmise au composant et c'est le rsultat de cette
invocation qui sera renvoy au client
<jsp:forward page="redirectedPage"/>
<jsp:forward page="redirectedPage">
<jsp:param name="param1" value="value1"/>

<jsp:param name="paramn" value="valuen"/>


</jsp:forward>
Dveloppement d'applications Web 152
73
Utilisation des JavaBeans
Balise <jsp:useBean>
153
Utiliser des JavaBeans dans le
contexte d'une appli web
Sparation claire de la logique mtier et de la logique
prsentation
Ils peuvent prendre en charge une partie de la logique mtier
ou la partie d'accs aux sources de donnes
Ils sont facilement manipulable depuis une page JSP
Simplicit de manipulation adapte au designer web
Code rutilisable
On peut leur donner diffrentes portes
(application, session, requte, page)
Dveloppement d'applications Web 154
74
Rappel : JavaBean
Objet (composant logiciel) reprsent par une classe Java
Doit comporter au moins un constructeur sans argument
Aucun attribut (property) public
Les proprits du composant peuvent tre
En lecture seulement (get)
En lecture criture (get et set)
En criture seulement (set)
Pour les attributs bolens on remplace le
getXXX() par isXXX()
Dveloppement d'applications Web 155
Utiliser les JavaBean dans une
page JSP <jsp:useBean>
Permet d'instancier des JavaBeans
depuis une page JSP
Cration du JavaBeans
Rcupration par le JavaBean des donnes
de la page JSP
Traitement de ces donnes
Retour des donnes pour affichage dans la
page JSP
Dveloppement d'applications Web 156
75
Java Beans
Exemple : le retour de la classe Voiture
Dveloppement d'applications Web 157
public class Voiture {
private int puissance;
private boolean est_demarree;
private double vitesse;
public void setDemarree(boolean p) {
est_demarree = p;
}
public boolean getDemarree() {
return est_demarree;
}
public void setVitesse(double p) {
vitesse = p;
}
public double getVitesse() {
return vitesse;
}
public int getPuissance() {
return puissance;
}
}
Java Beans et JSP
Pour dclarer et allouer un Java Beans dans une page JSP il
faut employer l'action <jsp:useBean>
id = "nom de l'instance" : nom de l'instance pour identification
class = "Nom de la classe" : package du Bean
scope = "attribut" : champ d'existence de l'objet Bean
request : Bean valide pour la requte
page : idem request sans transmission (le cas de lobjet
pageContext)
session : Bean ayant la dure de vie de la session
application : Bean cre pour l'application WEB courante
Dveloppement d'applications Web 158
76
Java Beans et JSP :
lecture proprits
Pour lire une proprit du Bean deux lments
sont utiliss
La rfrence du Bean dfinie par l'attribut id
Le nom de la proprit
Deux manires existent pour interroger la
valeur d'une proprit et la convertir en String
En utilisant un tag action <jsp:getProperty>
En utilisant l'lments de scripts JSP :
expression
Dveloppement d'applications Web 159
<jsp:getProperty name="rfrence Bean" property="nom proprit" />
<%= nom_instance.getNomPropriete() %>
Java Beans et JSP :
criture proprits
Modification de la valeur d'une proprit en
utilisant le tag action <jsp:setProperty>
Modification de l'ensemble de proprits
suivant les paramtres fournis par la requte
Dveloppement d'applications Web 160
<jsp:setProperty name="rfrence" property="nom
proprit" param="param" value="valeur" />
<jsp:setProperty name="rfrence" property="*" />
Les noms des paramtres de
requte doivent tre identiques
aux noms des proprits
77
Java Beans et JSP :
lecture et criture proprits
Exemple : caractristique d'une voiture (simplifie)
Dveloppement d'applications Web 161
<%@ page language="java" contentType="text/html" %>
<jsp:useBean id="ma_voiture" class="Voiture"></jsp:useBean>
<%
ma_voiture.setDemarree(true);
ma_voiture.setVitesse(21.2);
%>
<html>
<head>
<title>Page pour lecture d'information</title>
</head>
<body bgcolor="white">
La voiture a-t-elle dmarr: <%= ma_voiture.getDemarree() %><br>
La vitesse de la voiture est de : <jsp:getProperty
name="ma_voiture" property="vitesse" /> km/h<br>
La puissance de la voiture est de : <jsp:getProperty
name="ma_voiture" property="puissance" /> CV
</body>
</html>
La classe Voiture
doit tre place
dans le rpertoire
WEB-INF\classes
Java Beans et JSP :
scope
Exemple : affectation et rcupration des valeurs d'un Bean
Dveloppement d'applications Web 162
<%@ page language="java" contentType="text/html" %>
<jsp:useBean id="mon_bean1" scope="page" class="SimpleName"></jsp:useBean>
<jsp:useBean id="mon_bean2" scope="session" class="SimpleName"></jsp:useBean>
<jsp:useBean id="mon_bean3" scope="application"
class="SimpleName"></jsp:useBean>
<jsp:setProperty name="mon_bean1" property="name" value="page"/>
<jsp:setProperty name="mon_bean2" property="name" value="session"/>
<jsp:setProperty name="mon_bean3" property="name" value="application"/>
<html>
<head><title>Page pour criture d'information</title></head>
<body bgcolor="white">
Avant<br>
mon_bean1 = <%= mon_bean1.getName() %><br>
mon_bean2 = <%= mon_bean2.getName() %><br>
mon_bean3 = <%= mon_bean3.getName() %><br>
<FORM METHOD=GET ACTION="lecture.jsp">
<p align="center"><input type="submit" name="Submit"></p>
</FORM>
</body>
</html>
78
Java Beans et JSP :
scope
Exemple : affectation et rcupration des valeurs d'un Bean
Dveloppement d'applications Web 163
<%@ page language="java" contentType="text/html" %>
<jsp:useBean id="mon_bean1" scope="page" class="SimpleName"></jsp:useBean>
<jsp:useBean id="mon_bean2" scope="session" class="SimpleName"></jsp:useBean>
<jsp:useBean id="mon_bean3" scope="application"
class="SimpleName"></jsp:useBean>
<html>
<head>
<title>Page pour criture d'information</title>
</head>
<body bgcolor="white">
Aprs<br>
mon_bean1 = <jsp:getProperty name="mon_bean1" property="name" /><br>
mon_bean2 = <jsp:getProperty name="mon_bean2" property="name" /><br>
mon_bean3 = <jsp:getProperty name="mon_bean3" property="name" /><br>
</body>
</html>
Collaboration de Servlets et JSP :
architecture MVC
Un constat : les pages JSP doivent contenir le
moins de Java
Besoin de structurer le code plus finement
selon les comptences de chaque technologies
(JSP, Servlet, )
Utilisation du modle darchitecture : MVC
(Modle Vue Contrleur)
Dveloppement d'applications Web 164
79
Collaboration de Servlets et JSP :
architecture MVC
Architecture MVC (en rgle gnrale)
Le contrle est gr par les Servlets (pas de sortie dans la rponse)
Le modle est gr par les Beans (ne connat pas le contrle ni la vue)
La vue est gre par les JSP (pas de contrle)
Besoin de savoir communiquer entre des Servlets et des JSP
Requte envoye par le client (1)
Communication entre le contrle et le modle (2)
Transmission la page JSP des informations du Java Bean (3)
La page JSP utilise les informations du Java Bean traduit (4)
La vue est envoye en rponse au client (5)
Dveloppement d'applications Web 165
Collaboration de Servlets et JSP :
architecture MVC
Exemple : application MVC qui dit Bonjour
...
Dveloppement d'applications Web 166
...
import monpackage.MonBean;
public class Controle extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
MonBean bean = new MonBean();
req.setAttribute("idbean", bean);
RequestDispatcher disp =
this.getServletContext().getRequestDispatcher("/page.jsp");
disp.forward(req,res);
}
}
package monpackage;
public class MonBean {
public String getMessage() {
return "Message issu du Bean";
}
}
En gnrale pas de
sortie sur la rponse
de la Servlet
Cette Servlet gre
le contrle. Il
dispatche la vue
Ce Java Bean gre
le modle de
lapplication WEB
80
Collaboration de Servlets et JSP :
architecture MVC
Exemple : application MVC qui dit Bonjour
...
Dveloppement d'applications Web 167
<HTML>
<jsp:useBean id="idbean" class="monpackage.MonBean" scope="request"/>
<HEAD><TITLE>Architecture MVC : Java EE</TITLE></HEAD>
<BODY>
<%= idbean.getMessage() %>
</BODY>
</HTML>
<%@ page import="monpackage.MonBean" %>
<HTML>
<HEAD><TITLE>Architecture MVC : Java EE</TITLE></HEAD>
<BODY>
<% MonBean idbean = (MonBean)request.getAttribute("idbean");%>
<%= idbean.getMessage() %>
</BODY>
</HTML>
1re solution en
utilisant la tag
action useBean
2me solution en
utilisant lobjet
implicite request