Servlet - Debug

È sempre difficile testare / eseguire il debug di un servlet. I servlet tendono a coinvolgere una grande quantità di interazione client / server, rendendo gli errori probabili ma difficili da riprodurre.

Ecco alcuni suggerimenti e suggerimenti che potrebbero aiutarti nel debug.

System.out.println ()

System.out.println () è facile da usare come indicatore per verificare se un determinato pezzo di codice viene eseguito o meno. Possiamo anche stampare i valori delle variabili. Inoltre -

  • Poiché l'oggetto System fa parte degli oggetti Java principali, può essere utilizzato ovunque senza la necessità di installare classi aggiuntive. Ciò include Servlet, JSP, RMI, EJB, bean e classi ordinarie e applicazioni autonome.

  • La tecnica di arresto ai punti di interruzione interrompe la normale esecuzione, quindi richiede più tempo. Considerando che scrivere su System.out non interferisce molto con il normale flusso di esecuzione dell'applicazione, il che lo rende molto prezioso quando la tempistica è cruciale.

Di seguito è riportata la sintassi per utilizzare System.out.println () -

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

Tutti i messaggi generati dalla sintassi di cui sopra verrebbero registrati nel file di registro del server web.

Registrazione messaggi

È sempre una buona idea utilizzare un metodo di registrazione appropriato per registrare tutti i messaggi di debug, avviso ed errore utilizzando un metodo di registrazione standard. Uso log4J per registrare tutti i messaggi.

L'API Servlet fornisce anche un modo semplice per fornire informazioni utilizzando il metodo log () come segue:

// 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
}

Il ServletContext registra i suoi messaggi di testo nel file di registro del contenitore servlet. Con Tomcat questi log si trovano in <Tomcat-installation-directory> / logs.

I file di registro forniscono un'indicazione di nuovi bug emergenti o la frequenza dei problemi. Per questo motivo è bene utilizzare la funzione log () nella clausola catch delle eccezioni che normalmente non dovrebbero verificarsi.

Utilizzo del debugger JDB

È possibile eseguire il debug dei servlet con gli stessi comandi jdb utilizzati per eseguire il debug di un'applet o di un'applicazione.

Per eseguire il debug di un servlet, eseguiamo il debug di sun.servlet.http.HttpServer e osserviamo attentamente come HttpServer esegue i servlet in risposta alle richieste HTTP effettuate dal browser. Questo è molto simile al modo in cui viene eseguito il debug degli applet. La differenza è che con le applet, il programma effettivo in fase di debug è sun.applet.AppletViewer.

La maggior parte dei debugger nasconde questo dettaglio sapendo automaticamente come eseguire il debug delle applet. Fino a quando non fanno lo stesso per i servlet, devi aiutare il tuo debugger facendo quanto segue:

  • Impostare il percorso di classe del debugger in modo che possa trovare sun.servlet.http.Http-Server e le classi associate.

  • Imposta il classpath del tuo debugger in modo che possa anche trovare i tuoi servlet e le classi di supporto, tipicamente server_root / servlet e server_root / classes.

Normalmente non vorresti server_root / servlets nel tuo classpath perché disabilita il ricaricamento del servlet. Questa inclusione, tuttavia, è utile per il debug. Consente al debugger di impostare i punti di interruzione in un servlet prima che il caricatore di servlet personalizzato in HttpServer carichi il servlet.

Dopo aver impostato il percorso di classe corretto, avviare il debug di sun.servlet.http.HttpServer. È possibile impostare i punti di interruzione in qualsiasi servlet a cui si è interessati al debug, quindi utilizzare un browser Web per effettuare una richiesta a HttpServer per il servlet dato (http: // localhost: 8080 / servlet / ServletToDebug). Dovresti vedere l'esecuzione interrotta nei punti di interruzione.

Utilizzo dei commenti

I commenti nel codice possono aiutare il processo di debug in vari modi. I commenti possono essere utilizzati in molti altri modi nel processo di debug.

Il servlet utilizza commenti Java e commenti su una riga (// ...) e su più righe (/ * ... * /) possono essere utilizzati per rimuovere temporaneamente parti del codice Java. Se il bug scompare, dai un'occhiata più da vicino al codice che hai appena commentato e scopri il problema.

Intestazioni client e server

A volte, quando un servlet non si comporta come previsto, è utile esaminare la richiesta e la risposta HTTP non elaborate. Se hai familiarità con la struttura di HTTP, puoi leggere la richiesta e la risposta e vedere esattamente cosa sta succedendo esattamente con quelle intestazioni.

Suggerimenti importanti per il debug

Ecco un elenco di altri suggerimenti per il debug sul debug dei servlet:

  • Ricorda che server_root / classes non si ricarica e che probabilmente server_root / servlets lo fa.

  • Chiedi a un browser di mostrare il contenuto grezzo della pagina che sta visualizzando. Questo può aiutare a identificare i problemi di formattazione. Di solito è un'opzione nel menu Visualizza.

  • Assicurati che il browser non memorizzi nella cache l'output di una richiesta precedente forzando un ricaricamento completo della pagina. Con Netscape Navigator, usa Shift-Reload; con Internet Explorer usa Shift-Refresh.

  • Verifica che il metodo init () del tuo servlet accetti un parametro ServletConfig e chiami subito super.init (config).