2. Une première servlet

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.

2.1. Le code

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 17. 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) ;
	}
}	

2.2. Création de l'application web

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.
Structure d'une première archive WAR

Figure 5. Structure d'une première archive WAR


Voici enfin le contenu du fichier web.xml.

Exemple 18. 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.

2.3. Déploiement dans Tomcat

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 /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.
Java servlet et JSP
Retour au blog Java le soir
Cours & Tutoriaux
Table des matières
Introduction
1. Position de l'API Servlet
2. Présentation
Présentation de Tomcat
1. Un peu d'histoire
2. Organisation des répertoires de Tomcat
2.1. Répertoire bin
2.2. Répertoire conf
2.3. Répertoire lib
2.4. Répertoire log
2.5. Répertoire temp
2.6. Répertoire webapp
2.7. Répertoire work
3. Lancement de Tomcat
3.1. Lancement par défaut
3.2. Accéder à l'administration de Tomcat
3.3. Plusieurs instances de Tomcat
4. Configuration de Tomcat
4.1. Introduction
4.2. Élément Server
4.3. Élément Service
4.4. Élément Connector
4.5. Élément Engine
4.6. Élément Host
4.7. Élément Context
4.8. Élément GlobalNamingResources
4.9. Élément Realm
4.10. Élément Valve
5. Définition et chargement des applications web
5.1. Introduction
5.2. Prise en compte des éléments Context
5.3. Chargement et mise à jour à chaud
6. Utilisation de Tomcat avec Apache
API Servlet
1. Introduction
2. Une première servlet
2.1. Le code
2.2. Création de l'application web
2.3. Déploiement dans Tomcat
3. Concepts, cycle de vie
3.1. Requête
3.2. Réponse
3.3. Session
3.4. Application web
3.5. Contexte d'exécution
3.6. Cycle de vie
3.7. Filtre
4. Présentation générale de l'API
4.1. Introduction
4.2. Interfaces disponibles
5. Notion de servlet
5.1. Interfaces servlet
5.2. Cycle de vie d'une servlet
5.3. Paramètres d'initialisation d'une servlet
6. Notion de requête
6.1. Accès aux paramètres d'une requête
6.2. Accès aux éléments de l'en-tête HTTP
6.3. Accès aux éléments de l'URL
6.4. Accès aux paramètres du client
6.5. Accès aux informations de sécurité
6.6. Accès à la session, au contexte et aux informations d'initialisation
7. Notion de réponse
7.1. Contrôle du buffer de sortie
7.2. Contrôle de la réponse HTTP
8. Notion de session HTTP
9. Redirection ou inclusion d'une ressource
10. Listeners
10.1. Introduction
10.2. Événements de l'API Servlet
10.3. Ajout ou retrait d'un attribut
10.4. Création et destruction d'un contexte
10.5. Notification d'un objet attaché à un contexte
10.6. Déclaration d'un listener dans une application web
11. Connexion à une base
11.1. Introduction
11.2. Connexion manuelle
11.3. Connexion par utilisation de source de données
Filtrage
1. Filtrage de servlets
2. Mise en place d'un filtre
2.1. Écriture d'un filtre
2.2. Déclaration du filtrage
3. Filtrage d'une requête
4. Filtrage d'une réponse
4.1. Fonctionnement de ce filtrage
Java Server Pages
1. Introduction
2. Un premier exemple
2.1. Une première JSP statique
2.2. Une première JSP dynamique
2.3. Fonctionnement interne des JSP
3. JSP scriplet
3.1. Les expressions
3.2. Les déclarations
3.3. Variables prédéfinies
3.4. Scriplet de directives
4. Utilisation de beans
4.1. Introduction
4.2. Déclaration d'un bean existant
4.3. Création d'un nouveau bean
4.4. Utilisation des propriétés d'un bean
5. Inclure un contenu externe dans une JSP
5.1. Introduction
5.2. Inclusion au lancement de l'application
5.3. Inclusion au traitement de la requête
6. Utilisation de bibliothèques de tags
6.1. Introduction
6.2. Bibliothèque core
7. Internationalisation
7.1. Notion de bundle
7.2. Internationalisation de pages JSP
Projet exemple
1. Présentation du projet