Beruflich Dokumente
Kultur Dokumente
LE
PROTOCOLE
HTTP
Protocole
sans
tat
Les
requtes
sont
eectues
Indpendamment
les
unes
aprs
les
autres
Une
requte
est
excute
sans
connaissance
que
celles
qui
ont
prcd
ou
de
celles
qui
vont
suivre
Post /Nom_Script HTTP/1.0 Accept : Text/html Accept : image/gif Accept : image/jpeg User-Agent : Mozilla/4.0 *** saut de ligne *** Var1=Value1& Var2=Value2 Var3=Value3
Entte de la requte
Type et version du navigateur ayant soumis la requte. Paramtres des diffrents champs du formulaire.
corps de la requte
Entte de la requte
HTTP/1.0 200 OK Date : Wed, 05Feb02 15:02:01 GMT Server : Apache/1.3.24 Mime-Version 1.0 Last-Modified : Wed 02Oct01 24:05:01GMT Content-Type : Text/html Content-legnth : 4205 *** saut de ligne *** <HTML><HEAD> . </BODY></HTML>
Ligne de Status
Entte de la rponse
Nom du Serveur Dernire modification
corps de la rponse
3XX : Re-direcMon
Servlets
impos
public class HelloServlet extends HttpServlet { public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { response.setContentType( "text/html" ); PrintWriter out = response.getWriter();
excution de HelloServlet.class
HZpServlets
Navigateur web
Requte HTTP
Method=GET ou POST
COOKIES
Servlet
doGet() doPost()
Rponse HTTP
HttpResponse
L'objet HZpServletRequest encapsulant la requte du client, c'est--dire qu'il conMent l'ensemble des paramtres passs la servlet (informaMons sur l'environnement du client, cookies du client, URL demande, ...) L'objet HZpServletResponse permeZant de renvoyer une rponse au client (envoyer des informaMons au navigateur).
Servlet
GenericSrvlet service()
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 (uMlisaMon pont JDBC- ODBC) ou manipuler des ressources locales (sur le serveur), ...
On
peut
faire
des
choses
impossibles
raliser
avec
des
scripts
CGI
Parler
avec
le
serveur
WWW,
Echanger
des
donnes
via
URIs,
Partager
des
donnes
entre
servlets,
Chaner
des
servlets
(pool
de
connecMons
BD),
GesMon
de
sessions
(e-commerce),
etc...
Servlets
gratuites
Kit de dveloppement des servlets gratuit Nombreuses versions commerciales... (Microson, Netscape I-server, Webstar...) Mais Apache/Tomcat reste la soluMon la plus ecace... 100% gratuite !
ExcuMon service
Peut grer concurremment la connexion avec plusieurs clients en partageant des donnes communes. Contrle les sessions avec un client parMculier en sauvegardant ses donnes. Reconnat le contexte d'un client et peut accder aux cookies. accde au Bases de donnes Traiter et/ou stocker des donnes recueillies via un formulaire HTML
HZpServletRequest
HZpServletRequest
Hrite
de
ServletRequest
Gre
la
requte
en
orant
les
services
pour
accder
aux
informaMons
qu'elle
conMent
:
contexte
du
navigateur
les
paramtres
passes
et
leur
valeurs
accept-language: fr accept-encoding: gzip, deate user-agent : Mozilla/4.0 (compaMble; MSIE 6.0; Windows NT 5.0) host : localhost:8080 connecMon: Keep-Alive cookie nom=ogor
HZpServletRequest
Mthode
String getMethod() String getHeader(String Key) String getRemoteHost() String getRemoteAddr()
Description
Rcupre la mthode HTTP utilise par le client Rcupre la valeur de l'attribut Key de l'entte Rcupre le nom de domaine du client Rcupre l'adresse IP du client
Rcupre la valeur du paramtre Key (cl) d'un formulaire. Lorsque plusieurs valeurs sont prsentes, la premire est retourne
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 Retourne un objet Enumeration contenant la liste des noms des paramtres passs la requte Rcupre le nom du serveur Rcupre le numro de port du serveur
HZpServletResponse
HZpServletResponse
Hrite
de
ServletReponse
Gre
la
rponse
en
orant
les
services
pour
y
meZre
les
informaMons
ncessaires
:
type
de
contenu,
en-tte,
code
de
retour
un
ot
de
sorMe
pour
les
donnes
transmeZre
au
navigateur
(HTML,
Image,
son,
etc)
Mthode
String setStatus(int StatusCode)
HZpServletResponse
Description
Dfinit le code de retour de la rponse Dfinit une paire cl/valeur dans les en-ttes
Dfinit le type MIME de la rponse HTTP, c'est--dire le type de donnes envoyes au navigateur
Dfinit la taille de la rponse
PrintWriter getWriter()
Re t o u r n e u n o b j e t P r i n t W r i t e r permettant d'envoyer du texte au navigateur client. Il se charge de convertir au format appropri les caractres Unicode utiliss par Java
Dfinit un flot de donnes envoyer au client, par l'intermdiaire d'un objet ServletOutputStream, driv de la classe java.io.OutputStream
ServletOutputStream getOutputStream()
Modle
de
programmaMon
Une
servlet
doit
implmenter
linterface
javax.servlet.Servlet
soit
directement,
soit
en
drivant
dune
classe
implmentant
dj
ceZe
interface
comme
(GenericServlet
ou
H/pServlet
)
La classe HZpServlet
La classe servlet doit OBLIGATOIREMENT contenir lune ou lautre de ces 2 mthodes rednies, choisies selon le mode denvoi du formulaire html qui lexcute! service() de HttpServlet appelle automaMquement la bonne mthode en foncMon du type de requtes http
form1.html
import java.io.*;! import javax.servlet.*;! import javax.servlet.http.*;! public class conv extends HttpServlet {! ! !protected void doGet(HttpServletRequest req, HttpServletResponse res)! ! !throws ServletException, IOException {! ! !res.setContentType("text/html");! !PrintWriter out = res.getWriter();! !out.println("<html>");! !out.println("<head><title>Conversion Franc-Euro ou Euro-Franc</title></ head>");! !out.println("<FORM METHOD=POST ACTION=http://localhost:8081/ conversion>");! !out.println("<h1><B>Conversion Francs-Euros ou Euros-Francs</B></h1>");! !out.print("<pre>Montant convertir : ");! !out.print("<input type=text name=montant size=25>");! !out.println("<I>Utiliser le . pour la dcimale</I></pre>");! !out.println("<P><B>Type de conversion :</B><BR>");! !out.println("<input type=radio name=choix value=\"EF\" checked> Euros en Francs <BR>");! !out.println("<input type=radio name=choix value=\"FE\"> Francs en Euros <BR></P>");! !out.println("<P><input type=submit value=\"Valider\"></P>");! !out.println("</FORM>");! !out.println("</html>");! !out.close();! !}
3me exemple
Excuter la servlet
Exemple dexcuMon
Le
chier
web.xml
<?xml version="1.0" encoding="UTF-8"?>! <!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>conversion</servlet-name>! <servlet-class>conv</servlet-class>! </servlet>! <servlet>! <servlet-name>conv</servlet-name>! <display-name>conversion</display-name>! <servlet-class>conv</servlet-class>! </servlet>! <servlet-mapping>! <servlet-name>conversion</servlet-name>! <url-pattern>/conversion</url-pattern>! </servlet-mapping>! <servlet-mapping>! <servlet-name>conv</servlet-name>! <url-pattern>/conversion</url-pattern>! </servlet-mapping>! </web-app>
1re invocation
2me invocation
Le
cycle
de
vie
1.
la
servlet
est
cre
puis
iniMalise
(init() )
ceZe
mthode
nest
appele
par
le
serveur
quune
seule
fois
lors
du
chargement
en
mmoire
par
le
moteur
de
servlet
ceZe mthode est appele automaMquement par le serveur chaque requte de client
Cycle
de
vie
craMon
init
IniMalisaMon/
Disponible
pour
requtes
Erreur
Dbut
requte
Requte
Fin
requte
Erreur
instanciaMon
Fermeture du conteneur
ProblmaMque
Protocole
HTTP
=
protocole
Internet
dconnect
dirent
de
Telnet,
Ftp,
traite
les
requtes
et
les
rponses
comme
transacMons
simples
et
isoles
(requtes
non
apparentes)
Certaines
applicaMons
Web
(e-commerce
:
caddie)
ont
besoin
de
maintenir
une
"mmoire"
entre
deux
requtes
ie.
maintenir
une
connexion
de
l'uMlisateur
sur
le
serveur
pour
se
faire
:
concept
de
"suivi
de
sessions"
Cookies
Donnes
textuelles
envoyes
par
le
serveur
au
client
Stockes
chez
le
client
Renvoyes
vers
le
serveur
lors
de
toutes
requtes
vers
le
serveur
Dure
de
vie
rglable
Permet
la
persistance
A
quoi
a
sert
?
IdenMcaMon
des
uMlisateurs
(e-commerce)
Eviter
la
saisie
dinformaMons
rpMMon
login,
password,
adresse,
tlphone
...
Cookie
et
scurit
Jamais
interprt
ou
excut
:
pas
de
virus
Un
cookie
est
limit
4KB
et
les
navigateurs
se
limitent
300
cookies
(20
par
site)
:
pas
de
surcharge
de
disque
Bien
pour
rendre
prives
des
donnes
non
sensibles
nom,
adresse,
mais
pas
No
CB
!
mais
ne
consMtue
pas
un
traitement
srieux
de
la
scurit
Temps
d'expiraMon
Par
dfaut,
dure
de
vie
d'un
cookie
=
la
connexion.
Si
on
veut
que
le
cookie
soit
sauv
sur
disque,
modier
sa
dure
de
vie
:
public static final int SECONDS_PER_YEAR = 60*60*24*365; cookie.setMaxAge(SECONDS_PER_YEAR);
Le domaine La version
cookie. setComment("pour savoir ") cookie. getComment cookie. getName() // le nom ne peut pas tre modie cookie. getValue() // la valeur peut tre lue ou modie cookie. setValue("une valeur")
Cockies
Pour
facile
implmenter
facile
faire
voluer
Peut
persister
mme
aprs
l'arrt
du
navigateur
Parfois
refuss
par
les
navigateurs
("r-criture
URL)
Non
supports
par
certains
navigateurs
DsacMvs
par
certains
uMlisateurs
pour
des
raisons
de
scurit
ou
de
sauvegarde
des
donnes
personnelles
(si
cookie
prsent,
vous
tes
alls
sur
le
site)
Nombre
limitde
cookiesautoris,
taille
de
cookielimite
(un
navigateur
est
sens
accepter
20
cookies
par
Serveur
Web,
300
cookies
au
total
et
peut
limiter
la
taille
d'un
cookie
4
KB.
Pas
scuris
Fichiers
textes,
ditables
et
modiables
Indisponibles
si
l'uMlisateur
change
de
poste
ou
de
navigateur
Contre
Rcriture
d'URL
Principe
:
ajouter dans la chane de requte de la servlet des informaMons supplmentaires idenMant la session
l'ID uMlisateur est transmis en mme temps que la requte; il est accd par chaque servlet menMonne qui rcupre les informaMons persistantes (BD, chiers) parMr de cet ID
LimitaMons
:
donnes
volumineuses,
caractres
autoriss,
longueur
URL,
donnes
visibles
(scurit)
Rcriture
d'URL
Pour
L'uMlisateur
reste
anonyme,
pas
de
traces
Supports
par
tous
les
navigateurs
Contre
R-criture
systmaMque
des
URLs
fasMdieuse
Ne
marche
que
pour
les
documents
crs
de
faon
dynamique
(formulaires)
LimitaMons
:
idem
la
"rcriture
d'URL"
sauf
pour
la
scurit
(uMlisaMon
de
POST)
Champs
cachs
Pour
Supports
par
tous
les
navigateurs
L'uMlisateur
reste
anonyme,
pas
de
traces
Contre
Ne
marche
que
pour
une
squence
de
formulaires
gnrs
dynamiquement
Impossibles
uMliss,
avec
des
documents
staMques,
des
mails,
des
document
"bookmarks"
Ne
persiste
pas
l'arrt
du
Navigateur
Lobjet
session
Trs
simple
avec
l'API
des
servlets
(JSDK)
objet
HttpSession
Principe
:
Un
objet
"session"
peut
tre
associ
avec
chaque
requte
Il
va
servir
de
"container"
pour
des
informaMons
persistantes
Dure
de
vie
limite
et
rglable
Servlet:
HZpSession
API
de
suivi
de
session
HZpSession
Mthodes
de
craMon
lies
la
requte
(HZpServletRequest)
HZpSession
getSession()
:
retourne
la
session
associe
luMlisateur
HZpSession
getSession(boolean
p)
:
craMon
selon
la
valeur
de
p
AZenMon
:
getSession
avant
getWriter.
EnumeraMon
getAZributNames()
:
retourne
les
noms
de
tous
les
aZributs
Object
getAZribut(String
name)
:
retourne
lobjet
associ
au
nom
setAZribut(String
na,
Object
va)
:
modie
na
par
la
valeur
va
removeAZribut(String
na)
:
supprime
laZribut
associ
na
invalidate()
:
expire
la
session
logout()
:
termine
la
session
DestrucMon (HZpSession)
Modle
basique
HttpSession session = request.getSession(true); Caddy caddy = (Caddy) session.getValue("caddy"); if(caddy != null) { // le caddy n'est pas vide ! afficheLeContenuDuCaddy(caddy); } else { caddy = new Caddy(); ... caddy.ajouterUnAchat(request.getParameter("NoArticle")); session.putValue("caddy", caddy); }....
Architecture
Web
Client
Internet
/
Intranet
Database
Server
HTML
page
Java servlets
Web Server
JDBC DriverManager
SGBD
SGBD Intranet
Lapproche
en
3
parMes
:
la
page
HTML
pour
le
formulaire
d
interrogaMon
la
servlet
eectuant
la
requte
la
page
HTML
rsultat
gnre
par
la
servlet
Le
formulaire
dinterrogaMon
<HTML> Fichier
:
annuaire.html
<HEAD><TITLE>Annuaire YETI</TITLE></HEAD> <BODY> <CENTER><H1> Annuaire de la socit YETI </H1></CENTER> <HR WIDTH="75%"> <CENTER><H2>Recherche de coordonnes</H2></CENTER> <P>Tapez les premires lettres de la personne dsire <P><FORM METHOD=POST ACTION=http://fkeiko.inria.fr:8090/servlet/Annuaire> <INPUT TYPE=TEXT NAME="nom" SIZE=10 MAXLENGTH=20 VALUE=""> <P><INPUT TYPE=SUBMIT NAME="go" VALUE="Rechercher"> <INPUT TYPE=RESET NAME="reset" VALUE="Reset"> </BODY> </HTML>
public class Annuaire extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { ... } public String getServletInfo() { return "La servlet Annuaire"; } }