Java EE-Chap2-servlet
Java EE-Chap2-servlet
servlet 1
Plan
• Applications WEB
• Servlet
• Pages JSP
• Actions (tags)
• Mise en œuvre du modèle MVC
servlet 2
Pages WEB ?
servlet 3
Pages WEB
• Mise à disposition de pages sur le WEB
– Protocole HTTP
• Cycle requête/réponse du protocole HTTP
– Un client émet une requête vers un serveur
• La requête possède le format HTTP
– Le serveur est obligé de répondre au client
• La réponse est formatée HTTP
– Les requêtes sont indépendantes les unes des
autres
servlet 4
Pages WEB dynamiques ?
• Protocole HTTP
• Pages WEB dynamiques pourquoi ?
– Adapter les pages à la demande du client (outils de
recherche, …)
– Présenter des informations changeantes (météo, catalogue
de produit avec leur prix, ...)
• Pages WEB dynamiques comment ?
– Des ressources statiques - pages html, images, …,
– Des ressources semi-statiques – SGBDR, BD XML
– Des scripts et des programmes - CGI, PHP, JSP, javascript
servlet 5
Pages dynamiques - architecture
• Au moins trois niveaux applicatifs
Utilisateur
Client (navigateur)
Requette
HTTP
Réponse HTTP
Application
Serveur (script, programmes,…)
Interrogation
Données
Base de données (SGBD, XML, …)
servlet 6
Extensibilité des serveurs HTTP
• Mécanisme standard d’extension : CGI
Common Gateway Interface
– Le serveur passe la requête à un programme adapté
CGI
– Le programme génère la réponse et la retourne au
serveur
• Programme CGI écrit en n’importe quel langage
Requête Requête
HTTP HTTP Programme
Client Serveur
Réponse Réponse CGI
HTTP HTTP
servlet 7
Technologies d’extension
les plus connues
• CGI : Common Gateway Interface
– programme de réponse écrit en n’importe quel langage
• ASP : Active Serveur Page
– html, JavaScript, VBScript
– Technologie propriétaire : Microsoft
• PHP :
– Orienté SGBD, Technologie open source
• Servlet, pages JSP
– CGIs basés sur Java, open source
servlet 8
Servlets et pages JSP
• Des CGIs écrits en Java
• Une technologie
– Les servlets et les pages JSP
– L’application,
• sa structure, ses paramètres de configuration
• Un outil : le conteneur de servlets
– Ex : Tomcat d'Apache : open source
– Nombreuses implémentations commerciales
servlet 9
Services WEB en java
Clients
Requêtes
Requête
HTTP Conteneur
HTTP
Serveur de
Réponse
Réponses HTTP
servlets
HTTP
servlet 10
Les Servlets = une ouverture vers la
technologie Objet de Java
Requête JDBC
HTTP LDAP
JNDI
Technologie …
Servlet objet Java
Api XML
Réponse
HTTP
Internationalisation
servlet 11
Non limité au protocole HTTP
• Fonctionnalités
– Servlets en général
• Champ d'application pas limité au protocole HTTP,
• Permet d'étendre d'autres protocoles (FTP, mail, ...)
– Servlets HTTP
• Implémente le protocole requête/réponse HTTP
• Cas d’usage le cas le plus courant
• Mêmes rôles que les CGIs
servlet 12
Serveurs de servlet disponibles
servlet 14
Servlet versus Javascript
• Javascript comme les Applets permet de
gérer le dynamisme chez le client
• Toutes les données doivent être connues
localement chez le client
• Javascript ne peut pas accéder à des
données d'un serveur
servlet 15
CGI versus Servlet
ressemblances
servlet 16
CGI versus Servlet - différences
• Portabiblité
– Un CGI est lié au type de la plateforme serveur et
du langage dans lequel il a été développé
– Les Servlets sont indépendants de la plateforme
• Passage à l'échelle
– Les CGIs posent des problèmes d'échelle
• Un processus par CGI ...
– Un serveur de Servlet est conçu pour gérer des
problèmes d'échelle
• La JVM reste active et gère plusieurs processus pour
une même classe
servlet 17
Autres avantages des servlets
• Contextes d’application et de session
implémentés automatiquement par le
conteneur de servlet
• Disponibilité d'outils de programmation de
haut niveau : Java
servlet 18
Méthodes du protocole http
servlet 19
GET versus méthode POST
• Méthode GET est utilisée par défaut pour toute
requête WEB
– les données d’entrée sont ajoutées à l ’URL de la requête
(limite la taille des données en entrées)
– Utilise le cache si la page y est déjà
– « Esprit » Extraction d’information
• Méthode POST remplit les mêmes services mais
– les données d’entrée sont transmises dans le corps de la
requête (elles peuvent être plus grosses)
– Il n’y a jamais d’accès au cache
– « Esprit » Mise à jour d’information sur le serveur
servlet 20
Servlet
servlet 21
Deux librairies de base
servlet 22
Librairies sur les servlets
• 9 librairies
– [Link]
– [Link]
– [Link]
– [Link]
– [Link]
– [Link]
– [Link]
– [Link]
servlet 23
Servlet : mise en oeuvre
• 3 méthodes de mise en oeuvre
– Implémenter l'interface [Link]
• Méthodes liées au cycle de vie d'une servlet
– init, service, destroy
– Etendre la classe [Link]
• Protocole non implémenté (à la charge de l’utilisateur)
– Etendre la classe
[Link]
• Spécialisation des GenericServlet
• Protocole http implémenté (méthodes doget, dopost)
servlet 24
Votre première servlet
public class Bonjour extends HttpServlet {
public void doGet(
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
[Link]("text/html");
printWriter out = [Link]();
[Link]("<html><head>");
[Link]("<title>Bonjour</title>");
[Link]("</head><body>");
[Link]("<h1>Bonjour !</h1>");
[Link]("</body></html>");
}
} servlet 25
Classe HttpServlet (1)
• C’est la classe que l’on étend en général !
• Méthode service() déjà écrite
– Ne pas la surcharger !
• Méthodes à implémenter
– void init()
– void doGet(HttpServletRequest,
HttpServletResponse) Requête GET
– void doPost(HttpServletRequest,
HttpServletResponse) Requête POST
– String getServletName()
– String getServletInfo()
– void destroy()
servlet 26
Classe HttpServlet (2)
• Méthodes prédéfinies utiles
– void log(String)
– void log(String,Throwable)
• Générer des traces
– ServletConfig getServletConfig()
• Accès aux informations de configuration de cette
servlet sur le serveur
– ServletContext getServletContext()
• Explication à venir …
• Exceptions: ServletException
servlet 27
Cycle de vie d’une servlet
1. Le conteneur de servlet créé une seule
instance de la servlet
2. Il appelle sa méthode init() une seule fois
3. A chaque demande de service un processus
est lancé sur la méthode service()
4. La méthode destroy() est appelée pour la
destruction de l’instance
servlet 28
La vie d’une servlet
servlet 29
Diagramme des temps
servlet 30
Une servlet = plusieurs Threads
• Plusieurs Threads peuvent traverser la
méthode service() en même temps
– Les variables doivent être locales aux méthodes
– Les attributs de classes ne peuvent être que de
constantes de configuration initialisées dans la
méthode init()
servlet 31
Variables d'instance et
partage de code
• Les variables d'instance sont partagées entre toutes
les exécutions de la méthode service()
• Elles ne sont pas "Thread safe".
• Leur usage doit être limité à des déclarations de
constantes
• Les variables d'instance des objets manipulés
doivent elles aussi être rendues Thread safe
• Attention aux modifications de fichiers !
servlet 32
Modification d’un compteur golbal
public class monThread extends HttpServlet {
private int compteur = 0;
servlet 33
Une servlet sûre par rapport aux
Threads ?
• Utiliser seulement de variables locales et des
paramètres
• Eviter les variables statiques et les variables
d’intance
• Sinon utilisez des sections critiques
• N’appelez que des méthodes de classes qui
respectent les règles ci-dessus
servlet 34
Implémenter les deux méthodes
HTTP
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
…
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
doGet(request, response);
}
servlet 35
Arguments de doGet() et doPost()
servlet 36
La requête
• Rendue accessible par l’objet
[Link]
• Méthodes utiles
– String getParameter(String)
Compile et décode l’URL (pour GET) le corps (POST)
– InputStream getInputStream()
Pour lire de manière brute le corps de la requête POST
– String getRemoteHost()
L’adresse IP du client
– ...
servlet 37
Extraits Apidoc de l’objet request
[Link] getMethod()
Returns the name of the HTTP method with which this request
was made, for example, GET, POST, or PUT.
[Link] getRequestURL()
Reconstructs the URL the client used to make the request.
[Link] getPathInfo()
Returns any extra path information associated with the URL
the client sent when it made this request.
Cookie[] getCookies()
Returns an array containing all of the Cookie objects the client
sent with this request.
[Link] getQueryString()
Returns the query string that is contained in the request URL
after the path.
[Link] getRemoteUser()
Returns the login of the user making this request
servlet 38
Utilisation de l’objet requête - Exemples
• Lire un paramètre
String s = [Link]("somme");
int somme = [Link](s);
• Informations contextuelles
[Link]("personneId", "blabla");
…
String maVal = [Link]("personneId");
servlet 39
Entêtes d’une requête
servlet 40
La réponse
• Rendue accessible par l’objet
[Link]
• Méthodes utiles
– void addHeader(String name, String value)
• Ajoute une paire nom/valeur à l’entête de la réponse
– void setStatus(int sc)
• Affecte le statut (valeur par défaut SC_OK =200)
– void sendError(int sc, String msg)
• Envoie une réponse erreur
– void sendRedirect(String url)
• Redirige le navigateur vers une nouvelle page
– ServletOutputStream getOutputStream()
• Le Flux de sortie pour la réponse
servlet 41
Utilisation de l’objet réponse
Exemples
• Pour définir le type MIME et envoyer du binaire
ServletOutputStream out = getOutputStream();
[Link]("img/jpeg");
• Pour interdire la mise en « cache » méthodes GET
[Link]("Expires", 0);
• Pour signaler que la méthode POST est interdite
[Link](
response.SC_METHOD_NOT_ALLOWED,
"Désolé, POST non disponible !"
);
servlet 42
Entêtes d’une réponse
• Toute réponse possède des champs entêtes
– [Link]("Expires", 0);
• Entête du protocole HTTP
– Code de statut setStatus(int sc);
• utilisé pour donner les raisons pour les quelles la
requête a échouée
– Cookies addCookie(Cookie c)
• Pour ranger de l’information chez le client, par
exemple pour suivre une session
servlet 43
Attention faire les choses dans l’ordre
servlet 44
Tampon de sortie
• Par défaut tout contenu de réponse est envoyé
directement au client via le flux de sortie
(OutputStream ou PrintWriter)
• Utiliser un tampon permet de retarder le moment
où les données sont envoyées au client et permet
de retarder les actions suivantes
– Changer les bits d’état de la réponse
– Modifier les entêtes de la réponse
– Détourner la réponse par un forward
servlet 45
Mise en place d’un tampon
PrintWriter sortie =
new PrintWriter(
new BufferedWriter(
[Link]()));
[Link](0.123);
Flux de Flux de
PrintWriter
caractères
BufferedWriter
caractères
Writer client
servlet 46
Contrôle de flux
Navigation de page en page
servlet 47
Utiliser d’autres ressources WEB
• Naviguer à partir d’une page statique : HTML
<img src="[Link]" alt="…"/>
<a href="[Link]">Aller à la suite</a>
• Mais aussi inclure des ressources
– Inclure une bannière, un copyright …
• Les deux méthodes à partir d’une servlet
– Inclusion
– Forward
• Dans tous les cas il faut obtenir un objet
– [Link]
servlet 48
Transfer de contrôle
• Objet RequestDispatcher
– Mis en œuvre par le serveur
– Les objets Request et Response sont transmis
– Transmission immédiate au moment de l’exécution de la méthode
forward()
– Le navigateur ne voit rien
• Redirect [Link](url)
– Mis en œuvre par le navigateur
– Le paramètre url est traité comme une nouvelle requête du client
– Le navigateur enregistre le changement de contrôle dans son
historique
servlet 49
L’objet RequestDispacher
RequestDispatcher dispatch;
servlet 51
Notion d’application
servlet 52
Hiérarchie d’une application
• Une racine
– Le nom de la racine est le nom de
l’application
• Une partie invisible de l’extérieur
– Le répertoire WEB-INF, contient les
informations de gestion de l’application
• Tout le reste visible de l’extérieur
– Structure non imposée
servlet 53
Le répertoire WEB-INF
• Le répertoire WEB-INF contient
– un document xml [Link] qui décrit
l’installation de l’application
– un répertoire classes pour le code java
(classes)
– un répertoire lib pour les librairies jar
– Le reste est libre :
• source, fichiers xml, …
• Chargement des classes
– D’abord dans le répertoire classes,
puis dans les librairies du répertoire lib
servlet 54
Le fichier [Link]
• Fichier de description de l’application
– Utilisé par le conteneur de Servlet pour effectuer le
déploiement de l’application
– Document xml dont l’élément racine est <web-app>
<web-app>
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>[Link]</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet1</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
servlet 55
[Link] - Informations de déploiement
• Le document [Link] contient
– Paramètres d’initialisation
– Configuration de la session
– Déclarations de servlets
– Interprétation d’URL, mapping
– Classes d‘écoute liées au cycle de vie des servlets
– Définition de filtres
– Types MIME
– Liste de documents d’accueil, Welcome files
– Pages de récupération d’erreur
– Librairies de tag JSP
– Identifications JNDI
servlet 56
Structure du document [Link]
• Servlet 2.2
• Le fichier
[Link]
contient la
séquence
suivante
d’éléments
xml
servlet 57
Structure du document [Link] (2)
• Servlet 2.3
• Le fichier [Link]
contient la séquence
suivante d’éléments
xml
servlet 58
Déploiement d’une application
• Deux formats de déploiement
– La hiérarchie complète non compressée
– Un fichier WAR (Web Archive) qui est une
compression zip de la hiérarchie
• On déploie l’un ou l’autre sur le répertoire de
déploiement du serveur,
– Pour Tomcat, dans son répertoire webapps
– Le serveur introspecte périodiquement son
répertoire de déploiement
servlet 59
Trois exemples d’application WEB
servlet 60
Exemple1 - l’application « bonjour »
• Une hiérarchie application
– Racine bonjour
• Un fichier de configuration
– Met en relation un nom du
service (URL) et la servlet
• Une servlet
– Classe Bonjour hérite de
[Link]
servlet 61
La servlet Bonjour
public class Bonjour extends HttpServlet {
public void doGet(
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
[Link]("text/html");
printWriter out = [Link]();
[Link]("<html><head>");
[Link]("<title>Bonjour</title>");
[Link]("</head><body>");
[Link]("<h1>Bonjour !</h1>");
[Link]("</body></html>");
}
} servlet 62
Choix de la servlet
dans le document [Link]
<servlet> nom interne
<servlet-name>salut</servlet-name>
<servlet-class>Bonjour</servlet-class>
</servlet> Classe Java
<servlet-mapping>
<servlet-name>salut</servlet-name>
<url-pattern>hello</url-pattern>
</servlet-mapping>
Patron d’URL
servlet 63
URL
• Trouver l’application
[Link]
Chemin de contexte
• Le conteneur gère un contexte par application
– Chaque application possède son chemin de contexte
– C’est le plus grand chemin de contexte trouvé qui détermine
l’application cible
• Le reste de l’URL sert à déterminer la servlet
servlet 64
Choix de la servlet
• Deux étapes
1. Choix du contexte
• à l’aide des noms d’application
2. Choix de la servlet (service)
• à l’aide de document web-xml de l’application
• Mécanisme de modèle (patron)
servlet 65
Utilisation d’une servlet
1. Compiler les classes et servlets de l’application
2. Déployer l’application sur le serveur
3. Lancer le serveur
4. Démarrer un navigateur et demander l’URL de
la servlet
– [Link]
servlet 66
Plusieurs applications indépendantes
Serveur • Un conteneur de
bekkers:8080
Servlets gére plusieurs
applications, chacune
Appli 1 … Appli n offre plusieurs services
bonjour xml2svg
service 1 … service k
transform check
servlet 67
Exemple - choix du contexte
• Deux applications
– monAppli et monAppli-demo
• Chemin de contexte dans une URL (en rouge)
– [Link]
– Le plus long chemin de contexte est choisi
servlet 68
Ajouter une page d’accueil à
l’application « bonjour »
• Une hiérarchie application
– Racine bonjour
• Une page d’accueil html
– À la racine du projet
– Toutes les pages à la racine
sont visibles de l’extérieur
• Le fichier de configuration
• La servlet
servlet 69
Passer par une page d’accueil
• La page d’accueil est un formulaire [Link]
<html>
<head>
<title>Requête Bonjour</title>
</head> Appel du service
<body>
<h1>Requête Bonjour</h1>
<form method="GET" action= "hello">
<input type="SUBMIT">
</form>
</body>
</html>
servlet 70
Formulaires html
• Elément <form> envoie une requète http
<form action="[Link]
bin/reg"
method="post">
... Composants du formulaire ...
</form>
– L’attribut action est l’url du service http
– L’attribut post est la méthode d’appel
• Deux méthodes get, post
servlet 71
Composant <input type="submit">
• Bouton de soumission
<input type="submit"
[name=" ... "][value=" ... "]>
– L’attribut name est un paramètre envoyé
au service
• S’il est absent pas de paramètre envoyé
– L’attribut value s’affiche sur le bouton
• s’il est absent une valeur par défaut
s’affiche par exemple « Submit Query »
• Si l’attribut name est présent alors la valeur
du paramètre envoyé est celle de l’attribut
value
servlet 72
Déroulement de l’accès
• Premier accès au serveur par la page d’accueil
– [Link]
servlet 73
Comprendre l’activité de la servlet
servlet 74
Activités gérées par la servlet
1. Lire les données expédiées par le demandeur
2. Lire les méta-informations sur la demande et le
demandeur
3. Calculer la réponse (accés aux SGBD …)
4. Formater la réponse (généralement en html)
5. Envelopper la réponse http (type de document en
retour, cookies …)
6. Transmettre le document dans un format adapté
– texte (eg. html)
– binaire (eg. gif)
– compressé (eg. gzip)
servlet 75
Activités de la servlet « Bonjour »
public class Bonjour extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{ 5 Envelopper la réponse
[Link]("text/html");
PrintWriter out = [Link]();
[Link]("<html>");
[Link]("<body>");
[Link]("<head>");
[Link]("<title>Bonjour !</title>");
[Link]("</head>"); 4 Formater la réponse
[Link]("<body>");
[Link]("<h1>Bonjour !</h1>");
[Link]("</body>"); 1 Pas de données
[Link]("</html>"); 2 Pas de métadonnées
}
6 Transmettre la réponse
servlet 3 Pas de calcul 76
}
Envelopper/transmettre la réponse
• Paramètre ServletResponse response de la méthode
doGet
• L’objet [Link] assiste la
servlet à coder la réponse au client
– Créé par le moteur de servlet
5
– Envoyé en paramètre d’entrée 6
• Réponse « flux de caractères »
[Link]("text/html");
PrintWriter out = [Link]();
– Attention, appeler setContentType() avant getWriter()
• Réponse en binaire
– utiliser le ServletOutputStream retourné par
[Link]()
servlet 77
Exemple 2 - l’application « conversion »
servlet 79
Utilisation de la servlet
• Accès à la page d’accueil :
– [Link]
servlet 80
Formulaire de saisie
• Envoie du paramètre somme
<HTML>
<HEAD>
<TITLE>Introductions</TITLE>
</HEAD>
<BODY>
<FORM METHOD=GET ACTION="conversion">
Donnez votre somme en francs
<INPUT TYPE=TEXT NAME="somme"><P>
<INPUT TYPE=SUBMIT>
</FORM>
</BODY>
</HTML>
Saisie du paramètre somme
servlet 81
Récupération du paramètre
• Le paramètres dans l’url
[Link]
ersion?somme=12
• Réception du paramètre dans la servlet
– Objet [Link]
• Instance créé par le moteur de servlet
• Envoyée comme paramètre d’entrée de doGet()
– Méthode getParameter() de l’objet request
String val = [Link]("somme");
servlet 82
Récupération du paramètre
public class ConvertirEnEuro
extends HttpServlet {
public void doGet(HttpServletRequest req,
HttpServletResponse response)
throws IOException, ServletException {
…
int francs =
[Link](
[Link]("somme")
);
…
}
} // fin class ConvertirEnEuro
servlet 83
Récupération du paramètre - 2
[Link]("text/html");
PrintWriter out = [Link]();
[Link]("<html>");
[Link]("<head><title>Convertir en Euro</title></head>");
[Link]("<body>");
[Link]("<h1>Résultat</h1>");
[Link](francs + " Frs valent ");
[Link](francs / 6.55957 + " Euro");
[Link]("</body></html>");
servlet 84
Troisième exemple d’application
servlet 85
Exemple 3 – Transformation xslt
servlet 86
Formulaire de la page d’accueil
servlet 87
Produire un document svg
• Définir le type de document de sortie
[Link]("image/svg+xml");
• Produire la sortie
StreamResult result =
new StreamResult([Link]());
[Link](source, result);
servlet 88
Compiler les documents xml
• Compiler un document reçu en paramètre
/* créer un analyseur DOM */
DocumentBuilderFactory factory =
[Link]();
DocumentBuilder builder = Transforme la chaîne
[Link](); en un flux d'octets
Lecture de la chaîne
paramètre« Document » servlet 89
Transformer un document
String xsl = [Link]("/xsl/[Link]");
// création d'un transformeur
TransformerFactory transFactory =
[Link]();
Transformer transformer = [Link](
new StreamSource(xsl));
[Link]("[Link]", Passage de
[Link]("[Link]")); parametre
à la feuille
[Link]("[Link]",
de style xsl
[Link]("[Link]"));
// fabrication de la source
DOMSource source = new DOMSource(document); entrée
// transformation
StreamResult result = new
StreamResult([Link]()); sortie
[Link](source,
servlet result); 90
Configurer l’application :
document [Link]
servlet 91
Document [Link]
• Interpréter les URLs
• Divers
servlet 92
Interprétation par défaut des URLs
• Servlets
– Mécanisme d’alias
• Fichiers auxiliaires, pages JSP
[Link]
servlet 93
Association URL ↔ service
[Link]
servlet 94
Correspondances d’URL
• On test l’URL en regard de patrons donnés dans
le fichier [Link]
• On choisit dans l’ordre
– Modèle d’url correspondant exactement
– Le plus long chemin /…/*
– Dernier segment avec une extension *.do
– Par défaut /
• Ambiguités
– La première dans l’ordre ci-dessus qui réussit gagne
servlet 95
Correspondance exacte
• Description :
<servlet-mapping>
<servlet-name>salut</servlet-name>
<url-pattern>/hello<url-pattern>
</servlet-mapping>
• URL
[Link]
[Link]
servlet 96
Chemin le plus long
• Chaîne commençant par « / » et finissant par « /* »
<servlet-mapping>
<servlet-name>salut</servlet-name>
<url-pattern>/hello/bekkers/*</url-pattern>
</servlet-mapping>
• Exemple
[Link]
[Link]
[Link]
servlet 97
Correspondance avec une extension
• Le derbier segment contient un « *.XXX»
– description :
<servlet-mapping>
<servlet-name>salut</servlet-name>
<url-pattern>*.hello</url-pattern>
</servlet-mapping>
– URL
[Link]
[Link]
[Link]
servlet 98
Correspondance par défaut
• Chaîne « / » seule
– description :
<servlet-mapping>
<servlet-name>salut</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
– URL
[Link]
servlet 99
Exemples
• Associations
– Servlet1 /foo/bar/*
– Servlet2 /foo/*
– Servlet3 /catalogue
– Servlet4 *.bop
• Exemples d’URL
– /foo/bar/[Link] servlet1
– /foo/bar/[Link] servlet1
– /foo servlet2
– /foo/[Link] servlet2
– /catalogue/catalogue/[Link] 404 Error page
– /catalogue/[Link] Servlet4
– /[Link] servlet4
servlet 100
Document [Link]
• Interpréter les URLs
• Divers
servlet 101
Élément <welcome-file>
[Link]
Contexte Service
<error-page>
<exception-type>
[Link]
</exception-type>
<location>/common/[Link]</location>
</error-page>
servlet 103
Contraintes de sécurité
<security-constraint>
<web-resource-collection>
<web-resource-name>
Entire Application
</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
servlet 104
Authentification du client
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>
Tomcat Manager Application
</realm-name>
</login-config>
servlet 105
Paramétrage d'une application
• Problème : rendre des informations accessibles aux
applications WEB sans les "cabler" dans le code JSP
ou Java
– Exemple : Paramètres d'accès à une base de données :
• l'URL
• le nom de classe Driver
• le nom d'utilisateur
• le mot de passe
• Une méthode : Utiliser le fichier [Link]
servlet 106
Paramètrage par le fichier [Link]
• Entrées d'environnement (tout objet Java)
<env-entry>
<env-entry-name>[Link]
</env-entry-name>
<env-entry-value>[Link]
</env-entry-value>
<env-entry-type>[Link]</env-entry-type>
</env-entry>
• Paramètres de contexte (String uniquement)
<context-param>
<param-name>[Link]</param-name>
<param-value>[Link]</param-value>
</context-param>
servlet 107
Récupération des paramètres
• Entrées d'environnement (tout objet Java)
// Obtenir le contexte d'environnement
Context initCtx = new InitialContext();
Context envCtx = (Context)
[Link]("java:comp/env");
// rechercher l'information
String driver = ([Link])
[Link]("[Link]");
• Paramètres de contexte (String uniquement)
String driver = application.
getInitParameter("[Link]");
servlet 108
Notions de contexte
servlet 109
Problème du suivi de session
• Protocoles connectés – Session explicite
– FTP, Telnet
– Notion de session
• Connection/session/déconnection
• Protocole déconnecté – Session non explicite
– HTTP
– Chaque requête est une transaction isolée
– Nécessité de déterminer si un ensemble de
requêtes vient du même client
• Introduire un suivi de session
servlet 110
Conserver l’information
• Les servlets offrent trois portées de contextes
par application
1. L’application
Application
2. La session
3. La requête
Session 1 Session 2
requête 1 Requête 1
requête 2 Requête 2
servlet 111
Trois contextes
1. Application
[Link]
2. Session
[Link]
3. Requête
[Link]
uest
servlet 112
Contexte global à l’application
• Objet [Link]
– Visible par toutes les sessions et toutes les pages d’une
même application
• Ce contexte peut servir à
– dialoguer avec le conteneur de servlet
• Obtenir des information sur un fichier présent sur le serveur,
• Gérer les requêtes d’une même application,
• Écrire dans un fichier de log.
– communiquer de l'information entre servlets d'une
même application
servlet 113
Utiliser le contexte de l’application
• Obtenir le contexte de l'application (2 étapes)
ServletConfig config =
[Link]();
ServletContext appli =
[Link]();
• Mémoriser un objet
Objetc myObject = ...
[Link]("racine", myObject );
• Extraire un objet mémorisé
myObject = [Link]("racine");
servlet 114
Utiliser le contexte de l’application bis
• Problème :
– Accéder à un fichier local à l’application
• Solution :
– utiliser la méthode getRealPath()
– chemin absolu de la racine de l'application
String racine = [Link]("/");
– chemin absolu vers un fichier quelconque de
l'application Notez la présence du "/"
en début de nom
String fichier =
[Link]("/xml/[Link]");
servlet 115
Suivi de session
• Session
– Ensemble de requêtes apparentées entre un client unique
et un serveur WEB
– Permet au client de parcourir un site web tout en
remplissant son cadie
• Trois méthodes de suivi de session
1. Suivi automatique par le serveur de servlet à partir des
informations envoyées par le client
– Un chronomètre permet de borner dans le temps la durée de la
session
2. Réécriture d’URL avec des paramètres cachés
3. Utilisation des cookies
servlet 116
HttpSession
• Rôle
– suivi de session automatique par le serveur de servlet
• Objet [Link]
• Conserver de l’information entre deux requêtes liées
d’un même utilisateur
– Une session dure un temps borné et traverse une ou
plusieurs connections d’un et un seul utilisateur.
– L’utilisateur peut ainsi visité un même site plusieurs fois en
étant reconnu.
– Le serveur dispose de diverses méthodes pour mainenir la
notion de session : cookies ou le réécriture d’URLs.
servlet 117
Objet HttpSession
• Obtenir la session
– HttpSession session =
[Link](true);
• Gérer des attributs de session
void setAttribute(String name,
Object value)
void removeValue(String name)
Object getAttribute(String name)
[Link] getAttributeNames()
• Divers
Long getCreationTime()
String getId()
servlet 118
Problèmes pour obtenir la session
• L'identification de la session est faite de façon
transparente par le conteneur de servlet, qui utilise
des cookies ou la réécriture d'URL
• Etant donnée que les cookies sont stockés dans le
en-têtes HTTP, et que celles-ci doivent être les
premières informations envoyées, la méthode
getSession() doit être appelée avant tout envoi de
données au navigateur (la méthode doit être
invoquée avant toute écriture sur le flot de sortie
de la servlet)
servlet 119
Gérer la durée d’une session
• int setMaxInactiveInterval(int interval)
– Définit l'intervalle de temps maximum entre deux
requêtes avant que la session n'expire
• int getMaxInactiveInterval(int interval)
– Retourne l'intervalle de temps maximum entre
deux requêtes avant que la session n'expire
servlet 120
Les filtres
servlet 121
Filtrer les requètes et les réponses
• Un filtre est un programme qui peut transformer les entêtes
et les contenus des requètes et des réponses
• Exemples d’Applications des filtres
– authentication,
– logging,
– image conversion, data
– compression,
– encryption,
– tokenizing streams,
– XML transformations,
– and so on.
servlet 122
Interface à implémenter
• Les interface à implémenter sont
– Filter, FilterChain, et FilterConfig
– Dans la paquetage [Link].
• Exemple
public final class monFiltre
implements Filter {
private FilterConfig filterConfig = null;
public void init(FilterConfig filterConfig)
throws ServletException {
[Link] = filterConfig;
}
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException, ServletException {
…
}
} servlet 123
Références
• Tutorial de sun (1500 pages)
– (html) [Link]
update2/doc/[Link]
– (pdf) [Link]
update2/doc/[Link]
• Tutorial Sun sur les servlets et jsp (600 pages
gratuites en pdf)
– [Link]
[Link]
• Un tutorial sympa
– [Link]
servlet 124