Vous êtes sur la page 1sur 31

Servlet

2017
Faculté des Sciences Agadir

1
Servlet
• La technologie Servlet est utilisée pour créer une
application Web (déployé du côté serveur et génère
des pages Web dynamique).
• La technologie Servlet est robuste et évolutive grâce au
langage java.
– Avant Servlet, le langage de script CGI (Common Gateway
Interface) était populaire comme langage de
programmation C++ côté serveur. Mais il y avait de
nombreux inconvénients de cette technologie.Nous avons
discuté de ces inconvénients ci-dessous.
• Il existe de nombreuses interfaces et classes dans l'API
servlet telles que Servlet, GenericServlet, HttpServlet,
ServletRequest, ServletResponse etc.

2
Qu'est-ce qu'un servlet?
• Servlet peut être décrit de plusieurs façons, selon le
contexte.
• Servlet est une technologie utilisée pour créer des
applications Web.
• Servlet est une API qui fournit de nombreuses
interfaces et classes, y compris des documentations.
• Servlet est une classe qui étend les capacités des
serveurs et répond à la demande de requête. Il peut
répondre à tout type de demandes.
• Servlet est un composant Web qui est déployé sur le
serveur pour créer une page Web dynamique.
3
Qu'est-ce qu'une application Web?
• Une application Web est une application accessible depuis le Web. Une application Web
est composée de composants Web tels que Servlet, JSP, Filter etc. et d'autres composants
tels que les fichiers HTML.
• Les composants Web s'exécutent généralement dans le serveur Web (Appache Tomcat)
et répondent à la requête HTTP.

4
CGI (interface Commmon Gateway)

• La technologie CGI permet au serveur Web pour traiter les requêtes


HTTP. Pour chaque request il y’a création d’un processus PS

Inconvénients de CGI
La technologie CGI présente de nombreux problèmes:
• Si le nombre de clients augmente, il y’a augmentation de création de PS et
par conséquent consommation de la mémoire et faut plus de temps pour
envoyer la réponse.
• Pour chaque requête, il démarre un processus et le nombre de PS à
démarrer par le serveur Web est limité.
• Il utilise un langage dépendant de la plate-forme, par exemple C, C ++,
perl.

5
Avantages de Servlet
Il existe de nombreux avantages de la servlet sur CGI.
Le conteneur Web crée des threads pour traiter les demandes
multiples à la servlet.
Threads ont beaucoup d'avantages sur les processus tels qu'ils
partagent une zone de mémoire commune, léger, le coût
de la communication entre les threads sont faibles.
Les avantages de la servlet sont les suivants:
• Meilleure performance: parce qu'elle crée un thread pour
chaque demande et non des processus.
• Portabilité: parce qu'elle utilise le langage java.
• Robust: Les servlets sont gérés par JVM, donc nous n'avons
pas besoin de nous préoccuper de la fuite de mémoire, de
la collecte des ordures, etc.
• Sécurité : car il bénéficie de la sécurité du langage java ..

6
7
HTTP (Hyper Text Transfer Protocol)

• Le protocole de transfert hypertexte (HTTP) est un protocole au niveau de


l'application pour les systèmes d'information hypermédia distribués et
distribués. Il s'agit du protocole de communication, sans état, de données
utilisé pour établir la communication entre le client et le serveur.
• HTTP est un protocole de communication basé sur TCP / IP, qui est utilisé pour
fournir les données comme des fichiers d'image, des résultats de requêtes, des
fichiers HTML, etc.
• Sur le World Wide Web (WWW) avec le port par défaut est TCP 80. Il fournit la
manière normalisée pour les ordinateurs de communiquer entre eux.
• HTTP est sans état ( ne possède pas de mémoire): Le client et le serveur ne se
connaissent que lors de la requête en cours. Ensuite, les deux s'oublient. Du
faite que le protocole est sans état, ni le client ni le serveur ne peuvent
conserver les informations sur les différentes demande provenant des pages
Web.

