Servlets
[Link]
Architecture J2EE
Introduction
Navigateur web Serveur web
Requête HTTP
Conteneur de servlet
Method=GET ou POST
HttpRequest
Servlet
COOKIES
Réponse HTTP doGet()
HttpResponse
doPost()
(HTML, javascript, css, XML)
HttpSession
LE PROTOCOLE HTTP
HTTP :HyperText Tranfert Protocol
(RFC 1945 et 2068)
Protocole de rapatriement des documents
Protocole de soumission de formulaires
Fonctionnement (très simple en HTTP/1.0)
Connexion
demande (GET, POST) d’un document
renvoi du document (status=200) ou d’une
erreur
déconnexion
Dialogue HTTP
Types de dialogue
Récupération d’un document
méthode GET
Soumission d’un formulaire
méthodes GET ou POST
Envoi de Document et Gestion de Site
méthodes PUT, DELETE
Méthode HEAD (Récupération des infos sur le
document).
Le client envoie la requête : Méthode POST
Entête de la requête
Post /Nom_Script HTTP/1.0 Méthode,chemin,version
Accept : Text/html Documents acceptés
Accept : image/gif
Accept : image/jpeg
Type et version du
User-Agent : Mozilla/4.0 navigateur ayant soumis
la requête.
*** saut de ligne ***
Var1=Value1&
Paramètres des différents
Var2=Value2 champs du formulaire.
Var3=Value3
corps de la requête
Le client envoie la requête : Méthode GET
Entête de la requête
GET /Nom_Script?var1=val1&var2=val2&…. HTTP/1.0
Accept : Text/html
Accept : image/gif
Accept : image/jpeg
User-Agent : Mozilla/4.0
corps de la requête est vide
Le Serveur retourne la réponse :
Entête de la réponse
HTTP/1.0 200 OK Ligne de Status
Date : Wed, 05Feb02 15:02:01 GMT
Server : Apache/1.3.24 Nom du Serveur
Mime-Version 1.0
Dernière modification
Last-Modified : Wed 02Oct01 24:05:01GMT
Content-Type : Text/html
Type de contenu
Content-legnth : 4205 Sa taille
*** saut de ligne ***
<HTML><HEAD> Le fichier que le client va
afficher
….
</BODY></HTML>
corps de la réponse
Introduction aux servlets
Les servlets sont au serveur Web ce que les
applets sont au navigateur pour le client.
Une servlet est une classe Java , exécutée
par un moteur de servlets, fonctionnant du
côté serveur au même titre que les CGI et
les langages de script côté serveur tels que
ASP ou bien PHP
Les servlets permettent donc de gérer des
requêtes HTTP et de fournir au client une
réponse HTTP dynamique.
Avantages des servlets
Les servlets ont de nombreux avantages par
rapport aux autres technologies côté serveur.
Tout d'abord, étant donné qu'il s'agit d'une technologie
Java, les servlets fournissent un moyen d'améliorer les
serveurs web sur n'importe quelle plateforme, d'autant
plus que les servlets sont indépendantes du serveur web
Une servlet s’exécute dans un conteneur de servlet
qui est indépendant 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 démarrage du serveur ou bien lors de la connexion
du premier client.
Avantages des servlets
Les servlets sont donc actives (résidentes en
mémoire) et prêtes à traiter les demandes des clients
grâce à des threads,
tandis qu'avec les langages de script traditionnels un
nouveau processus est créé pour chaque requête
HTTP.
Cela permet donc une charge moins importante au
niveau du processeur du serveur
L'un des principaux atouts des servlets est la
réutilisation, permettant de créer des composants
encapsulant des services similaires, afin de pouvoir
les réutiliser dans des applications futures.
Enfin une servlet étant une application Java, peut
utiliser toutes les API Java afin de communiquer avec
des applications extérieures, se connecter à des bases
de données, accèder aux entrée-sorties.
Architecture du package
[Link]
Les servlets sont des classes Java implémentant des
classes et des interfaces provenant des packages :
[Link] : un package générique indépendant
du protocole utilisé
[Link]: un package spécifique au
protocole HTTP 1.0
Accessoirement le package [Link] doit être importé,
notamment pour gérer les entrées-sorties et les
exceptions.
Le package [Link] est fourni dans le JSDK
(Java Servlet Development Kit. (Fichier [Link])
Architecture du Servlet
package [Link]
Ainsi toutes les servlets implémentent GenericSrvlet
directement ou indirectement l'interface
Servlet, en dérivant une classe qui service()
l'implémente: c'est-à-dire généralement la
classe HttpServlet, elle-même issue de
GenericServlet. HttpServlet
La classe GenericServlet doPost()
([Link]) définit une
doGet()
classe abstraite (implémentation de base
de l'interface Servlet).
NotreServlet
doPost()
doGet()
Fonctionnement d’une servlet
Lorsqu'une servlet est appelée par un
client, la méthode service() est exécutée.
Celle-ci est le principal point d'entrée de
toute servlet et accepte deux objets en
paramètres:
L'objet ServletRequest encapsulant la requête du
client, c'est-à-dire qu'il contient l'ensemble des
paramètres passés à la servlet (informations sur
l'environnement du client, cookies du client, URL
demandée, ...)
L'objet ServletResponse permettant de renvoyer
une réponse au client (envoyer des informations
au navigateur).
Développement d’une servlet
Afin de développer un servlet fonctionnant avec le
protocole HTTP, il suffit de créer une classe étendant
HttpServlet (qui implémente elle-même l'interface
Servlet).
La classe HttpServlet (dérivant de GenericServlet)
permet de fournir une implémentation de l'interface
Servlet spécifique à HTTP.
La classe HttpServlet redéfinit la méthode service en
lisant la méthode HTTP utilisée par le client, puis en
redirigeant la requête vers une méthode appropriée.
Les deux principales méthodes du protocole HTTP
étant GET et POST, il suffit de redéfinir la méthode
adéquate afin de traiter la requête :
Développement d’une servlet
Si la méthode utilisée est GET, il suffit de
redéfinir la méthode :
public void doGet(
HttpServletRequest request,
HttpServletResponse response
)
Si la méthode utilisée est POST, il suffit de
redéfinir la méthode :
public void doPost(
HttpServletRequest request,
HttpServletResponse response
)
Développement d’une servlet
import [Link].*;
import [Link].*;
Import [Link].*;
public class ServletName extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse
res) throws ServletException {
// lecture de la requete
// traitements
// envoi de la reponse
}
public void doPost(HttpServletRequest req, HttpServletResponse
res) throws ServletException {
// lecture de la requete
// traitements
// envoi de la reponse
}
}
HttpServletRequest
Méthode Description
Récupère la méthode HTTP utilisée par le
String getMethod()
client
Récupère la valeur de l'attribut Key de l'en-
String getHeader(String Key)
tête
String getRemoteHost() Récupère le nom de domaine du client
String getRemoteAddr() Récupère l'adresse IP du client
Récupère la valeur du paramètre
Key (clé) d'un formulaire.
String getParameter(String
Lorsque plusieurs valeurs sont
Key)
présentes, la première est
retournée
Récupère les valeurs correspondant au
paramètre Key (clé) d'un formulaire,
String[] getParameterValues(String c'est-à-dire dans le cas d'une sélection
Key) multiple (cases à cocher, listes à choix
multiples) les valeurs de toutes les entités
sélectionnées
Retourne un objet Enumeration contenant la
Enumeration getParameterNames() liste des noms des paramètres passés à la
requête
String getServerName() Récupère le nom du serveur
String getServerPort() Récupère le numéro de port du serveur
HttpServletResponse
Méthode Description
String setStatus(int StatusCode) Définit le code de retour de la réponse
void setHeader(String Nom, String Valeur) Définit une paire clé/valeur dans les en-têtes
Définit le type MIME de la réponse
void setContentType(String
HTTP, c'est-à-dire le type de
type)
données envoyées au navigateur
void setContentLength(int len) Définit la taille de la réponse
Retourne un objet PrintWriter
permettant d'envoyer du texte au
PrintWriter getWriter() navigateur client. Il se charge de
convertir au format approprié les
caractères Unicode utilisés par Java
Définit un flot de données à envoyer au client, par
ServletOutputStream getOutputStream() l'intermédiaire d'un objet ServletOutputStream, dérivé de
la classe [Link]
void sendredirect(String Permet de rediriger le client vers l'URL
location) location
Gestion des servlets
Moteur de
Servlets
Créer un pool Thread Thread
de threads
Instancier la servlet
Servlet
Appeler la méthode init()
Initialisation
Affecter une requête à un thread Appeler la méthode service()
Requête HTTP 1
Exécution
Affecter une requête à un thread Appeler la méthode service() service
Requête HTTP 2
Réponse HTTP 1 Exécution
service
Réponse HTTP 2
Terminer le pool de threads
Appeler la méthode destroy()
Cycle de vie d’une servlet
Le serveur crée un pool de threads auxquels il va pouvoir
affecter chaque requête
La servlet est chargée au démarrage du serveur ou lors de
la première requête
La servlet est instanciée par le serveur
La méthode init() est invoquée par le conteneur
Lors de la première requête, le conteneur crée les objets
Request et Response spécifiques à la requête
La méthode service() est appelée à chaque requête dans un
nouveau thread. Les objets Request et Response lui sont
passés en paramètre
Grâce à l'objet request, la méthode service() va pouvoir
analyser les informations en provenance du client
Grâce à l'objet response, la méthode service() va fournir
une réponse au client
La méthode destroy() est appelée lors du déchargement de
la servlet, c'est-à-dire lorsqu'elle n'est plus requise par le
serveur. La servlet est alors signalée au garbage collector .
Interface d’une servlet
Pour créer une servlet il est indispensable de mettre
en oeuvre l'interface [Link] permettant
au conteneur d'assurer le cycle de vie de la servlet.
La mise en place de l'interface (généralement réalisée
en étendant [Link] ou
[Link]) fait appel à cinq méthodes :
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()
Première Servlet
import [Link].*;
import [Link].*;
import [Link].*;
public class PremiereServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
[Link]("text/html");
PrintWriter out = [Link]();
[Link]("<HTML>");
[Link]("<HEAD><TITLE> Titre </TITLE></HEAD>");
[Link]("<BODY>");
[Link]("Ma première servlet");
[Link]("</BODY>");
[Link]("</HTML>");
[Link]();
}
}
Déploiement d’une servlet
Avec Tomcat
Pour définir une application Web, créer le fichier
<tomcat_dir>/conf/catalania/localhost/[Link]
<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
Descripteur de déploiement de la
servlet : [Link]
Créer le fichier <docBase>/WEB-INF/[Link]
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 2.2//EN"
"[Link]
<web-app>
<servlet>
…..
</servlet>
</web-app>
Descripteur de déploiement de la
servlet : [Link]
<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>
Charger et invoquer une
Servlet
D'une manière générale, une URL du type :
[Link]
Machine ou Liste des
Alias paramètres et
se trouve le Numéro de port Web appli. correspondant à de leurs
serveur de sur lequel il est à <url-pattern> valeurs
servlets l’écoute