Sacrifions à la tradition, et écrivons de suite une première servlet. Il s’agira d’une servlet de type HTTP. Elle pourra être appelée d’un navigateur web, et renverra une page sur laquelle sera juste écrit « Bonjour le monde ».
L’installation de cette première servlet peut paraître complexe, tout simplement parce que nous sommes obligé de créer une application web pour la faire fonctionner, et que ce processus est assez lourd.
Une servlet est une classe Java qui doit étendre la classe HttpServlet
. Elle
comporte trois méthodes fondamentales :
une méthode init()
, qui est appelée une fois que Tomcat a instancié cette servlet,
l’a chargée en mémoire.
Cette méthode est appelée avant tout traitement d’une requête
par la servlet. Il existe une méthode équivalente, destroy()
, appelée avant
la destruction de cette servlet. Surcharger cette méthode est facultatif.
une méthode doGet()
et une méthode doPost()
. Ces deux méthodes
sont celles qui « font le travail ». La première est appelée lors d’une requête de
type GET
, et la seconde lors d’une requête de type POST
.
Elles reçoivent en paramètres deux objets qui correspondent au flux de sortie et au
flux d’entrée vers le navigateur client. Les informations envoyées par le navigateur
sont sur le flux d’entrée, tout ce qui est écrit sur le flux de sortie sera reçu par lui.
Les types de ces flux sont HttpServletRequest
et HttpServletResponse
.
Ces méthodes sont en fait appelées par la méthode service()
de la classe
Servlet
, que l’on a pas à surcharger. Notons que sur notre exemple, la méthode
doPost()
appelle la méthode doGet()
, ce qui est parfaitement légal.
Exemple 3.1. Une première servlet
package org.galilee.servlet ; import java.io.* ; import java.text.* ; import java.util.* ; import javax.servlet.* ; import javax.servlet.http.* ; public Bonjour extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html") ; PrintWriter out = response.getWriter() ; out.println("<html>") ; out.println("<head>") ; out.println("<title>Bonjour le monde !</title>") ; out.println("</head>") ; out.println("<body>") ; out.println("<h1>Bonjour le monde !</h1>") ; out.println("</body>") ; out.println("</html>") ; } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response) ; } }
Pour que cette servlet fonctionne dans Tomcat, il nous faut créer un fichier WAR
(web archive). Le format d'un tel fichier est défini dans les spécifications de l'API Servlet.
Un fichier WAR est un fichier JAR standard, dans lequel doit se trouver un répertoire
WEB-INF
. Ce répertoire WEB-INF
doit contenir un fichier de configuration
web.xml
dont nous allons voir un exemple. Il peut enfin contenir :
des fichiers JSP, HTML, ou tout autre fichier statique qui sera servi via les bonnes URL ;
un répertoire lib
, qui contient des fichiers JAR. Les classes de ces fichiers
sont chargées par le class loader propre à cette application web ;
un répertoire classes
contenant une hiérarchie de classes Java. Ces classes
sont chargées par le class loader de cette application web. En cas de collision
avec des classes contenues dans un JAR, c'est la classe déclarée dans ce répertoire qui a la
priorité.
Voici donc la structure de répertoire de notre fichier WAR.
Voici enfin le contenu du fichier web.xml
.
Exemple 3.2. Fichier web.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.5//EN" "http://java.sun.com/dtd/web-app_2_5.dtd"> <web-app> <servlet> <servlet-name>Hello</servlet-name> <servlet-class>org.galilee.servlet.Bonjour</servlet-class> </servlet> <servlet-mapping> <servlet-name>Hello</servlet-name> <url-pattern>/bonjour</url-pattern> </servlet-mapping> </web-app>
Ce fichier est un fichier XML, dont l'élément racine est web-app
. On trouve
deux éléments fils : servlet
et servlet-mapping
.
L’élément servlet
permet de déclarer des servlets, et de les associer à des classes
Java. Dans notre cas, nous créons une servlet appelée Hello
, associée à la classe Java
org.galilee.servlet.Bonjour
, qui doit donc se trouver dans un fichier
Bonjour.class
et dans la bonne structure de répertoire.
L’élément servlet-mapping
permet d’associer une servlet à une URL. Cette déclaration
doit bien sûr être cohérente avec ce qui a été déclaré dans Tomcat (et éventuellement Apache).
Dans notre exemple, notre servlet est associée à l’URL /bonjour
.
Ces deux éléments sont en relation l'un avec l'autre grâce au fait qu'ils ont même valeur pour
le sous-élément servlet-name
. Notons enfin que deux servlets différentes peuvent
se référer à la même classe Java. Nous verrons l’intérêt de ce genre de choses dans la suite.
Il ne reste plus qu’à compiler notre classe Java, à la copier dans le bon répertoire c’est à dire
WEB-INF/classes
, à démarrer Tomcat, et à l’invoquer dans un navigateur par
l’URL http://localhost/bonjour/bonjour
.
Ajouter d'autres servlets à cette application web est ensuite très simple : il suffit
d’ajouter les deux éléments servlet
et servlet-mapping
dans le fichier
web.xml
, et la classe Java dans le bon répertoire.