8
HTTP Request
• La demande envoyée par l'ordinateur à un serveur Web contenant
toutes sortes d'informations potentiellement intéressantes est
appelée requêtes HTTP.
Le client HTTP envoie la demande au serveur sous la forme d'un
message de requête qui comprend les informations suivantes:
• La ligne de demande
• L'analyse de l'adresse IP source, proxy et port
• L'analyse de l'adresse IP de destination, protocole, port et hôte
• L'URI demandé (Uniform Resource Identifier)
• La méthode de demande et le contenu
• L'en-tête User-Agent
• L'en-tête de contrôle Connection
• L'en-tête de contrôle du cache

9
Comparaison entre la méthode GET et POST

10
Les méthodes GET et POST sont utilisées pour effectuer des requêtes-réponses entre le
serveur et le client
•La méthode GET demande les données d'une ressource spécifiée
•La méthode POST - Il soumet les données traitées à une ressource spécifiée

La méthode GET La méthode POST


Exemple de Request (demande) Exemple de Request (demande)
La chaîne de requête (paires nom / valeur) La chaîne de requête (paires nom / valeur) est
est envoyée dans l'URL d'une requête envoyée dans le corps du message HTTP
GET: pour une requête POST:
GET /RegisterDao.jsp?name1=value1&nam • POST/RegisterDao.jsp HTTP/1.1
e2=value2 • Host: www. javatpoint.com
• name1=value1&name2=value2

11
Le conteneur servlet utilise Java pour générer dynamiquement les pages Web du côté serveur. C’est la
partie d'un serveur Web qui interagit avec la servlet pour gérer les pages Web dynamiques à partir de
la demande du client.

Le conteneur de servlet effectue plusieurs opérations qui sont données ci-dessous:


• Il permet la gestion du cycle de vie
• Il support e le multithread
• Il effectue le pooling d'objets
• Sécurité, etc.
Serveur: Web vs. Application
Serveur est un programme informatique qui accepte et répond à la demande faite par un autre
programme, appelé client. Il est utilisé pour gérer les ressources réseau et pour exécuter le
programme ou le logiciel qui fournit des services.
Il existe deux types de serveurs:
• Serveur Web
• Serveur d'application
Serveur Web
• Le serveur Web contient uniquement un conteneur Web ou servlet. Il peut être utilisé pour servlet,
jsp, struts, jsf etc. Il ne peut pas être utilisé pour EJB.
• Exemples de serveurs Web: Apache Tomcat et Resin .

12
Serveur: Web vs. Application
Serveur d'application
Le serveur d'applications contient des conteneurs Web et le conteneur d’EJB. Il peut être utilisé
pour servlet, jsp, struts, jsf, ejb etc. Il permet d’exécuter la composante métier des applications J2EE.
Il fournit les services associé à la sécurité , la persistance et l'accès aux données.
Il s'agit d'un type de serveur conçu pour installer, exploiter et héberger des services et des applications
associés.
Exemple des serveurs d'applications :
• JBoss: serveur Open Source de la communauté JBoss.
• Glassfish: fourni par Sun Microsystem. Maintenant acquis par Oracle.
• Weblogic: Fourni par Oracle. Il est plus sécurisé.
• Websphere: fourni par IBM.
API Servlet
• Les paquetages javax.servlet et javax.servlet.http représentent des interfaces et des classes pour
l‘API servlet.
• Le paquet javax.servlet contient de nombreuses interfaces et classes qui sont utilisées par le
servlet ou le conteneur Web sans spécification de protocole.
• Le paquetage javax.servlet.http contient des interfaces utilisant des requêtes HTTP.

13
• Un programme utilisant les servlet commence par importer.
• javax.servlet.*;
• javax.servlet.http.*;

