Technologies internet


Servlets Java


Voir:

L'origine des Servlets

Les technologies utilisées

Le fonctionnement d'une servlet (cas d'utilisation de http)

Un serveur d'application permet de charger et d'exécuter les servlets dans une JVM. C'est une extension du serveur web. Ce serveur d'application contient entre autre un moteur de servlets qui se charge de gérer les servlets qu'il contient.

Pour exécuter une servlet, il suffit de saisir une URL qui désigne la servlet dans un navigateur.

  1. Le serveur reçoit la requête http qui necessite une servlet de la part du navigateur.
  2. Si c'est la premiere sollicitation de la servlet, le serveur l'instancie. Les servlets sont stockées (sous forme de fichier .class) dans un répertoire particulier du serveur. Ce répertoire dépend du serveur d'application utilisé. La servlet reste en mémoire jusqu'à l'arret du serveur. Certains serveurs d'application permettent aussi d'instancier des servlets dès le lancement du serveur.

    La servlet en mémoire, peut être appelée par plusieurs threads lancés par le serveur pour chaque requête. Ce principe de fonctionnement évite d'instancier un objet de type servlet à chaque requête et permet de maintenir un ensemble de ressources actives tel qu'une connection à une base de données.

  3. Le serveur crée un objet qui représente la requête http et un objet qui contiendra la réponse et les envoie à la servlet.
  4. La servlet crée la reponse sous forme de page html transmise via un flux dans l'objet contenant la réponse. La création de cette réponse utilise la requête du client mais aussi un ensemble de ressources incluses sur le serveur tels que des fichiers ou des bases de données.
  5. Le serveur récupère l'objet réponse et envoie la page html au client.

La place des Servlets

Quels sont les acteurs sur le marché ?

Depuis leur création, de plus en plus d'acteurs majeurs de l'industrie de l'informatique ont proposé une offre autour des Servlets:

La mise en place du serveur

Les différents types de solutions

Il existe trois types différents de moteurs de Servlets :

  1. les moteurs de Servlets indépendants
  2. les moteurs de Servlets embarqués
  3. les moteurs de Servlets externes
Les moteurs de Servlets indépendants constituent une partie intégrante du serveur Web. Pour qu'une telle chose soit possible, il faut en principe que le serveur Web soit développé en Java. Un exemple de ce type de serveurs est le Java Web Server, ou Tomcat.

Les moteurs de Servlets embarqués sont une combinaison d'un ajout à un serveur Web et d'une implémentation de l'API Servlet. L'ajout (le plugin) au serveur Web permet d'aiguiller les requêtes venant des clients et qui concernent des Servlets vers une machine virtuelle contenue dans le processus du serveur Web. Cette machine virtuelle est exécutée dans un thread séparé ce qui implique le fonctionnement du serveur Web en multi-threads, ce qui n'est pas le cas de tous les serveurs Web (par exemple Apache sous Unix). Cette configuration apporte de bonnes performances, car les changements de contexte sont moins coûteux, mais est limitée en possibilité d'extensions (un serveur supportant un très grand nombre de requêtes au même moment aura du mal à pouvoir répondre à ces dernières).

Les moteurs de Servlets externes sont une combinaison entre un plugin "greffé" au serveur et une machine virtuelle tournant à l'extérieur de celui-ci. Afin de communiquer entre eux, le plugin et le processus associé à la machine virtuelle utilisent un mécanisme de communication inter-processus tel que les sockets TCP/IP. Si une requête passée au serveur Web concerne les Servlets, celui-ci passe la requête au moteur de Servlets en utilisant le mécanisme sus-cité. Un des inconvénients de cette méthode est la diminution des performances. Par contre, ce type de serveur est en général plus stable (un arrêt du serveur Web n'agit pas sur le moteur de Servlets et vice-versa) et plus extensible. De plus, étant donné que la machine virtuelle est extérieure au serveur Web, elle peut tourner sur n'importe quelle machine, ce qui vous permet de faire tourner le serveur Web sur une machine différente de celle sur laquelle est lancé le moteur de Servlets. Vous pouvez également mettre en place plusieurs machines virtuelles pour un même serveur Web.

Il est clair qu'un moteur de Servlets est beaucoup moins performant que les produits spécialisés lorsqu'il faut fournir un contenu différent des Servlets (pages statiques, fichiers, etc.). On comprend donc facilement qu'il vaut mieux choisir un moteur de Servlets "greffable" sur un serveur Web existant, afin de rester performant en ce qui concerne le contenu statique (c'est le serveur Web qui le gère) et le contenu dynamique faisant appel à des Servlets (c'est le moteur de Servlets qui le gère). Cela nous laisse donc le choix entre la solution 2) et 3).

Si on regarde les problèmes rapportés sur les listes de diffusion ayant trait à la configuration de moteurs de Servlets il apparaît que le type de serveur réunissant le plus d'avantages est le moteur de Servlets externe relié à un serveur Web performant via un plugin.

L'article par Julien Gilli qui contient une analyse plus détaillée propose une solution basée sur le moteur de Servlets Tomcat et le serveur Web Apache.

Ecrire sa première Servlet

Une Servlet n'est qu'un programme Java qui implémente une interface particulière : javax.servlet.Servlet.
En général, une Servlet implémente cette interface en étendant une des deux classes suivantes : La nécessité d'implémenter l'interface javax.servlet.Servlet vient du fait que le moteur de Servlet qui gère les appels à votre Servlet doit pouvoir obtenir un point d'entrée dans votre programme (qui n'est pas la méthode main puisqu'une Servlet est instanciée une seule fois, à son premier lancement) pour chaque requête. Ce point d'entrée est une des méthodes définie dans l'interface javax.servlet.Servlet.

Voici un exemple de code:

import javax.servlet.*;
import javax.servlet.http.*;
public class BonjourMonde extends HttpServlet {
  public void doGet(HttpServletRequest req, HttpServletResponse res)
                            throws ServletException, java.io.IOException {
    res.setContentType("text/html");
    java.io.PrintWriter out = res.getWriter();
    out.println("<HTML>");
    out.println("<BODY>");
    out.println("<B>Bonjour monde!</B>");
    out.println("</BODY>");
    out.println("</HTML>");
  }
}
Dans cet exemple, c'est la méthode doGet() qui sert de point d'entrée. Elle est exécutée quand un client effectue une requête utilisant la méthode HTTP GET et construit une page HTML, qui est retournée au client.

Une fois votre première Servlet compilée, vous devez la publier sur votre serveur. En ce qui concerne Tomcat, vous devez placer le fichier .class obtenu à la suite de la compilation du source à un endroit bien précis. Le choix de cet emplacement dépend du rôle de votre Servlet et de vos fichiers de configuration relatifs à Tomcat et Apache. Lorsque vous ne modifiez aucun de ces fichiers, vous pouvez par exemple copier les fichiers .class de votre Servlet dans

$TOMCAT_HOME/webapps/test/WEB-INF/classes/ où $TOMCAT_HOME correspond au répertoire dans lequel Tomcat est installé.

Dans ce cas précis, vous accéderez à votre Servlet via l'URL http://127.0.0.1/test/servlet/BonjourMonde.

Les différences entre les servlets et les CGI

Les programmes ou script CGI ( Common Gateway Interface) sont aussi utilisés pour générer des pages HTML dynamiques. Ils représentent la plus ancienne solution pour réaliser cette tache.

Un CGI peut être écrit dans de nombreux langages.

Il existe plusieurs avantages à utiliser des servlets plutôt que des CGI :