Débogage des servlets


Test/débogage des Servlets est toujours un point difficile dans le processus de développement et d'utilisation. Les servlets impliquent souvent de nombreuses interactions client/serveur et des erreurs peuvent survenir mais sont difficiles à reproduire.

Voici quelques conseils et suggestions pour vous aider à déboguer.

System.out.println()

System.out.println() est utilisé comme marqueur pour tester si un morceau de code spécifique est exécuté. Nous pouvons également imprimer la valeur d'une variable. De plus :

  • Étant donné que l'objet System fait partie des objets Java de base, il peut être utilisé n'importe où sans qu'il soit nécessaire d'installer des classes supplémentaires. Cela inclut les servlets, les JSP, les RMI, les EJB, les beans et les classes simples, ainsi que les applications autonomes.

  • Contrairement à l'arrêt à un point d'arrêt, l'écriture dans System.out n'interfère pas avec le flux d'exécution normal de l'application, ce qui la rend particulièrement utile lorsque le timing est critique.

Voici la syntaxe d'utilisation de System.out.println() :

System.out.println("Debugging message");

Tous les messages générés par la syntaxe ci-dessus seront enregistrés dans le fichier journal du serveur Web. .

Journal des messages

C'est une très bonne idée d'utiliser des méthodes de journalisation appropriées pour enregistrer tous les messages de débogage, d'avertissement et d'erreur, il est recommandé d'utiliser log4J pour tous les enregistrer information.

L'API Servlet fournit également un moyen simple de générer des informations, à l'aide de la méthode log(), comme indiqué ci-dessous :

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ContextLog extends HttpServlet {
  public void doGet(HttpServletRequest request, 
      HttpServletResponse response) throws ServletException,
         java.io.IOException {
    
      String par = request.getParameter("par1");
      // 调用两个 ServletContext.log 方法
      ServletContext context = getServletContext( );

      if (par == null || par.equals(""))
      // 通过 Throwable 参数记录版本
      context.log("No message received:",
          new IllegalStateException("Missing parameter"));
      else
          context.log("Here is the visitor's message: " + par);
      
      response.setContentType("text/html");
      java.io.PrintWriter out = response.getWriter( );
      String title = "Context Log";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
        "<html>\n" +
        "<head><title>" + title + "</title></head>\n" +
        "<body bgcolor=\"#f0f0f0\">\n" +
        "<h1 align=\"center\">" + title + "</h1>\n" +
        "<h2 align=\"center\">Messages sent</h2>\n" +
        "</body></html>");
    } //doGet
}

ServletContext enregistre ses messages texte dans le fichier journal du conteneur Servlet. Pour Tomcat, ces journaux se trouvent dans le répertoire <Tomcat-installation-directory>/logs.

Ces fichiers journaux donnent une indication de la fréquence des nouvelles erreurs ou problèmes. Pour cette raison, il est recommandé d'utiliser la fonction log() dans une clause catch pour les exceptions qui ne se produiraient normalement pas.

Utilisation du débogueur JDB

Vous pouvez déboguer une servlet à l'aide de l'applet de débogage ou de la commande jdb de l'application.

Afin de déboguer un servlet, nous pouvons déboguer sun.servlet.http.HttpServer, puis le voir comme HttpServer exécutant le servlet pour répondre à la requête HTTP côté navigateur. C'est très similaire au débogage d'une applet. Contrairement aux applets de débogage, le programme en cours de débogage est sun.applet.AppletViewer.

La plupart des débogueurs masquent automatiquement les détails sur la façon de déboguer une applet. De même, pour les servlets, vous devez procéder comme suit pour le débogueur :

  • Définissez le chemin de classe de votre débogueur afin qu'il puisse trouver sun.servlet.http.Http-Server et les classes associées.

  • Définissez le chemin de classe de votre débogueur afin qu'il puisse trouver vos servlets et les classes de support, généralement dans server_root/servlets et server_root/classes.

Vous ne voulez généralement pas server_root/servlets dans votre chemin de classe car cela désactive le rechargement des servlets. Mais cette règle d’inclusion est très utile pour le débogage. Il permet à votre débogueur de définir des points d'arrêt dans le servlet avant qu'il ne soit chargé par le chargeur de servlet personnalisé dans HttpServer.

Si vous avez configuré le chemin de classe correct, vous pouvez commencer le débogage de sun.servlet.http.HttpServer. Vous pouvez définir des points d'arrêt dans le code du servlet que vous souhaitez déboguer, puis adresser une requête à HttpServer via un navigateur Web à l'aide du servlet donné (http://localhost:8080/servlet/ServletToDebug). Vous verrez que l'exécution du programme s'arrête au point d'arrêt.

Utiliser les commentaires

Les commentaires dans votre code aident au débogage de différentes manières. Les commentaires peuvent être utilisés de nombreuses autres manières pour déboguer le processus.

Cette servlet utilise des commentaires Java et des commentaires sur une seule ligne (//...). Les commentaires sur plusieurs lignes (/* ...*/) peuvent être utilisés pour supprimer temporairement des parties du code Java. Si le bug disparaît, examinez de plus près le code que vous venez de commenter et déterminez où réside le problème.

Informations d'en-tête côté client et serveur

Parfois, lorsqu'un servlet ne se comporte pas comme prévu, il est utile d'afficher la requête et la réponse HTTP brutes. Si vous êtes familier avec la structure HTTP, vous pouvez lire la requête et la réponse pour voir quels sont ces en-têtes.

Conseils de débogage importants

Vous trouverez ci-dessous quelques conseils de débogage des servlets :

  • Veuillez noter que server_root/classes ne sera peut-être pas rechargé ; .

  • Demande au navigateur d'afficher le contenu original de la page qu'il affiche. Cela permet d'identifier les problèmes de formatage. Il s'agit généralement d'une option dans le menu Affichage.

  • Garantit que le navigateur n'a pas mis en cache la sortie de la requête précédente en forçant un rechargement complet de la page. Dans Netscape Navigator, utilisez Shift-Reload et dans Internet Explorer, utilisez Shift-Refresh.

  • Veuillez confirmer que la méthode init() du servlet accepte un paramètre ServletConfig et appelle super.init(config).