• I: interface
• C: Classe
• javax.servlet.Servlet est l'interface prédéfini de base pour les servelet.
Cette interface contient des méthodes du cycle de vie [init (), services (),
destroy ()}.
• javax.servlet.GenericServlet : classe abstraite prédéfini qui implémente
l'interface javax.servlet.Servlet, cette classe de GenericServlet est utilisé
pour développer des applications indépendantes protocole
• Javax.servlet.http.HttpServlet est sous-classe de GenericServlet utilisé
pour le développement dépend de l'application du protocole [protocole
HTTP]

14
• Une servlet est un objet Java qui répond aux
requêtes HTTP.
• Il s'exécute à l'intérieur d'un conteneur de servlet.
• Un conteneur de servlet peut exécuter multiples
applications Web en même temps, chacune possède
plusieurs servlets

Servlets inside a Java Servlet Container

15
descripteur de déploiement, web.xml d'une Servlet

• Le fichier web.xml contient des détails sur les ressources web statiques et
dynamiques.
• Le but de web.xml est de cacher [ou] d'assurer la sécurité de l'application
Web en ne montrant pas [dans l'URL] le type de technologie utilisé pour le
développement d'application web.
<web-app>
<servlet>
<servlet-name> Give Some Dummy Name </servlet-name>
<servlet-class>/Fully qualified name of our servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> Give Some Dummy Name </servlet-name>
<url-pattern>/UserFriendlyName</url-pattern>
</servlet-mapping>
</web-app>

Nous devons appeler notre servlet en tapant uniquement son <url-pattern>.


• Par exemple
http://localhost:8080/OurServletApplicationFolderName/UserFriendlyName

16
Cycle de vie d'un servlet (cycle de vie de servlet)
Le conteneur Web maintient le cycle de vie d'une instance de
servlet. le cycle de vie de la servlet suit les étapes suivantes :
• 1- Chargez classe Servlet.
2- Créer une instance de servlet.
3- Appel de la méthode init () de la servlet.
4- Appel de méthode service () de la servlet.
5- Appel de la méthode destroy () de la servlet.
• Étape 1, 2 et 3 sont exécutées qu'une seule fois lors du
chargement initial de la servlet. Par défaut, le servlet n'est
pas chargé uniquement lors de sa première demande. Vous
pouvez forcer le conteneur à charger le servlet au démarrage
(Voir Configuration servlet web.xml pour plus de détails à ce
sujet).
• Étape 4 est exécutée plusieurs fois - une fois pour chaque
requête HTTP au servlet.
Étape 5 est exécutée lorsque le conteneur de servlet
décharge le servlet.
Chaque étape est décrite plus en détail ci-dessous:

17
1. Chargement de la classe Servlet
Avant qu'un servlet peut être invoquée par le conteneur de servlet, la classe de
cette dernière doit d'abord être chargé.
2. Créer une instance de servlet
Lorsque la classe servlet est chargée, le conteneur de servlet crée une instance
de la servlet;
Une instance unique de la servlet est créée;
Les demandes simultanées à la servlet sont exécutées sur la même instance de
servlet en utilisant les threads
1. Appel de la méthode init () da la Servlet
Quand une instance de servlet est créée, sa méthode init () est invoquée. La
méthode init() permet à un servlet à s'initialiser avant que la première demande
ne soit traitée (initiation peut être effectuée dans web.xml)
2. Appel de la méthode service () de la servlet
Pour chaque demande reçue par la servlet, la méthode service () est invoquée.
Pour la sous-classe HttpServlet, généralement les méthodes doGet (), doPost ()
sont invoquées.
Tant que le servlet est active dans le conteneur de servlet, la méthode service
() peut être appelé. Ainsi, cette étape du cycle de vie peut être exécutée
plusieurs fois;
3. Appel de la méthode destroy () de la Servlet
Quand une servlet est déchargée par le conteneur de la servlet, sa méthode
destroy () est invoquée. Cette étape est exécutée une seule fois lors de
déchargement de la servlet.
Un servlet est déchargée par le conteneur si le conteneur s'arrête, ou si le
conteneur recharge l'application Web entière pour l'exécuter.
18
• Exemple
public class SimpleHttpServlet extends HttpServlet {
protected void doGet( HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException
{ response.getWriter().write(“
<html>
<body>GET response</body>
</html>
");
}
}

19
Si vous souhaitez gérer à la fois la demande de GET et POST d'un même
servlet donné, vous pouvez surcharger les deux méthodes et l'un
appel l'autre exemple :
public class SimpleHttpServlet extends HttpServlet {
protected void doGet( HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
doPost(request, response);
} // l'appel de doPost dans doGet
protected void doPost( HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException { response.getWriter().write("GET/POST
response");}}

20
Objets HttpRequest

Le but de l'objet HttpRequest est de représenter la


requête HTTP d'un navigateur envoié à votre
application web.
Tout ce que le navigateur peut envoyer, est accessible via
le HttpRequest.
Exemple de méthodes de l’objet HttpRequest :
1. Parameters
2. Headers
3. InputStream
4. Session
5. ServletContext

21
1- Les paramètres

Les paramètres de la requête sont des paramètres qui sont envoyés à partir du navigateur
lors de la demande. Paramètres de la requête sont généralement envoyés dans l'URL (dans la
«chaîne de requête»), ou en tant que partie du corps d'une requête HTTP. Par exemple:
• http://toto.com/somePage.html?param1=hello¶m2=world
• Notez le "query string" dans l'URL: ? Param1 =hello¶ m2 = world Cette partie contient deux
paramètres avec les valeurs des paramètres:
• param1=hello param2=world

• On peut accéder à ces paramètres à partir de l'objet HttpRequest de la manière suivante :
• protected void doGet( HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String param1 = request.getParameter("param1");
String param2 = request.getParameter("param2"); }

En général,
si le navigateur envoie une requête HTTP GET, les paramètres sont inclus dans la chaîne de
requête dans l'URL.
Si le navigateur envoie une demande HTTP POST, les paramètres sont inclus dans la partie du
corps de la requête HTTP.
22
2- Headers (En têtes)

• Les têtes de requête sont le nom, les paires de valeurs envoyées par le
navigateur avec la requête HTTP.
• Les têtes de requête contiennent des informations, par exemple, sur le
navigateur utilisé, les types de fichiers que le navigateur est capable de
recevoir etc. En bref, ce sont des méta-données concernant la requête
HTTP.
On peut accéder aux têtes de la requête de l'objet HttpRequest de la
manière suivante :
• String contentLength = request.getHeader("Content-Length");
• Dans cet exemple lit l'en-tête "Content-Length" envoyé par le navigateur.
• L'en-tête Content-Length contient le nombre d'octets envoyés dans la
requête HTTP, dans le cas où le navigateur envoie une requête HTTP POST.
• Si le navigateur envoie une requête HTTP GET, l'en-tête Content-Length
n'est pas utilisé, et le code ci-dessus renvoie null.
En général, si aucun en-tête portant le nom n'est passé, la méthode
getHeader () renvoie nul.

23
3- InputStream

• Si le navigateur envoie une demande HTTP POST, les paramètres requêtes et de possible d'autre
de données sont envoyés au serveur dans le corps de la requête HTTP.
• Il n y'a pas que les paramètres requêtes qui doivent être envoyées dans le corps de la requête
HTTP.
• Il pourrait être aussi bien les données, comme un fichier ou une requête SOAP (demande de
service Web). Accès aux données ( brutes) du corps de la requête HTTP POST via InputStream :
InputStream requestBodyInput = request.getInputStream();
REMARQUE: Vous devez appeler cette méthode avant d'appeler toute méthode getParameter (),
parce que l'appel de la méthode getParameter () sur une requête HTTP POST provoque le
lancment du moteur de servlet pour analyser le corps de la requête HTTP pour extraire les
paramètres. Une fois analysées, vous ne pouvez plus accéder au corps comme un flux (stream)
d'octets bruts.
4- Session
• Il est possible aussi d'obtenir l'objet de session à partir de l'objet HttpRequest. L'objet de session
peut enregistrer (dans mémoire partagé) des informations demandes requêtes d’un utilisateur
donné.
• si vous enregistrez un objet dans l'objet session au cours d'une demande, il sera disponible pour
vous de le lire au cours de toutes les demandes ultérieures dans le cadre du temps de la même
session.
L’accès à l'objet de session à partir de l'objet HttpRequest:
HttpSession session = request.getSession();
24
5- ServletContext
• Vous pouvez aussi accéder à l'objet ServletContext à partir de l'objet HttpRequest .
• Le ServletContext contient des méta-informations liées à l'application Web.
• Par exemple,
– vous pouvez accéder aux paramètres de contexte définies dans le fichier web.xml;
– vous pouvez transmettre la demande aux autres servlets;
– et vous pouvez aussi stocker un ensemble de paramètres d'application dans le
ServletContext.
ServletContext context = request.getSession().getServletContext();

Les méthodes les plus utilisés de l’objet ServletContext


• public String getInitParameter(String name):Returns the parameter value for the specified parameter
name.
• public Enumeration getInitParameterNames():Returns the names of the context's initialization
parameters.
• public void setAttribute(String name,Object object):sets the given object in the application scope.
• public Object getAttribute(String name):Returns the attribute for the specified name.
• public Enumeration getInitParameterNames():Returns the names of the context's initialization
parameters as an Enumeration of String objects.
• public void removeAttribute(String name):Removes the attribute with the given name from the servlet
context.

25
DemoServlet.java <web-app>
import java.io.*;
import javax.servlet.*; <servlet>
import javax.servlet.http.*; <servlet-name>sonoojaiswal</servlet-name>
<servlet-class>DemoServlet</servlet-class>
</servlet>
public class DemoServlet extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletR <context-param>
esponse res) <param-name>dname</param-name>
throws ServletException,IOException <param-value>
{ sun.jdbc.odbc.JdbcOdbcDriver
res.setContentType("text/html"); </param-value>
PrintWriter pw=res.getWriter(); </context-param>
//creating ServletContext object <servlet-mapping>
ServletContext context=getServletContext(); <servlet-name>sonoojaiswal</servlet-name>
<url-pattern>/context</url-pattern>
//Getting the value of the initialization parameter and </servlet-mapping>
printing it
String driverName=context.getInitParameter("dname")
; </web-app>
pw.println("driver name is="+driverName);
pw.close();

}}

26
import java.io.*; <web-app>
import javax.servlet.*;
<servlet>
import javax.servlet.http.*; <servlet-name>sonoojaiswal</servlet-name>
<servlet-class>DemoServlet</servlet-class>
</servlet>

public class DemoServlet extends HttpServlet{ <context-param>


public void doGet(HttpServletRequest req,HttpServletRespons <param-name>dname</param-name>
e res) <param-value>sun.jdbc.odbc.JdbcOdbcDriver</param-
value>
throws ServletException,IOException </context-param>
{
res.setContentType("text/html"); <context-param>
<param-name>username</param-name>
PrintWriter out=res.getWriter();
<param-value>system</param-value>
</context-param>
ServletContext context=getServletContext();
Enumeration<String> e=context.getInitParameterNames(); <context-param>
<param-name>password</param-name>
String str=""; <param-value>oracle</param-value>
while(e.hasMoreElements()){ </context-param>
str=e.nextElement();
<servlet-mapping>
out.print("<br> "+context.getInitParameter(str));
<servlet-name>sonoojaiswal</servlet-name>
} }} <url-pattern>/context</url-pattern>
</servlet-mapping>

</web-app>

27
Objet HttpResponse
Le but de l'objet HttpResponse est de présenter et
envoyer la réponse HTTP de votre application Web au
navigateur en réponse à la requête HTTP du client.
Exemple de méthodes de L'objet HttpResponseles plus
couramment utilisées :

1. Writing HTML
2. Headers
3. Content-Type
4. Writing Text
5. Content-Length
6. Writing Binary Data
7. Redirecting to a Different URL

28
1- Writing HTML
Pour envoyer un fichier HTML au navigateur, vous devez obtenir un objet PrintWriter de l'objet HttpResponse :
PrintWriter out = response.getWriter();
out.write("<html><body>GET/POST response</body></html>");
2- Headers
Tout comme l'objet de la requête, le HttpRequest peut contenir des en-têtes HTTP. En-têtes doivent être déjà
fixés avant l'écriture des données de la réponse. Vous pouvez définir un en-tête de réponse sur l'objet
comme ceci:
response.setHeader("Header-Name", "Header Value");
3- Content-Type
L'en-tête Content-Type est un en-tête de réponse qui indique au navigateur le type de contenu que vous
transmettez.
Par exemple, le type de contenu HTML est "text / html".
De même, si ce que vous envoyez vers le navigateur est du simple texte,
vous utilisez le type de contenu "text / plain".
Définition de l'en-tête Content-Type de l'objet HttpResponse:
response.setHeader("Content-Type", "text/html");
5-Writing Text
Vous pouvez écrire du texte au navigateur au lieu de HTML, comme ceci:
response.setHeader("Content-Type", "text/plain");
PrintWriter writer = response.getWriter();writer.write("This is just plain text");
D'abord l'en-tête Content-Type est défini sur text / plain. Ensuite, une chaîne de texte brut est écrite à writer
obtenue à partir de l'objet de réponse.

29
6- Content-Length
• L'en-tête Content-Length indique au navigateur le nombre d'octets renvoyer par le servlet. Si vous
renvoyez des données binaires, vous devez définir dans l'en-tête la longueur du contenu :
response.setHeader("Content-Length", "31642");
• Vous pouvez également recevoir des données binaires du navigateur au lieu du texte. Par exemple,
vous pouvez envoyer une image, un fichier PDF ou un fichier Flash etc.

• Encore une fois, vous devez d'abord définir l'en-tête Content-Type pour le type correspondant aux
données que vous renvoyez. Par exemple, le type de contenu pour une image PNG est
"image/png".
Vous pouvez rechercher des "types MIME" (Multipurpose Internet Mail )dans votre moteur de
recherche préféré pour trouver une liste de types MIME (types de contenus), afin que vous puissiez
trouver le type MIME pour le contenu que vous renvoyer.
Pour transmetrre des données binaires au navigateure, vous ne pouvez pas utiliser le Writer obtenu
à partir response.getWriter (). Après tout, l'objet writer est destiné pour le texte.
Il faut utiliser l'OutputStream obtenue à partir de la méthode response.getOutputStream ():
OutputStream outputStream = response.getOutputStream();
outputStream.write(...);

30
Redirecting to a Different URL
• Vous pouvez rediriger le navigateur vers une URL différente de votre servlet:
response.sendRedirect("http://www.fsa.ac.ma");

RequestDispatcher
• La classe RequestDispatcher permet à votre servlet d'appeler une servlet à l'intérieur d'une autre
servlet. L'autre servlet sera appelé de la même manière comme si la requête http lui a été envoyée
par un navigateur.
Vous pouvez obtenir un RequestDispatcher à partir de l'objet HttpServletRequest:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/anotherURL.simple"); }

• Le code ci-dessus obtient un RequestDispatcher utilise n'importe quel servlet (ou JSP) mappé par
l'URL "/ anotherUrl.simple".
requestDispatcher.forward(request, response);
requestDispatcher.include(request, response);

• En appelant la méthode include() ou la méthode forward(), le conteneur de servlet active la servlet


mappé par l'URL de RequestDispatcher.
Le servlet activé a accès à la même "request" que le servlet appelant, et va écrire à la même
"response" que votre servlet en cours.

31

Vous aimerez peut-être aussi