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).