On suppose que vous avez créé un projet web maven lors de la manip 2. Que vous l’ayez créé via Netbeans ou en ligne de commande, il comprend une hiérarchie de répertoires standardisée (accessible dans Netbeans via l’onglet « Files »). Certains répertoires peuvent ne pas être encore créés. Les répertoires sont :
src contient tout le code source, les fichiers de
  configuration etc. :
  src/main/java contient le code java, organisé
    dans une hiérarchie de répertoires correspondant aux paquetages,
    comme habituellement en java ;src/main/webapp contient :
    WEB-INF où placer des fichiers HTML et
      JSP qui ne seront pas accessibles directement par
      une URL ;META-INF contenant le fichier de
      configuration principal context.xml.target contient tous les fichiers générés lors de
  la compilation (et peut être supprimé pour tout nettoyer si
  nécessaire).On souhaite maintenant créer un servlet répondant à une
  certaine URL. Notre application, une fois déployée sur le serveur,
  possédera une URL racine, appelée context path, définie dans le fichier de
  configuration context.xml (un « context » est une
  application tournant sur le serveur). Par défaut il s’agit du nom du
  projet.
Lors du déploiement de l’application sur le serveur tomcat, celui-ci devra être informé des URL associées à chaque servlet afin de pouvoir gérer correctement les requêtes. Un servlet donné peut répondre à une ou plusieurs URL relatives au context path. Ces URL sont définies dans une annotation Java par des URL patterns.
Une annotation java est une ligne dans le code source
  java commençant par le caractère @ et contenant des métadonnées qui
  apparaîtront dans le fichier compilé .class ; ces
  métadonnées seront lues par tomcat lors du déploiement.
Les URL patterns suivent une syntaxe où /
  représente la racine de l’application et non du serveur :
  attention à ne pas confondre avec les liens hypertexte où
  / représente toujours la racine du serveur. Ainsi si
  vous indiquez comme pattern /first le servlet répondra
  à http://localhost:8080/nomduprojet/first par
  exemple.
Cliquez à droite sur votre projet web dans netbeans et choisissez new
puis servlet. Choisissez comme nom par exemple MonPremierServlet
(ce sera le nom de la classe java créée) ; il faut également choisir un
nom de paquetage (il s’agit d’un paquetage java standard). Vous devez indiquer
ensuite quelle(s) URL ce servlet gérera, dans le champ URL Pattern(s). 
Ne cochez pas la case demandant à créer
web.xml (ce fichier est une alternative aux annotations
Java, et ici nous utilisons les annotations).
Netbeans génère alors un squelette pour votre classe servlet. Vous
pouvez constater que cette classe hérite directement de HttpServlet et
qu’une implémentation standard des deux méthodes principales doGet et
doPost est proposée. Cette implémentation consiste à rediriger dans
les deux cas vers une méthode processRequest de façon à traiter de la
même manière les requêtes GET et POST. Vous pouvez voir que
processRequest agit sur l’objet HttpServletResponse fourni par tomcat
et fait deux choses : elle indique le type de contenu
qu’elle va renvoyer avec setContentType
puis envoie du code HTML ligne par ligne sur le
flot de sortie de la réponse. L’effet est d’envoyer ce texte en
réponse à la requête du client.
Vous pouvez tout de suite (re)déployer votre projet sur le serveur
tomcat (flèche verte). Cependant vous pouvez voir que netbeans ouvre
par défaut firefox sur l’URL racine de l’application, ce qui
correspond à la page index.html. Pour vérifier que le servlet
fonctionne, il faut tester son URL :
http://localhost:8080/nomduprojet/first
N.B. : Après redéploiement, pensez toujours à rafraîchir la
page dans le navigateur (netbeans rouvre la page dans firefox mais
celui-ci a tendance à afficher la version en cache). Par ailleurs, si
le redéploiement échoue ou si des comportements bizarres apparaissent,
pensez à faire clean and build dans netbeans plutôt qu’un
simple build. C’est notamment nécessaire si vous avez déplacé ou
renommé certains fichiers .java, afin de supprimer
les .class correspondant à l’ancien nom ou emplacement.
Vous pouvez aussi utiliser un autre IDE que Netbeans pour générer un squelette automatiquement (mais ce squelette sera probablement différent). Vous pouvez aussi vous inspirer de ceci (à créer dans le répertoire correspondant au nom de paquetage voulu) :
package lepackage;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet(urlPatterns = {"/first", "/second"}) // ici il répond à 2 URL
public class MonServlet extends HttpServlet {
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, java.io.IOException {
    // à compléter
  }
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, java.io.IOException {
    // à compléter
  }
}
  
On souhaite avec ce servlet traiter des données de formulaire envoyées par la méthode POST. La méthode doGet ne sert donc à rien : supprimez-la de la classe, recompilez, redéployez et constatez que l’URL du servlet renvoie maintenant une erreur 405 si on la tape dans la barre d’adresse — car c’est une requête GET que le navigateur envoie dans ce cas.
Modifiez maintenant la page index.html pour y ajouter un formulaire
ayant un champ texte et un bouton soumettre et qui renvoie les données
saisies en POST vers le servlet.
Écrivez ensuite pour le servlet une méthode doPost qui récupère le
contenu de ce champ texte et renvoie une page HTML contenant juste ce
texte dans un paragraphe. Les données de formulaire sont placées par
tomcat dans l’objet HttpServletRequest et accessibles par la méthode
getParameter("nom du champ") (voir la
javadoc).
Codage des caractères : Les données de formulaire
peuvent contenir des caractères accentués et plusieurs codages
différents sont utilisés sur le Web. Pour que tout se passe bien, il
faut s’assurer que le même codage soit utilisé en écriture (par le
navigateur) qu’en lecture (via
l’objet HttpServletRequest). Le codage qu'on demande au
navigateur d’utiliser est spécifié par
l’attribut accept-charset de l’élément form.
Le codage utilisé par l’objet HttpServletRequest est
spécifié par sa méthode setCharacterEncoding. Le plus sûr
est de spécifier "UTF-8" dans les deux cas.
Vous pouvez également envoyer les données de formulaire sur la sortie
standard (System.out). Demandez à votre voisin d’accéder à votre page
d’accueil et d’entrer un message, et vérifiez que ce message s’affiche
dans la console dans netbeans. Ce qu’affiche netbeans se trouve dans
le fichier log/catalina.out dans le répertoire de Tomcat (Remarque :
la sortie standard ne devrait être utilisée que pour du débuggage.)