Vous êtes sur la page 1sur 10

Servlets

•Une servlet est un composant Java qui permet de


développer des applications Web côté serveur. Elle est
Chapitre 3 exécutée sur un serveur d'application (comme Apache
Tomcat ou Jetty) et gère les requêtes HTTP envoyées
Les servlets
par les clients (comme les navigateurs web).

Emna KALLEL •Une servlet s'exécute dynamiquement sur le serveur


web et permet l'extension des fonctions de ce dernier.
Typiquement : accès à des bases de données, transactions
emna.kallel@enetcom.usf.tn d'e-commerce, etc. Une servlet peut être chargée
automatiquement lors du démarrage du serveur web ou lors
de la première requête du client. Une fois chargées, les
servlets restent actives dans l'attente d'autres requêtes du
2
client.

Servlet et cycle de vie Conteneur et paire d’objets requête/réponse

Serveur d’applications
• Une servlet est un objet qui peut être manipulé
par le conteneur via l’interface suivante: Client Conteneur de servlets
Requête HTTP
«interface» Servlet
Servlet
void destroy() Réponse HTTP Serveur
constructor destroy() HttpServletRequest HttpServletResponse
ServletConfig getServletConfig() HTTP
init()
String getServletInfo()
void init(ServletConfig)
void service(ServletRequest, Ready
ServletResponse)

service()

• Lorsque le conteneur reçoit une requête,


il la transmet au servlet qui correspond à l’URL
3
pour que la requête soit traitée effectivement
4
La méthode service() Comment fonctionne une servlet?
1. Une requête HTTP est envoyée par un client à un serveur web.
• Lors de la réception d’une requête, 2. Le serveur web redirige la requête vers le serveur d'application
le conteneur crée: en fonction de l'URL spécifiée dans la requête.
– un objet ServletRequest (la requête), et 3. Le serveur d'application localise la servlet associée à l'URL et la
– un objet ServletResponse (la réponse) charge en mémoire si ce n'est pas déjà fait.
4. La servlet est exécutée par le serveur d'application et traite la
•Le conteneur appelle ensuite la méthode requête.
service() avec ces deux objets en 5. La servlet peut interagir avec les bases de données et les autres
paramètres pour permettre au servlet de ressources du serveur pour générer une réponse à la requête.
répondre à la requête du client. 6. La servlet envoie la réponse HTTP au serveur web.
7. Le serveur web envoie la réponse au client qui a effectué la
5 requête initiale.

GenericServlet

Servlets HTTP void destroy()


String getInitParameter(String)
Enumeration getInitParameterNames()
Créer une première servlet avec
«interface»
ServletConfig getServletConfig()
ServletContext getServletContext()
String getServletInfo()
Eclipse (1)
Servlet
String getServletName()
void destroy() void init()
ServletConfig getServletConfig() void init(ServletConfig) 1.Téléchargez et installez Apache Tomcat :
String getServletInfo() void log(String)
void init(ServletConfig) void log(String, Throwable) •Allez sur le site web de Apache Tomcat (http://tomcat.apache.org)
void service(ServletRequest, void service(ServletRequest, ServletResponse)
ServletResponse) et téléchargez la dernière version stable.
•Décompressez le fichier ZIP téléchargé dans un répertoire de votre
choix.
HttpServlet
2.Ajoutez Tomcat à Eclipse :
MyServlet # void doDelete(HttpServletRequest, HttpServletResponse)
# void doGet(HttpServletRequest, HttpServletResponse) •Dans Eclipse, cliquez sur "Window" > "Servers".
void doGet (HttpServletRequest, # void doHead(HttpServletRequest, HttpServletResponse)
HttpServletResponse) # void doOptions(HttpServletRequest, HttpServletResponse)
•Cliquez sur le bouton "New" pour créer un nouveau serveur.
void doPost(HttpServletRequest,
HttpServletResponse)
# void doPost(HttpServletRequest, HttpServletResponse) •Sélectionnez "Apache" > "Apache Tomcat" et cliquez sur "Next".
# void doPut(HttpServletRequest, HttpServletResponse)
void doWhatYouWant() # void doTrace(HttpServletRequest, HttpServletResponse) •Sélectionnez le répertoire d'installation de Tomcat que vous avez
# long getLastModified(HttpServletRequest)
# void service(HttpServletRequest, HttpServletResponse) décompressé à l'étape 1 et cliquez sur "Finish".
void service(ServletRequest, ServletResponse) 7
Créer une première servlet avec Créer une première servlet avec
Eclipse (2) Eclipse (3)
1.Créez un nouveau projet Java Web : 3.Créez une nouvelle servlet :
•Dans Eclipse, cliquez sur "File" > "New" > "Dynamic Web •Cliquez sur votre paquet dans l'explorateur de projets.
Project". •Cliquez sur "File" > "New" > "Servlet".
•Entrez un nom pour votre projet et sélectionnez la •Entrez un nom pour votre servlet et sélectionnez le paquet
version de votre serveur d'application cible (par exemple, dans lequel vous souhaitez la placer.
Tomcat 8.5). •Cliquez sur "Finish".
•Cliquez sur "Finish". 4.Implémentez la logique de votre servlet :
2.Ajoutez un nouveau paquet pour votre servlet : •Ouvrez votre servlet dans le code-source.
•Cliquez sur votre projet dans l'explorateur de projets. •Implémentez la méthode "doGet()" ou "doPost()" selon le
•Cliquez sur "File" > "New" > "Package". type de requête HTTP que vous souhaitez prendre en charge.
•Entrez un nom pour votre paquet et cliquez sur "Finish". •Utilisez les objets "request" et "response" pour gérer la
requête et générer la réponse.

