Technologies internet
Servlets Java
L'origine des Servlets
- Sun Microsystems produit (1996) un kit de développement Web, comprenant le
serveur Web java et un ensemble de classes.
- Cet ensemble de classes correspond à ce que l'on appelle les Servlets et le
serveur Web java, programmé pour une grande partie grâce aux Servlets,
fut un des premiers serveurs Web à faire fonctionner les Servlets.
- Sun Microsystems, avec son département logiciel Java Soft, a écrit la
première version de la norme des Servlets.
La dernière version de cette norme est actuellement 3.0.
- Bien que les Servlets constituent une extension majeure du langage Java,
leur API n'est pas intégrée à la version standard de la plate-forme Java,
mais à l'édition entreprise http://java.sun.com/j2ee/.
Les technologies utilisées
- La technologie des servlets n'est qu'un ensemble de classes. Elles ont
besoin d'une machine virtuelle Java et
de l'ensemble des autres classes intégrées à l'API standard du langage
Java.
- Une servlet est un programme qui s'exécute côté serveur en tant
qu'extension du serveur. Elle reçoit une requête du client, elle effectue
des traitements et renvoie le résultat. La liaison entre la servlet et le
client peut être directe ou passer par un intermédiaire comme par exemple
un serveur http.
- Même si pour le moment la principale utilisation des servlets est la
génération de pages html dynamiques utilisant le protocole http et donc
un serveur web, n'importe quel protocole reposant sur le principe de
requête/réponse peut faire usage d'une servlet.
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.
- Le serveur reçoit la requête http qui necessite une servlet de la part
du navigateur.
- 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.
- 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.
- 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.
- Le serveur récupère l'objet réponse et envoie la page html au client.
La place des Servlets
- Les Servlets permettent le développement
d'applications Web côté serveur, ceci de manière à pouvoir fournir un
contenu dynamique aux visiteurs de sites Web.
- Les possibilités:
L'énorme bibliothèque de classes permet au programmeur de Servlets une
grande latitude quant à la fonction que remplira son application.
D'autres caractéristiques comme les possibilités évoluées de connexion
aux principaux SGBD du marché, la persistance du processus de chaque
Servlet, l'intégration des EJB (pour Enterprise Java Beans) ou encore
la gestion de la sécurité permettent aux Servlets de prendre en charge
des projets tels que des sites de commerce électronique, des plate-formes
bancaires, des sites communautaires ou des outils de configuration de
serveurs.
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:
- Les serveurs d'applications.
Ces solutions sont très fortement liées à tous les domaines d'activité
de l'entreprise. De nombreux composants "métiers" sont utilisés (comme
les EJB qui sont les Enterprise Java Beans), et des critères comme la
fiabilité, le support technique et l'adéquation avec les contraintes
professionnelles de l'entreprise sont primordiaux.
Il est donc compréhensible que d'importants fournisseurs
d'applications aient investi ce secteur. Ces fournisseurs sont
- IBM (avec WebSphere),
- BEA (avec WebLogic),
- Oracle (avec Oracle Application Server)
- iPlanet (avec iPlanet Application Server).
Ces serveurs utilisent des moteurs de Servlets et des serveurs Web parfois
indépendants. Par exemple IBM a développé un serveur Web pour WebSphere
qui se base sur le serveur Web Apache.
- Les moteurs de Servlets
Ce sont des applications qui implémentent toutes
une version de la norme de l'API des Servlets, ils ne se différencient
donc pas selon leurs fonctionnalités mais selon leurs performances. Les
principaux moteurs de Servlets sont
- Tomcat (de la fondation Apache),
- Resin (de Caucho),
- JServ (de la fondation Apache également),
- Allaire avec JRun.
- Ces moteurs de Servlets sont souvent rattachés à des serveurs Web
(car c'est à un serveur Web que sont destinés les requêtes provenant d'un
navigateur dans de nombreux cas). Étant donné qu'un site Web ne se base
pas exclusivement sur les Servlets, les serveurs Web les plus utilisés
pour fournir d'autres services sont en général choisis. Ces serveurs sont
- Apache (de la fondation Apache),
- iPlanet Web Server (de iPlanet) et
- IIS (de Microsoft).
- D'autres entreprises très présentes dans le secteur du développement
traditionnel fournissent des outils aux développeurs désirant obtenir
une forte intégration avec leur serveur supportant les Servlets:
- Borland avec JBuilder,
- Macromedia UltraDev,
- Sybase avec PowerJ,
- Oracle avec JDeveloper,
- IBM avec Visual Age,
- Allaire avec JRun Studio.
- Sun
Ils fournissent un moteur de Servlets intégré à un serveur Web nommé
Java Web Server mais il constitue plus une solution pionnière qui a permis
de disposer d'une première plate-forme que d'une solution destinée à être
utilisée en production.
Ils proposent également un outil de développement appelé Forté
(anciennement Net Beans) qui, dans sa version entreprise, supporte les
Servlets. Cet outil n'est pas véritablement utilisé à cause de sa lourdeur
mais fut quand même le premier outil R&D permettant le développement de
Servlets.
Ils ne proposent donc ces outils que dans un but d'introduction aux
concepts qu'ils proposent, ils ont par ailleurs fort à faire à normaliser
l'API des Servlets tout en développant son implémentation et
ses fonctionnalités.
- Microsoft
Ils fournissent des applications en étroite relation avec
leur système : on choisit le système de Microsoft car on ne peut se
passer de leurs applications et vice-versa. Avec Java, on peut disposer
d'une plate-forme pouvant apporter des solutions globales (comme les
serveurs d'applications) et ceci de manière portable : l'informaticien
et l'utilisateur sont indépendants de l'architecture matérielle et
logicielle. On peut donc très bien choisir d'autres produits que ceux
de Microsoft.
Afin de résister à la déferlante Java, Microsoft a donc
annoncé le développement d'une plate-forme similaire : la plate-forme .NET.
C'est un ensemble d'outils pour le développement, le déploiement et
l'utilisation d'applications distribuées, qui met en valeur l'utilisation
des réseaux (locaux ou Internet). Cette solution reprend de nombreuses
caractéristiques de Java comme le langage C# dont la syntaxe est
étonnament similaire à celle de Java, la présence d'une machine virtuelle
qui interprète un langage intermédiaire, le caractère distribué des
applications (un utilisateur peut utiliser une application distante)
et d'autres encore. On peut donc voir la plate-forme .NET comme un
concurrent à la plate-forme J2EE1.4.
La mise en place du serveur
Les différents types de solutions
Il existe trois types différents de moteurs de Servlets :
- les moteurs de Servlets indépendants
- les moteurs de Servlets embarqués
- 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 :
- portabilité offerte par Java bien que certains langages de script tel que
PERL tournent sur plusieurs plate-formes
- servlet reste en mémoire une fois instanciée ce qui permet de garder des
ressources systèmes et gagner le temps de l'initialisation. Un CGI est
chargé en mémoire à chaque requête, ce qui réduit les performances.
- les servlets possèdent les avantages de toutes les classes écrites en
java : accès aux API, aux java beans, le garbage collector, ...