Serwlety - debugowanie

Testowanie / debugowanie serwletów jest zawsze trudne. Serwlety zwykle wiążą się z dużą ilością interakcji klient / serwer, przez co błędy są prawdopodobne, ale trudne do odtworzenia.

Oto kilka wskazówek i sugestii, które mogą pomóc w debugowaniu.

System.out.println ()

System.out.println () jest łatwy w użyciu jako znacznik do testowania, czy określony fragment kodu jest wykonywany, czy nie. Możemy również wydrukować wartości zmiennych. Dodatkowo -

  • Ponieważ obiekt System jest częścią podstawowych obiektów Java, można go używać wszędzie bez konieczności instalowania dodatkowych klas. Obejmuje to serwlety, JSP, RMI, EJB, zwykłe komponenty Beans i klasy oraz samodzielne aplikacje.

  • Technika zatrzymywania się w punktach przerwania zatrzymuje normalne wykonywanie, dlatego zajmuje więcej czasu. Podczas gdy pisanie do System.out nie koliduje zbytnio z normalnym przebiegiem wykonywania aplikacji, co czyni go bardzo cennym, gdy kluczowy jest czas.

Poniżej znajduje się składnia użycia System.out.println () -

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

Wszystkie komunikaty generowane przez powyższą składnię byłyby rejestrowane w pliku dziennika serwera WWW.

Rejestrowanie wiadomości

Zawsze dobrym pomysłem jest użycie odpowiedniej metody logowania do rejestrowania wszystkich komunikatów debugowania, ostrzeżeń i komunikatów o błędach przy użyciu standardowej metody rejestrowania. Używam log4J do rejestrowania wszystkich wiadomości.

Servlet API zapewnia również prosty sposób wyprowadzania informacji za pomocą metody log () w następujący sposób -

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

ServletContext rejestruje swoje komunikaty tekstowe w pliku dziennika kontenera serwletu. W przypadku serwera Tomcat te dzienniki można znaleźć w katalogu <Tomcat-installation-directory> / logs.

Pliki dziennika zawierają informacje o nowych pojawiających się błędach lub częstotliwości występowania problemów. Z tego powodu dobrze jest użyć funkcji log () w klauzuli catch wyjątków, które normalnie nie powinny wystąpić.

Korzystanie z JDB Debugger

Możesz debugować serwlety za pomocą tych samych poleceń jdb, których używasz do debugowania apletu lub aplikacji.

Aby debugować serwlet, debugujemy sun.servlet.http.HttpServer i uważnie obserwujemy, jak HttpServer wykonuje serwlety w odpowiedzi na żądania HTTP wysyłane z przeglądarki. Jest to bardzo podobne do debugowania apletów. Różnica polega na tym, że w przypadku apletów debugowany program to sun.applet.AppletViewer.

Większość debugerów ukrywa ten szczegół, automatycznie wiedząc, jak debugować aplety. Dopóki nie zrobią tego samego dla serwletów, musisz pomóc debuggerze, wykonując następujące czynności -

  • Ustaw ścieżkę klas debugera tak, aby mógł znaleźć sun.servlet.http.Http-Server i powiązane klasy.

  • Ustaw ścieżkę klas debugera tak, aby mógł również znaleźć twoje serwlety i klasy obsługi, zazwyczaj server_root / servlets i server_root / classes.

Normalnie nie chciałbyś, aby katalog_główny_serwera / serwlety znajdował się w ścieżce klas, ponieważ wyłącza to ponowne ładowanie serwletów. To włączenie jest jednak przydatne do debugowania. Umożliwia debugerowi ustawienie punktów przerwania w serwlecie, zanim niestandardowy program ładujący serwlet w HttpServer załaduje serwlet.

Po ustawieniu właściwej ścieżki klas, rozpocznij debugowanie sun.servlet.http.HttpServer. Możesz ustawić punkty przerwania w dowolnym serwlecie, który chcesz debugować, a następnie użyć przeglądarki internetowej, aby wysłać żądanie do serwera HttpServer dla danego serwletu (http: // localhost: 8080 / servlet / ServletToDebug). Powinieneś zobaczyć zatrzymanie wykonywania w punktach przerwania.

Korzystanie z komentarzy

Komentarze w kodzie mogą pomóc w procesie debugowania na różne sposoby. Komentarze mogą być używane na wiele innych sposobów w procesie debugowania.

Serwlet używa komentarzy Java, a komentarze jednowierszowe (// ...) i wielowierszowe (/ * ... * /) mogą być używane do tymczasowego usuwania części kodu Java. Jeśli błąd zniknie, przyjrzyj się bliżej kodowi, który właśnie skomentowałeś i znajdź problem.

Nagłówki klienta i serwera

Czasami, gdy serwlet nie zachowuje się zgodnie z oczekiwaniami, warto przyjrzeć się surowemu żądaniu i odpowiedzi HTTP. Jeśli znasz strukturę protokołu HTTP, możesz przeczytać żądanie i odpowiedź i zobaczyć, co dokładnie dzieje się z tymi nagłówkami.

Ważne wskazówki dotyczące debugowania

Oto lista kilku dodatkowych wskazówek dotyczących debugowania serwletów -

  • Pamiętaj, że katalog_główny_serwera / klas nie ładuje się ponownie i prawdopodobnie tak jest.

  • Poproś przeglądarkę o pokazanie nieprzetworzonej zawartości wyświetlanej strony. Może to pomóc zidentyfikować problemy z formatowaniem. Zwykle jest to opcja w menu Widok.

  • Upewnij się, że przeglądarka nie buforuje danych wyjściowych poprzedniego żądania, wymuszając pełne ponowne załadowanie strony. W przeglądarce Netscape Navigator użyj Shift-Reload; w przeglądarce Internet Explorer użyj Shift-Refresh.

  • Sprawdź, czy metoda init () twojego serwletu pobiera parametr ServletConfig i natychmiast wywołuje super.init (config).