Créer une première servlet avec Structure des fichiers d’une application
Web sous Eclipse
Eclipse (4)
5.Déployez votre servlet sur votre serveur d'application :
•Cliquez sur votre projet dans l'explorateur de projets.
•Cliquez sur "Run" > "Run on Server".
•Sélectionnez votre serveur d'application cible et cliquez
sur "Finish".
•Accédez à votre servlet à partir de votre navigateur web
en utilisant l'URL appropriée.

12
Une servlet en 3 étapes (1/3) Une servlet en 3 étapes (2/3)
import java.io.*;
import javax.servlet.*; •Ecrire une servlet et le mettre
import javax.servlet.http.*; dans src (ici Clock.java )
• Servlet existe --> comment l’associer à
public class Clock extends HttpServlet{
public void doGet (HttpServletRequest request, Servlet classique:
redéfinit doGet()
l’application?
HttpServletResponse response)
throwsIOException{ de HttpServlet • Associer la servlet à une URL 
PrintWriter out= response.getWriter();
java.util.Date today=new java.util.Date(); web.xml
String docType= "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "+ • /WEB.INF
"Transitional//EN\">\n";
out.println(docType); • Le contenu est impérativement placé
out.println("<html>");
out.println("<head>\n<title>Clock</title>\n</head>"); entre <web-app> et </web-app>
Code HTML out.println("<body>\n"+
incorporé "<h1>Time on server</h1>\n"+
dans Java "<p>"+ today+ "</p>\n"+
"</body>");
out.println("</html>");
} 10
14
}

une servlet en 3 étapes (2/3) une servlet en 3 étapes (3/3)


• Configurer web.xml dans WEB-INF • Lancer un navigateur et entrer l’URL suivante
http://localhost:8080/enetcom/testclock
<?xml version="1.0" encoding="ISO-8859-1"?> • Le navigateur affiche:
<web-app version="2.4" 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">

<servlet>
<servlet-name>The Clock</servlet-name>
<servlet-class>telecom.Clock</servlet- <servlet-name> permet de lier
</servlet>
class>
classe Java <servlet> et <servlet-mapping>
<servlet-mapping>
<servlet-name>The Clock</servlet-name>
<url-pattern>/testclock</url-pattern>
</servlet-mapping> nom utilisé par le client
</web-app> dans sa requête 11 16
En résumé Les différents contextes
• Le client envoie des req au serveur grâce aux méthodes du protocole
HTTP (GET, POST et HEAD).
• Le conteneur Web place chaque req dans un objet HttpServletRequest • Lorsqu’une requête est prise en charge par une
et chaque réponse qu’il initialise dans objet HttpServletResponse.
servlet, le traitement peut demander l’usage
• Le conteneur transmet chaque couple req/réponse à une servlet : objet
Java assigné à une requête et capable de générer une réponse d’informations se situant dans différents contextes.
 La servlet est le point d’entrée d’une application Web et se déclare
