Servlet Debugging

Das Testen/Debuggen von Servlets ist immer ein schwieriger Teil der Entwicklung. Servlets beinhalten oft viel Client-Server-Interaktion, und es können Fehler auftreten, die schwer zu reproduzieren sind.

Hier sind einige Tipps und Vorschläge, die Ihnen beim Debuggen helfen.

System.out.println()

System.out.println() wird als Marker verwendet, um zu testen, ob ein bestimmter Codeabschnitt ausgeführt wurde. Wir können auch Variablenwerte ausgeben. Darüber hinaus:

  • Da das System-Objekt zu den Kern-Java-Objekten gehört, kann es überall verwendet werden, ohne zusätzliche Klassen zu installieren. Dazu gehören Servlets, JSP, RMI, EJB's, gewöhnliche Beans und Klassen sowie eigenständige Anwendungen.
  • Anders als beim Anhalten an Haltepunkten beeinträchtigt das Schreiben in System.out nicht den normalen Ausführungsablauf der Anwendung, was es besonders wertvoll macht, wenn das Timing entscheidend ist.

Hier ist die Syntax für die Verwendung von System.out.println():

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

Alle Nachrichten, die durch die obige Syntax erzeugt werden, werden in den Protokolldateien des Webservers aufgezeichnet.

Nachrichtenprotokollierung

Es ist eine sehr gute Idee, geeignete Protokollierungsmethoden zu verwenden, um alle Debug-, Warn- und Fehlermeldungen aufzuzeichnen. Es wird empfohlen,log4Jzu verwenden, um alle Nachrichten aufzuzeichnen.

Die Servlet-API bietet außerdem eine einfache Möglichkeit, Informationen auszugeben, indem die Methode log() verwendet wird, wie folgt:

// 导入必需的 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;charset=UTF-8");
      java.io.PrintWriter out = response.getWriter( );
      String title = "Context Log";
      String docType = "<!DOCTYPE html> \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 zeichnet seine Textmeldungen in den Protokolldateien des Servlet-Containers auf. Bei Tomcat finden Sie diese Protokolle im Verzeichnis <Tomcat-installation-directory>/logs.

Diese Protokolldateien geben einen Hinweis auf die Häufigkeit neuer Fehler oder Probleme. Aus diesem Grund wird empfohlen, die Funktion log() in catch-Klauseln für Ausnahmen zu verwenden, die normalerweise nicht auftreten.

使用 JDB 调试器

Sie können den Befehl jdb zum Debuggen von Applets oder Anwendungen verwenden, um Servlets zu debuggen.

Um ein Servlet zu debuggen, können wir sun.servlet.http.HttpServer debuggen und ihn dann als HttpServer betrachten, der das Servlet ausführt, um auf HTTP-Anfragen des Browsers zu antworten. Dies ist dem Debuggen von Applets sehr ähnlich. Der Unterschied zum Debuggen eines Applets besteht darin, dass das tatsächlich gedebuggte Programm sun.applet.AppletViewer ist.

Die meisten Debugger verbergen automatisch die Details, wie Applets gedebuggt werden. Ähnlich müssen Sie bei Servlets dem Debugger helfen, Folgendes zu tun:

  • Legen Sie den Classpath Ihres Debuggers so fest, dass er sun.servlet.http.HttpServer und zugehörige Klassen finden kann.
  • Legen Sie den Classpath Ihres Debuggers so fest, dass er Ihr Servlet und unterstützende Klassen finden kann, normalerweise in server_root/servlets und server_root/classes.

Normalerweise möchten Sie server_root/servlets nicht in Ihrem Classpath haben, da dies das Neuladen von Servlets deaktiviert. Aber diese Einschlussregel ist für das Debuggen sehr nützlich. Sie ermöglicht es Ihrem Debugger, Haltepunkte im Servlet festzulegen, bevor der benutzerdefinierte Servlet-Loader in HttpServer das Servlet lädt.

Wenn Sie den richtigen Classpath festgelegt haben, können Sie mit dem Debuggen von sun.servlet.http.HttpServer beginnen. Sie können Haltepunkte im Servlet-Code festlegen, den Sie debuggen möchten, und dann mit einem Webbrowser eine Anfrage an HttpServer mit dem angegebenen Servlet senden (http://localhost:8080/servlet/ServletToDebug). Sie werden sehen, dass das Programm am Haltepunkt anhält.

Verwenden von Kommentaren

Kommentare im Code helfen auf verschiedene Weise beim Debuggen. Kommentare können während des Debugging-Prozesses auf viele andere Arten verwendet werden.

Dieses Servlet verwendet Java-Kommentare, und einzeilige Kommentare (//...), mehrzeilige Kommentare (/* ...*/) können verwendet werden, um Teile des Java-Codes vorübergehend zu entfernen. Wenn der Fehler verschwindet, sehen Sie sich den Code, den Sie gerade auskommentiert haben, genau an und finden Sie das Problem heraus.

Client- und Server-Header-Informationen

Manchmal ist es sehr nützlich, die unformatierte HTTP-Anfrage und -Antwort anzusehen, wenn sich ein Servlet nicht wie erwartet verhält. Wenn Sie mit der HTTP-Struktur vertraut sind, können Sie die Anfrage und die Antwort lesen, um genau zu sehen, was diese Header sind.

Wichtige Debugging-Tipps

Hier sind einige Tipps zum Debuggen von Servlets:

  • Beachten Sie, dass server_root/classes nicht neu geladen werden, während server_root/servlets möglicherweise neu geladen werden.
  • Fordern Sie den Browser auf, den unformatierten Inhalt der Seite anzuzeigen, die er gerade anzeigt. Dies hilft, Formatierungsprobleme zu erkennen. Normalerweise ist dies eine Option unter dem Menü "Ansicht".
  • Stellen Sie sicher, dass der Browser die Ausgabe der vorherigen Anfrage nicht zwischengespeichert hat, indem Sie ein vollständiges Neuladen der Seite erzwingen. Verwenden Sie in Netscape Navigator Shift-Reload; verwenden Sie in Internet Explorer Shift-Refresh.
  • Stellen Sie sicher, dass die Methode init() des Servlets einen ServletConfig-Parameter akzeptiert und super.init(config) aufruft.
Andere Erweiterungen