Descriptif 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 

Servlet & JSP - Développement Web

3.2.Implémentation de base

3.2.1.Structure fondamentale

Nous avons vu précédemment comment installer et configurer un serveur Web et un moteur de servlets. Nous allons maintenant nous attarder sur le concept même des servlets avec leur conception proprement dite.

3.2.1.1.Interface Servlet

Pour qu’une classe représente une servlet, il faut impérativement qu’elle implémente l’interface Servlet (du package javax.servlet) directement ou indirectement. Cette interface oblige à implémenter les méthodes suivantes :

  • La méthode public void init( ServletConfig cfg )
  • La méthide public void service ( ServletRequest req, ServletResponse res)
  • La méthode public void destroy ()
  • La méthode public ServletConfig getServletConfig ()
  • La méthode public String getServletInfo ()

Nous étudierons ces méthodes en détail ci-dessous.
Remarque : les trois premières méthodes représentent le cycle de vie d’une servlet.
L’utilisation de l’interface Servlet n’est pas très courante. En effet différentes classes abstraites ont été développées afin de simplifier la tâche au développeur.

3.2.1.2.Classe GenericServlet

Cette première classe est la plus basique. Elle appartient elle aussi au package java.servlet. Il vous suffit tout simplement, dans une classe fille, d’implémenter la méthode : public void service ( ServletRequest req, ServletResponse res).

Voici un exemple de servlet implémentant cette classe :

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.GenericServlet;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public final class HelloServlet extends GenericServlet {

public void service (ServletRequest req, ServletResponse res)
throws IOException
{
res.setContentType (“text/html”);
PrintWriter pageWriter = res.getWriter();
pageWriter.println(“<html>”);
pageWriter.println(“<body>”);
pageWriter.println(“Coucou”);
pageWriter.println(“</body>”);
pageWriter.println(“</html>”);
}
}

3.2.1.3.Classe HttpServlet


Cette classe est un peu plus évoluée et davantage orientée développement Web. Elle est cependant inclue dans le package : javax.servlet.http. De même que pour la classe précédente, nous pouvons simplement implémenter la méthode : public void service ( ServletRequest req, ServletResponse res) cependant une alternative s’ouvre à nous. Comme le protocole HTTP permet de transmettre des données de différentes manières (GET ou POST), cette classe possède les méthodes s’y rapportant. Cela permet d’implémenter les méthodes indépendamment des méthodes que l’on souhaite utiliser.

  • La méthode public doGet ( ServletRequest req, ServletResponse res) est appelée lors d’une requête de type GET.

  • La méthode public doPost ( ServletRequest req, ServletResponse res) est appelée lors d’une requête de type POST.

Vous pouvez également trouver d’autres méthodes public doXxx (ServletRequest req, ServletResponse res) avec Xxx = ( Put, Delete, Options …)

Remarque : si vous ne souhaitez pas différencier le type de méthode utilisée pour la requête, vous pouvez soit utiliser la classe GenericServlet, soit n’implémenter que la méthode service() dans votre servlet.

3.2.2.Cycle de vie


Nous avons pu voir que le moteur de servlet n’utilise qu’une seule instance par servlet et que chaque requête cliente a pour résultat un nouveau thread qui est transmis à doGet() ou à doPost() ou bien service() (selon les cas). Nous allons ici examiner comment les servlets sont initialisées, utilisées et détruites. Ces étapes s’appellent le « Cycle de vie » d’une servlet.

3.2.2.1.La méthode init()


La méthode init() est appelée uniquement lors du premier appel à la servlet (soit via un appel client soit lors du démarrage du serveur en fonction de votre configuration serveur). Par conséquent, elle est employée pour effectuer les opérations de paramétrage et d’initialisation de la servlet.
Il existe deux prototypes de la méthode init().
  • Le premier ne prend aucun argument et est utilisé lorsque la servlet n’a pas à lire de paramètre variant d’un serveur à l’autre.
La définition de celle-ci ressemble à ceci :