• 1er contexte: l’application en question
dans son fichier de configuration web.xml
• Pour pouvoir traiter une req de type Get , une servlet doit implémenter • 2ème contexte: la session
la méthode doGet()
• 3ème contexte: la requête
• Une servlet n’est pas chargée de l’affichage des données (HTML, CSS,
etc)

17 18

Contexte de la session Requêtes et Réponses HTTP


«interface» «interface»
ServletRequest ServletResponse
• La session est accessible au travers de la méthode Object getAttribute(String) int getBufferSize()
int getContentLength() String getContentType()
ServletInputStream getInputStream() ServletOutputStream getOutputStream()
getSession() de l’objet de type HttpServletRequest int getLocalPort() PrintWriter getWriter()
String getParameter(String) void setContentType(String)
// Other methods not listed here…
passé en paramètres des méthodes doXXX(). Enumeration getParameterNames()
String[] getParameterValues(String)
// Other methods not listed here…

Contexte de la requête
• L’objet de type HttpServletRequest passé en HttpServletRequest
String getContextPath()
HttpServletResponse
paramètre des méthodes doXXX() permet d’accéder Cookie[] getCookies() void addCookie(Cookie cookie)
String getHeader(String) void addHeader(String, String)
aux informations de la requête String getMethod() String encodeRedirectURL(String)
String getQueryString() void sendError(int, String)
HttpSession getSession() void setStatus(int)
// Other methods not listed here… // Other methods not listed here…
8
19
Lecture des informations de l’URL Lecture de l’en-tête de la requête
HttpServletRequest  méthodes d’accès aux différents composants de
Méthode Rôle
l’URL.
Méthode Rôle getcharacterEncoding () L’encodage utilisé pour le corps de la req ou null si la req
getScheme () Protocole utilisé (http/https) ne définit pas d’encodage

getServerName () Nom de l’hôte de la machine (nom domaine, …) getContentLength () et Taille en octet des informations situées dans le corps de la
getContentLenghtLong () req ou -1 si la taille n’est pas connue
getServerPort () Port utilisé par la req HTTP getContentType () Retourne le type de média ou null si le type n’est pas
getContextPath () Nom de l’application (nom du projet) connu
getServletPath () Chemin d’accès à la servlet getLocale () Retourne un objet de type java.util.Locale (Langues à
utiliser au niv du navigateur)
getQueryString () Chaîne de carac correspondant à tous les param
getMethod () Méthode utilisée par la req (GET, POST, …)
passés à la req
getHeader (String name) Retourne la valeur de l’entête passée en paramètre
getRemoteAddr @ IP de l’émetteur de la req HTTP
() getHeaders (String name) Retourne la valeur de l’entête passée en paramètre
sous la forme d’une collection (Accept-Language)
getRemoteHost () Nom de l’hôte de l’émetteur de la req HTTP
getIntHeader (String name) Valeur de l’entête sous la forme d’un entier ou -1 si
getLocalAddr () @ IP de la carte réseau du serveur par la quelle la l’entête n’est pas présent
req HTTP a été reçue
getDateHeader (String name) Pour l lecture des paramètres comme If-Modified-Since
getLocalName () Le nom d’hôte de la carte réseau du serveur par la
getHeaderNames (String name) Collection de l’ensemble des en-têtes présents sur la req.
quelle la req HTTP a été reçue
getLocalPort () Le port sur lequel a été reçue la req HTTP 21 22

Exemple: Affichage des entêtes d’une requête Entêtes d’une requête GET
public class ShowRequestHeaders extends HttpServlet{
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException{
//...
out.println(doctype+
"<html>\n<head><title>"+title+ "</title></head>\n"+
"<body>\n<h1>"+title+ "</h1>\n"+
"<b>Request Method: </b>"+request.getMethod()+ "<br />\n"+
"<b>Request URI: </b>"+ request.getRequestURI()+ "<br />\n"+
"<b>Request Protocol: </b>"+ request.getProtocol()+ "<br />\n"+
"<table>\n"+
"<tr><th>Header Name</th><th>Header Value</th></tr>");
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()){
String headerName = headerNames.nextElement();
out.println("<tr><td>"+headerName+ "</td>");
out.println("<td>"+
request.getHeader(headerName)+
"</td></tr>");
}
out.println("</table>\n</body></html>");
} 17 24
}
Lecture des paramètres Lecture des paramètres dans la servlet

