Vous êtes sur la page 1sur 37

Introduction aux servlets

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

REMOTE_ADDR: 212.217.122.32 Documents acceptés

HTTP_ACCEPT_LANGUAGE : fr
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


REMOTE_ADDR: 212.217.122.32
HTTP_ACCEPT_LANGUAGE : fr
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.
Architecture du Servlet
package servlet.jar
 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()
(javax.servlet.GenericServlet) 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 HttpServletRequest 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 HttpServletResponse 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
)
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 java.io.OutputStream

void sendredirect(String Permet de rediriger le client vers l'URL


location) location
Première Servlet
package web;

import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class FirstServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws
ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD><TITLE> Titre </TITLE></HEAD>");
out.println("<BODY>");
out.println("Ma première servlet");
out.println("</BODY>");
out.println("</HTML>");
out.close();
}
}
Structure d’un projet Web J2EE
• Le dossier src contient les classes
java
• Le byte code est placé dans le
dossier build/classes
• Les dossier WebContent contient les
documents Web comme les pages
HTML, JSP, Images, Java Script, CSS …
• Le dossier WEB-INF contient les
descripteurs de déploiement comme
web.xml
• Le dossier lib permet de stocker les
bibliothèques de classes java
(Fichiers.jar)
Déploiement d’une servlet

• Pour que le serveur Tomcat reconnaisse une servlet, celle-ci doit


être déclarée dans le fichier web.xml qui se trouve dans le dossier
WEB-INF.
• Le fichier web.xml s’appelle le descripteur de déploiement de
Servlet.
• Ce descripteur doit déclarer principalement les éléments suivant :
– Le nom attribué à cette servlet
– La classe de la servlet
– Le nom URL à utiliser pour faire appel à cette servlet via le protocole
HTTP.
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" 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">
<display-name>TP_Servlet1</display-name>
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>web.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/fs</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>fs</welcome-file>
</welcome-file-list>
</web-app>
Tester la servlet

Code source coté client


Gestion des servlets

Moteur de
Servlets
Créer un pool Thread
de threads Thread
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 javax.servlet.Servlet 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
javax.servlet.GenericServlet ou javax.servlet.HttpServlet) 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()
Les expressions
• Les expressions JSP sont, des expressions Java qui
vont être évaluées à l'intérieur d'un appel de
méthode print.
• Une expression commence par les caractères <%= et
se termine par les caractères %>.
• Comme l'expression est placée dans un appel de
méthode, il est interdit de terminer l'expression via
un point-virgule.
Syntaxe: <%=expression%>
Equivalent à: out.println(expression) ;
Exemple : <%=new Date()%> Equivalent à: out.println(new
Date()) ;
Declaration
• Dans certains cas, un peu complexe, il est
nécessaire d'ajouter des méthodes et des
attributs à la servlet qui va être générée (en
dehors de la méthode de service).
<%@ page language="java" %>
<HTML>
<%! private int userCounter = 0; %>,
<BODY>
Vous êtes le <%= ++userCounter %><SUP>ième</SUP> client du
site</P>
</BODY><HTML>
Directives
• Une directive permet de spécifier des informations
qui vont servir à configurer et à influer sur le code de
la servlet générée.
• Ce type de construction se repère facilement étant
donné qu'une directive commence par les trois
caractères <%@.
◦ <%@ page ... %>
◦ <%@ include ... %>
◦ <%@ taglib ... %>
Voyons de plus près quelques unes des possibilités qui vous sont
offertes.
<%@ page %>
• La directive page définit des informations relatives à la page
JSP.
• Voici par exemple comment importer des classes Java; En
fait, cette directive accepte de nombreux paramètres dont
les principaux sont:
<%@ page language="java" %>
<%@ page import="package|classe %>
<%@ page session="true|false" %>
<%@ page extends="classe" %>
<%@ page errorPage="url"%>
<%@ page isErrorPage="true|false"%>
<%@ include ... %>
• La directive <%@ include ... %> est très utile si plusieurs
partager une même ensemble d'information.
• C'est souvent le cas avec les entêtes et les pieds de pageces
parties dans des fichiers séparés et injectez les, via les autre
fichiers qui en ont besoin.
• Voici un petit exemple d'utilisation de cette directive:
<%@ page language="java" %>
<HTML>
<BODY>
<%@ include file="header.jsp" %>
<!-- Contenu de la page à générer -->
<%@ include file="footer.jsp" %>
</BODY><HTML>
<% %>
• Les scriptlets correspondent aux blocs de code introduit par
le caractères <% et se terminant par %>.
• Ils servent à ajouter du code dans la méthode de service.
• Le code Java du scriptlet est inséré tel quel dans la servlet
générée: la vérification, par le compilateur, du code aura
lieu au moment de la compilation totale de la servlet
équivalent.
• L'exemple complet de JSP présenté précédemment,
comportait quelques scriptlets :
<%
for(int i=1; i<=6; i++) {
out.println("<H" + i + " align=\"center\">Heading " +i+ "</H" + i + ">");
}
%>
Taglib
• Permet de déclarer l’utilisation d’une
bibliothèque de tags personnalisés
– prefix: l’espace de nome qui sera utilisé dans la
JSP
– uri: contient le même nom définie dans le fichier
de descriptuion
<%@taglib prefix =’’s’’ uri=’’/struts-tags’’ %>
Cette action vous permet de rediriger une
requête vers une autre page au niveau
du serveur.
Syntaxe:
<jsp:forward page="relativeURL"/>
(<% request.getRequestDispatcher(
"/page.jsp" ).forward( request, response ); %>)
ou
<jsp:forward page="relativeURL" >
<jsp:param name="parameterName"
value="parameterValue"/>
</jsp:forward>
 getParameter() de l’objet request
• L’action include vous permet d’insérer un fichier de manière
"dynamique".
<jsp:include page="relative URL" />
<% request.getRequestDispatcher( "page.jsp" ).include( request,
response ); %>

• l’action include insère les fichiers seulement lorsqu’une


requête estplacée sur la page demandée. Ceci en coûte une
légère perte en performance mais gagne en flexibilité.
<jsp:useBean>
Le tag <jsp:useBean> permet de localiser une
instance ou d'instancier un bean pour l'utiliser dans la
JSP.
<% com.beans.Etudiant etudiant=null;
etudiant= (com.beans.Etudiant) request.getAttribute( " etudiant " );
if (etudiant == null ){
etudiant = new com.beans.Etudiant();
request.setAttribu te( " etudiant ", etudiant );} %>

<jsp:useBean id="etudiant"
class="com.midvi.web.beans.Etudiant" scope="request" />

Scope: page , request ,sesion or application


(toutes les pages du même application )
<jsp:getProperty name="etudiant"
property="nom"/>

<jsp:setProperty name=“etudiant"
property="prenom" value=“mohamed"
/>

Vous aimerez peut-être aussi