public void init () throws ServletException {
// Initialisation Code
}

  • La seconde version de init est utilisée lorsque le servlet a besoin d’accéder aux paramètres de configuration du serveur afin de s’adapter au serveur sur laquelle elle est lancée. On peut très bien penser récupérer les paramètres de connexion à une base de données par exemple, un fichier de mots de passes ou bien d’autres choses encore.
Le second prototype ressemble à ceci :

public void init (ServletConfig cfg) throws ServletException {
super.init(cfg);
// Initialisation Code
}

Cette méthode admet un argument de type ServletConfig qui permet de récupérer les valeurs des différents paramètres de configuration grâce à la méthode getInitParameter() qui demande en entrée le nom du paramètre et retourne, en sortie, sa valeur.
La première ligne du corps de la méthode fait appel à super.init(). Cette ligne ne doit pas être oubliée, en effet la méthode init() de la classe parent enregistre l’objet ServletConfig à un endroit précis dans la servlet qui est utilisé par la suite.

Remarque : si vous décidez de surcharger la méthode init(), n’oubliez surtout pas l’appel à super.init() car vous risquez d’avoir des problèmes …

3.2.2.2.La méthode service

Cette méthode est appelée pour chaque requête reçue. Cette méthode vérifie le type de requête et appelle automatiquement soit doGet(), doPost(), doTrace() … Dans une servlet, qui doit traiter les requêtes POST et GET de la même manière, vous pourriez être tenté de surcharger service() mais ce n’est pas la bonne solution ! En effet, cela risquerait de nuire à l’évolution de votre servlet. Il vaut mieux dans ce cas appeler doPost() via doGet() ou inversement.
Grâce à cette méthode, vous pourrez, par la suite, surcharger les méthodes doPut(), doTrace(), doOptions() soit directement dans la servlet soit dans les « servlets filles ».

Voici le prototype de cette méthode :

public void service (ServletRequest req, ServletResponse res)throws IOException

3.2.2.3.La méthode destroy


Le serveur peut demander la suppression de l’instance de la servlet, soit par demande explicite de l’administrateur (redémarrage du serveur par exemple), soit parce que la servlet demeure inactif pendant une trop longue période. Le serveur appelle alors la méthode destroy de la servlet afin que celle-ci effectue toutes les opérations de destruction. Vous pouvez retrouver des opérations de fermeture de connexion à une base de données, d’interruption de threads lancés en tâches de fond, fermer un fichier…
Remarque : un serveur Web peut très bien s’interrompre à cause d’un bug ou autre problème technique (une personne peut très bien débrancher la prise de courant !) c’est pour cela qu’il ne faut pas faire confiance à 100% à l’appel automatique de cette méthode et faire des sauvegardes d’éléments principaux durant l’exécution de la servlet.


Voici le prototype de cette méthode :

public void destroy()

3.2.3.Lire la requête


La lecture des données de la requête se fait via l’instance de l’objet : HttpServletRequest passée en paramètre des méthodes doGet, doPost

Depuis la requête, il est possible de récupérer tous les paramètres passés au ServeurWeb par le client :
Il existe quatre méthodes pour cela :
  • La méthode getParameter ( String name ) : retourne la valeur d’un parameter à partir de son nom

  • La méthode getParameterValues ( String name ) : retourne une liste de valeurs d’un parameter à partir de son nom (utilisé par exemple dans une liste à choix multiples)

  • La méthode getParameterMap ( String name ) : retourne une liste d’associations de paramètres et de valeurs

  • La méthode getParameterNames ( String name ) : retourne la liste de tous les noms des paramètres passés au serveur web

Cet objet permet également de récupérer des informations concernant le client :

  • La méthode getRemoteAddr () : retourne l’IP du client
  • La méthode getRemoteHost () : retourne le nom complet de l’hôte client

De la même façon, nous pouvons récupérer des informations concernant le serveur :

  • La méthode getServerName () : retourne le nom complet du serveur
  • La méthode getServerPort () : retourne le numéro du port utilisé par le serveur

Vous pouvez également accéder à l’ensemble des variables d’environnement du serveur (comme pour les scripts CGI).
Voici un tableau récapitulatif des méthodes à utiliser :