• Elément primordial pour traiter une réponse


• Objet HttpRequestServlet
• Les informations saisies dans un formulaire sont envoyées sous forme
getParameter (String name) : zone de texte
de paramètres au niveau de la req.
getParameterValues (String name): listes
• Req de type GET: URLValide?parametre1=val1&parametre2=val2…
getParameterNames ()
• Req de type POST, les paramètres sont structurés de la même manière

mais dans le corps de la requête.

• Dans un formulaire HTML

• le nom du paramètre  attribut name de la balise HTML

• la valeur  valeur de saisie pour une zone de texte

•  value pour les balises de sélection 2


25 6

Exemple : getParameterValues
Exercice d’application
Développer une application Web basée sur une Servlet pour
vérifier si un utilisateur est éligible au vote ou non.
Prenez un formulaire HTML et obtenez des commentaires de
l’utilisateur.
Sur la base de la vérification de l’âge saisie, il / elle est
éligible pour voter ou non? Affichez le message approprié à
l’utilisateur final. Supposons que 18 ans est l’âge minimum
pour voter.

Get parameter value


Vérification de formulaires
• Données manquantes
– Champ manquant dans le formulaire
• getParameter retourne null
– Champ renvoyé vide
• getParameter retourne une chaine vide (ou une chaine avec des
espacements)
String param= request.getParameter("someName");
if((param == null) || (param.trim().equals(""))){
doSomethingForMissingValues(...);
} else{
doSomethingWithParameter(param);
}

test

34

L’en-tête de la réponse
Entête réponse HTTP HttpServletResponse
• Ex: Ligne de statut Méthode Rôle / Signification
HTTP/1.1 200 OK
Date: Wed,8 Oct 2008 16:19:13 GMT setStatus (int sc) Code de statut de la réponse
Server: Apache-Coyote/1.1 HttpServletResponse.SC_SWITCHING_PROTOCOLS 101: communication va changer de
Content-Type: text/html Entête protocole communiquer avec
Content-Lenght: 1234 WebSocket (protocole réseau +
Connection: close interface de programmtion)
<html> HttpServletResponse.SC_OK 200
... Corps HttpServletResponse.SC_MOVED_PERMANTLY 301. Ressource demandée a changé
</html> d’URL
HttpServletResponse.SC_FORBIDDEN 403. Serveur a refusé de traiter la req
• Quelques codes réponses HttpServletResponse.SC_INTERNAL_SERVER_ERROR 500. Erreur de traitement côté
– 200 OK serveur
– 301 MOVED setHeader (String name, String value) Appliquer une valeur à un en-tête
– 403 FORBIDDEN donné
– 404 NOT FOUND
setDateHeader (String name, long date) L’écriture des en-têtes de type Date
– 503 SERVICE UNAVAILABLE 31
setIntHeader (String name, int value) L’écriture des en-têtes de type int 36
Status Codes Exemple sendError
public class LogServlet extends HttpServlet{
• response.setStatus(int statusCode) public void doGet (HttpServletRequest request,
– Utiliser les constantes, pas d’entiers directement HttpServletResponse response) throws IOException{
String login=request.getParameter("param1");
– Noms dérivés du message standard String password=request.getParameter("param2");

• Ex: SC_OK, SC_NOT_FOUND, etc… if ((param1 == null) || (param1.trim().equals(""))){


response.sendError(HttpServletResponse.SC_NOT_FOUND,
• response.sendError(int code, String msg) "Empty login");
return;
– Englobe le message dans un petit document HTML }
• response.sendRedirect(String url) if (checkUserAndPassword(login, password)){
– Le code de status est alors 302 grantAccessTo(login);
} else{
– L’attribut «Location» est également généré dans response.sendError(HttpServletResponse.SC_UNAUTHORIZED,
"Access Denied to"+ login);
l’entête de la réponse }
}
32 } 33

Exemple sendRedirect
public class WrongDestination extends HttpServlet{
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException{
String userAgent= request.getHeader("User-Agent");
if ((userAgent != null) &&
(userAgent.contains("MSIE")){
response.sendRedirect("http://home.netscape.com");
} else{
response.sendRedirect("http://www.microsoft.com");
}
}
}

39

Vous aimerez peut-être aussi