Médiaforma

All posts tagged servlets

Les servlets sont des classes Java qui gèrent les requêtes http et implémentent l’interface javax.servlet.Servlet. Généralement, les développeurs d’applications Web écrivent des servlets qui étendent la classe abstraite javax.servlet.http.HttpServlet. Cette classe implémente l’interface Servlet et est spécialement conçue pour gérer les requêtes http.

Voici une servlet Hello World. Lorsqu’elle sera invoquée, elle se contentera d’afficher « Hello World » dans le navigateur. Tapez les instructions suivantes dans votre éditeur de code et sauvegardez le fichier sous le nom HelloWorld.java dans votre dossier de travail :

// Importation des bibliothèques Java nécessaires
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// Extension de la classe HttpServlet
public class HelloWorld extends HttpServlet {

  private String message;

  public void init() throws ServletException {
      // Initialisation de la servlet
      message = "Hello World";
      // Ici, vous pourriez par exemple extraire des données
      // depuis une base de données pour créer la réponse http
  }

  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      // Définition du type de la réponse
      response.setContentType("text/html");

      // Actions à effectuer dans la servlet
      PrintWriter out = response.getWriter();
      out.println("<h1>" + message + "</h1>");
  }

  public void destroy() {
      // Dans cette servlet, il n'y a rien à faire ici
  }
}

Examinons ce code.

Les premières lignes importent les bibliothèques Java nécessaires à l’exécution d’une servlet.

Pour qu’une classe Java soit une servlet, elle doit :

1) étendre la classe HttpServlet :

 public class HelloWorld extends HttpServlet

2) surcharger la classe doGet ou la classe doPost (selon si les données sont passées par une requête GET ou POST).
 public void doGet(HttpServletRequest request, HttpServletResponse response)

La méthode init() est exécutée une fois, au démarrage de la servlet. Ici, elle initialise le private String message :

public void init() throws ServletException {
message = "Hello World";

Dans cet exemple, nous surchargeons la méthode doGet().

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

Ici :

  • request permet de lire les en-têtes http (les cookies) et les données entrées par l’utilisateur (ici, aucune donnée n’est transmise par GET).
  • response définit la réponse HTTP, c’est-à-dire :
    • le status http (200,404, etc.),
    • l’en-tête (content-type, cookies, etc.),
    • les données à retourner au client, à travers l’objet PrinterWriter.

 

Remarque

Toutes les servlets ont un squelette identique. Seuls changent :

  • le contenu de la méthode init() ;
  • la ou les classes surchargées : doGet() ou/et doPost() ;
  • les traitement effectués dans les classes doGet() et/ou doPost().

 

Autre remarque :

Vous pourriez retourner un code HTML complet au client en remplaçant l’instruction suivante :

out.println("<h1>" + message + "</h1>");

Par ces instructions :

out.println("<HTML>");
out.println("<HEAD><TITLE>Ma première servlet</TITLE></HEAD>");
out.println("<BODY>");
out.println("Hello World");
out.println("</BODY>");
out.println("</HTML>");
out.close();

 

Compilez la classe HelloWorld.java. Pour cela, ouvrez une Invite de commande dans le dossier où se trouve HelloWorld.java et lancez cette commande :

javac -cp %CLASSPATH%;"c:\Program Files\Apache Software Foundation\Tomcat 8.0\lib\servlet-api.jar" HelloWorld.java

Si tout se passe bien, vous devriez obtenir le fichier HelloWorld.class. Les serlvets se trouvent par défaut dans le dossier c:\Program Files\Apache Software Foundation\Tomcat 8.0\webapps\ROOT\WEB-INF\classes\.

Copiez HelloWorld dans ce dossier.

 

Pour que la servlet soit accessible, vous devez lui associer une URL.

Ouvrez le fichier web.xml dans votre éditeur de code (ce fichier se trouve dans c:\Program Files\Apache Software Foundation\Tomcat 8.0\webapps\ROOT\WEB-INF\) et complétez-le avec les instructions en gras :

 

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">

<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>

  <servlet>
    <servlet-name>HelloWorld</servlet-name>
    <servlet-class>HelloWorld</servlet-class>
  </servlet>
 
  <servlet-mapping>
    <servlet-name>HelloWorld</servlet-name>
    <url-pattern>/HelloWorld</url-pattern>
  </servlet-mapping>

</web-app>

Le bloc <servlet></servlet> définit le nom et la classe de la servlet.

Le bloc <servlet-mapping></servlet-mapping> définit l’URL associée à la servlet. Ici /HelloWorld.

 

Il ne vous reste plus qu’à naviguer vers l’URL http://localhost:8080/HelloWorld pour lancer la servlet et obtenir un Hello World en retour :

 

 


Pour utiliser une classe dans une servlet, vous pouvez insérer une directive <%@page%> en précisant le paramètre import, ou insérer le chemin complet de la méthode Java à utiliser. A titre d’exemple, ces deux servlets sont équivalentes :

Version 1 – En insérant le chemin de la classe dans l’instruction

<html>
  <head>
    <title>Accès à une classe Java</title>
  </head>
  <body>
    Aujourd’hui nous sommes le <%= new java.util.Date().toString() %>.
  </body>
</html>

Version 2 – En important la classe

<%@ page import="java.util.Date" %>
<html>
  <head>
    <title>Accès à une classe Java</title>
  </head>
  <body>
    Aujourd’hui nous sommes le <%= new Date().toString() %>.
  </body>
</html>

 

Ces deux servlets produisent le même effet :

 

 

 

Exercice

Définissez une servlet qui affiche la date du jour en français, comme dans la capture d’écran ci-après :

 

 

Solution

<%@ page import="java.util.Date" %>
<html>
  <head>
    <title>Date en français</title>
  </head>
  <body>
    <% String[] jours = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi" };
    Date laDate = new Date();
    int leJour = laDate.getDay();
    out.println("Aujourd'hui, nous sommes " + jours[leJour]);
    %>
  </body>
</html>

Pour tester localement vos servlets, vous aurez besoin d’un serveur local compatible avec les servlets : Tomcat par exemple. Rendez-vous sur la page http://tomcat.apache.org/download-80.cgi et téléchargez le programme 32-bit/64-bit Windows Service Installer :

 

 

Exécutez ce programme en acceptant toutes les options par défaut.

 

 

Une fois Tomcat installé et lancé, une icône dans la Zone de notification indique que Tomcat est actif :

 

 

Ouvrez votre navigateur Web et allez sur la page http://localhost:8080. Voici ce que vous devriez obtenir :