Variable d’environnement CGI
Méthodes d’une servlet HTTP


SERVER_NAME
getServerName()
SERVER_PROTOCOLE
getProtocole()
SERVER_PORT
getServerPort()
REQUEST_METHOD
getMethod()
PATH_INFO
getPathInfo()
PATH_TRANSLATED
getPathTranslated()
SCRIPT_NAME
getServletPath()
DOCUMENT_ROOT
getServletContext().getRealPath(« / »)
QUERY_STRING
getQueryString()
REMOTE_HOST
getRemoteHost()
REMOTE_ADDR
getRemoteAddr()
AUTH_TYPE
getAuthType()
REMOTE_USER
getRemoteUser()
CONTENT_TYPE
getContentType()
CONTENT_LENGTH
getContentLength()
HTTP_ACCEPT
getHeader(« Accept » )
HTTP_USER_AGENT
getHeader(« User-Agent » )
HTTP_REFERER
getHeader(« Referer » )

3.2.4.Écrire la réponse


La réponse à la requête se fait via l’instance de l’objet : HttpServletResponse passée en paramètre des méthodes doGet(), doPost() … (Nous noterons l’instance de cet objet : « res »).

3.2.4.1.Type de contenu


La première chose à faire est d’indiquer à la servlet le type de données qu’elle va renvoyer. En effet vous pouvez très bien retourner du html, une image générée …
La méthode : setContentType() vous permettra d’effectuer cela. Elle prend en paramètre le type de contenu. Voici quelques exemples d’utilisation de cette méthode :

res.setContentType (“text/html”) // page html
res.setContentType (“text/xml”) // page xml
res.setContentType (“image/jpeg”) // image jpeg

Il est possible de renvoyer tout type de contenu en spécifiant exactement le bon type mime.

3.2.4.2.Écriture


L’écriture des données de type texte dans la réponse se fait par l’objet : PrintWriter que l’on peut récupérer par la méthode : getWriter().

PrintWriter out = res.getWriter();
out.println(“<HTML>”);
out.println(“<BODY>”);
out.println(“Bonjour le monde”);
out.println(“</BODY>”);
out.println(“</HTML>”);
out.close();

Si votre réponse renvoie des données binaires, il est préférable d’utiliser l’objet ServletOutputStream dont une instance est retournée par la méthode : getOutputStream()

Voici un exemple pour retourner une image à partir d’une image locale :

res.setContentType (“image/gif”);
ServletOutputStream out = res.getOutputStream();
FileInputStream fis = new FileInputStream (new File (“./logo.gif”));
while (fis.available() > 0)
{
fis.read (buf,0,buf.length);
out.write(buf);
out.flush();
}
fis.close();
out.close();


Descriptif 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 

Retrouvez ci-dessous les autres sections du Laboratoire Sun
Exemples de code
JavaManipuler les looks and feel (lister et affecter)10/15/07
JavaFaire sa propre injection de dépendance avec les annotations5/9/06
JavaSplash screen avec progress Bar5/5/06
JavaFaire un splash screen en swing5/5/06

