Servlets - Debuggen

Das Testen / Debuggen von Servlets ist immer schwierig. Servlets beinhalten in der Regel eine große Menge an Client / Server-Interaktionen, wodurch Fehler wahrscheinlich, aber schwer zu reproduzieren sind.

Hier sind einige Hinweise und Vorschläge, die Ihnen beim Debuggen helfen können.

System.out.println ()

System.out.println () kann einfach als Marker verwendet werden, um zu testen, ob ein bestimmter Code ausgeführt wird oder nicht. Wir können auch variable Werte ausdrucken. Zusätzlich -

  • Da das Systemobjekt Teil der Java-Kernobjekte ist, kann es überall verwendet werden, ohne dass zusätzliche Klassen installiert werden müssen. Dies umfasst Servlets, JSP, RMI, EJBs, normale Beans und Klassen sowie eigenständige Anwendungen.

  • Das Anhalten an Haltepunkten stoppt die normale Ausführung und benötigt daher mehr Zeit. Während das Schreiben in System.out den normalen Ausführungsfluss der Anwendung nicht wesentlich beeinträchtigt, ist es sehr wertvoll, wenn das Timing entscheidend ist.

Es folgt die Syntax zur Verwendung von System.out.println () -

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

Alle durch die obige Syntax generierten Nachrichten werden in der Webserver-Protokolldatei protokolliert.

Nachrichtenprotokollierung

Es ist immer eine gute Idee, die richtige Protokollierungsmethode zu verwenden, um alle Debug-, Warn- und Fehlermeldungen mithilfe einer Standardprotokollierungsmethode zu protokollieren. Ich benutze log4J , um alle Nachrichten zu protokollieren.

Die Servlet-API bietet auch eine einfache Möglichkeit zur Ausgabe von Informationen mithilfe der log () -Methode wie folgt:

// Import required java libraries
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");
      
      //Call the two ServletContext.log methods
      ServletContext context = getServletContext( );

      if (par == null || par.equals(""))
         //log version with Throwable parameter
         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
}

Der ServletContext protokolliert seine Textnachrichten in der Protokolldatei des Servlet-Containers. Bei Tomcat befinden sich diese Protokolle im Verzeichnis <Tomcat-Installationsverzeichnis> / logs.

Die Protokolldateien geben einen Hinweis auf neu auftretende Fehler oder die Häufigkeit von Problemen. Aus diesem Grund ist es gut, die Funktion log () in der catch-Klausel von Ausnahmen zu verwenden, die normalerweise nicht auftreten sollten.

JDB-Debugger verwenden

Sie können Servlets mit denselben JDB-Befehlen debuggen, die Sie zum Debuggen eines Applets oder einer Anwendung verwenden.

Um ein Servlet zu debuggen, debuggen wir sun.servlet.http.HttpServer und beobachten sorgfältig, wie HttpServer Servlets als Antwort auf HTTP-Anforderungen aus dem Browser ausführt. Dies ist dem Debuggen von Applets sehr ähnlich. Der Unterschied besteht darin, dass bei Applets das eigentliche Programm, das debuggt wird, sun.applet.AppletViewer ist.

Die meisten Debugger verbergen dieses Detail, indem sie automatisch wissen, wie Applets debuggt werden. Bis sie dasselbe für Servlets tun, müssen Sie Ihrem Debugger helfen, indem Sie Folgendes tun:

  • Stellen Sie den Klassenpfad Ihres Debuggers so ein, dass er sun.servlet.http.Http-Server und zugehörige Klassen finden kann.

  • Legen Sie den Klassenpfad Ihres Debuggers so fest, dass er auch Ihre Servlets und Supportklassen finden kann, normalerweise server_root / servlets und server_root / classes.

Normalerweise möchten Sie server_root / servlets nicht in Ihrem Klassenpfad haben, da dadurch das Neuladen von Servlets deaktiviert wird. Diese Aufnahme ist jedoch zum Debuggen nützlich. Damit kann Ihr Debugger Haltepunkte in einem Servlet festlegen, bevor der benutzerdefinierte Servlet-Loader in HttpServer das Servlet lädt.

Sobald Sie den richtigen Klassenpfad festgelegt haben, starten Sie das Debuggen von sun.servlet.http.HttpServer. Sie können Haltepunkte in jedem Servlet festlegen, das Sie debuggen möchten, und dann mithilfe eines Webbrowsers eine Anfrage an das HttpServer für das angegebene Servlet senden (http: // localhost: 8080 / servlet / ServletToDebug). Sie sollten sehen, dass die Ausführung an Ihren Haltepunkten gestoppt wird.

Kommentare verwenden

Kommentare in Ihrem Code können den Debugging-Prozess auf verschiedene Weise unterstützen. Kommentare können im Debugging-Prozess auf viele andere Arten verwendet werden.

Das Servlet verwendet Java-Kommentare und einzeilige (// ...) und mehrzeilige (/ * ... * /) Kommentare können verwendet werden, um Teile Ihres Java-Codes vorübergehend zu entfernen. Wenn der Fehler verschwindet, schauen Sie sich den gerade kommentierten Code genauer an und finden Sie das Problem heraus.

Client- und Server-Header

Manchmal, wenn sich ein Servlet nicht wie erwartet verhält, ist es hilfreich, die rohe HTTP-Anforderung und -Antwort zu überprüfen. Wenn Sie mit der Struktur von HTTP vertraut sind, können Sie die Anforderung und Antwort lesen und genau sehen, was genau mit diesen Headern geschieht.

Wichtige Tipps zum Debuggen

Hier ist eine Liste weiterer Debugging-Tipps zum Servlet-Debugging -

  • Denken Sie daran, dass server_root / classes nicht neu geladen wird und server_root / servlets wahrscheinlich.

  • Bitten Sie einen Browser, den Rohinhalt der angezeigten Seite anzuzeigen. Dies kann helfen, Formatierungsprobleme zu identifizieren. Dies ist normalerweise eine Option im Menü Ansicht.

  • Stellen Sie sicher, dass der Browser die Ausgabe einer vorherigen Anforderung nicht zwischenspeichert, indem Sie ein vollständiges Neuladen der Seite erzwingen. Verwenden Sie in Netscape Navigator Shift-Reload. Verwenden Sie mit Internet Explorer die Umschalttaste.

  • Stellen Sie sicher, dass die init () -Methode Ihres Servlets einen ServletConfig-Parameter verwendet und sofort super.init (config) aufruft.