Essentiels de cours Java
JavaEJB 3 - Les Entreprise Java Bean version 3 (JavaBeans)
Cet essentiel est la suite de « Entreprise JavaBean 2.1 ». Cependant, nous allons étudier les nouvelles spécifications 3.0 qui simplifient énormément le développement par rapport aux EJB 2.6/20/06
JavaSWT - Créer des interfaces graphiques performantes
SWT (Standard Widget Toolkit) est une librairie graphique qui vous permet de réaliser des applications graphiques Java beaucoup plus avancées et surtout plus rapide à l’exécution.1/29/06
JavaStruts - Un framework MVC pour vos applications J2EE
Struts est un framework open-source qui vous permet de gagner du temps, mais qui permet aussi de voir des applications complexes comme une suite de composants de base : Vues, Actions, Modèles. Vous gagnez ainsi en évolutivité et en lisibilité du code.1/13/06
JavaHibernate - Persistance objet - relationnel
Cet essentiel explique comment utiliser Hibernate afin de gérer la persistance objet relationnel au sein de vos applications Java.12/14/05
JavaIntroduction J2EE - Applications d'entreprise
Cours d'introduction aux diverses technologies et outils que l'on peut rencontrer dans le monde du Java orienté entreprise J2EE12/14/05
JavaEJB 2 - Les Entreprise Java Bean (JavaBeans)
L'objectif avec EJB2 (Entreprise JavaBeans) est d'introduire les concepts de l’Ingénierie Logicielle Basée sur les Composants.12/14/05
JavaDesign Patern - Améliorez l'architecture de vos programmes
Afin de répondre a des situation récurrentes en programmation, les "design partern" apportent une solution type à beaucoup de contraintes liées à la programmation objet.12/14/05
JavaArchitecture J2EE - Comment organiser son application J2EE
Ce cours explique comment créer un code modulable, lisible et évolutif afin d'assurer la pérénité de son application.12/14/05
JavaLes web-services - Publication de services
Le développement tend vers les technologies du Web. Il est difficile de faire la distinction entre les différents logiciels qui sont de plus en plus intégrés au Web. Les Web Services rentrent dans l’optique de différencier bien précisément les couches.12/14/05
JavaAnt - L'automatisation des tâches du programmeur
Ecrire des scripts afin d'exécuter les tâches récurrentes10/31/05
JavaIntroduction au langage Java - Présentation & historique
Présentation des origines du langage, ainsi que se buts premiers8/11/05
JavaLa Syntaxe Java - Bases & nomenclatures
Bases de la syntaxe du langage Java8/11/05
JavaLes Classes - Concepts & héritage
Base du développement objet en Java grâce aux classes8/11/05
JavaLes Exceptions - Gestion d'erreurs
Gérer les erreurs liés à la programmation8/11/05

Articles
Eclipse Europa : le successeur de Callisto
Après Eclipse Callisto (Eclipse 3.2), la fondation Eclipse sort la nouvelle mouture d'Eclipse appelée Europa (Eclipse 3.3) faisant ainsi passer le nombre de projets embarqués de 10 à 21. Que ceux qui sont réticents aux « distributions » d'Eclipse se rassu12/21/07
JavaCruiseControl : l’outil d’intégration continue à avoir dans sa boite à outils
CruiseControl est un projet open-source offrant de multiples fonctionnalités pour l’intégration, que ce soit pour des développements Java ou .Net. Il est courant sur un projet d’être plusieurs développeurs avec des tâches de développement réparties. Dans7/2/07
JavaEJB3 - Des concepts à l'écriture du code - Editions DUNOD
Consulter le résumé du premier ouvrage du laboratoire Sun de SUPINFO : EJB3 - Des concepts à l'écriture du code. Guide du développeur, éditions DUNOD.5/27/07
JavaPassage de certification Java Web (SCWCD)
Passer une certification est toujours un moment important car cela permet de mieux faire reconnaître ses compétences face à un recruteur ou un employeur.5/12/07
JavaGoogle Web Toolkit
Google Web Toolkit est un framework java pour générer du javascript et des requêtes Ajax à partir d’un code java. Voilà comment il fonctionne.5/10/07
JavaJ2ME Vs SDE
Demain, les terminaux « légers » seront plus nombreux que les ordinateurs personnels, ce qui entraîne une bataille sur le choix d’une plateforme identique à tous ces terminaux… Aujourd’hui nous retrouvons le J2ME ainsi que le SDE qui s’offrent une rude b4/22/07

Tips du laboratoire
EclipseVisual Editor avec Eclipse Europa, c'est possible3/28/08
EclipseGérer les projets dans un workspace.10/16/07
JavaManager votre server d'application avec Eclipse4/21/07
JavaVue des sub-packages avec Eclipse4/21/07
JavaGlisser-déposer avec Eclipse4/21/07

Laboratoire SUPINFO des technologies Sun
labo-sun@supinfo.com


Conditions d'utilisation et © Copyright 2000-2006 SUPINFO Paris, Paris Academy of Computer Science
23, rue de Château Landon - 75010 PARIS - Tél : +33 (0) 153359700 Fax : +33 (0) 153359701
Respect de la vie privée