Servlet Débogage
Le test/le débogage des Servlets est toujours une partie difficile du développement. Les Servlets impliquent souvent beaucoup d'interactions client/serveur, et des erreurs peuvent survenir qui sont difficiles à reproduire.
Voici quelques astuces et suggestions pour vous aider à déboguer.
System.out.println()
System.out.println() est utilisé comme marqueur pour tester si un morceau spécifique de code a été exécuté. Nous pouvons également afficher les valeurs des variables. De plus :
- Comme l'objet System fait partie des objets Java de base, il peut être utilisé n'importe où sans installer de classes supplémentaires. Cela inclut les Servlets, JSP, RMI, les EJB, les Beans et classes ordinaires, ainsi que les applications autonomes.
- Contrairement à l'arrêt aux points d'arrêt, l'écriture dans System.out n'interfère pas avec le flux d'exécution normal de l'application, ce qui la rend particulièrement précieuse lorsque le timing est critique.
Voici la syntaxe d'utilisation de System.out.println() :
System.out.println("Debugging message");
Tous les messages générés via la syntaxe ci-dessus seront enregistrés dans les fichiers journaux du serveur Web.
Journalisation des messages
Il est très judicieux d'utiliser des méthodes de journalisation appropriées pour enregistrer tous les messages de débogage, d'avertissement et d'erreur. Il est recommandé d'utiliserlog4Jpour enregistrer tous les messages.
L'API Servlet fournit également un moyen simple de sortir des informations, en utilisant la méthode log(), comme suit :
// 导入必需的 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 enregistre ses messages texte dans les fichiers journaux du conteneur de servlets. Pour Tomcat, ces journaux se trouvent dans le répertoire <Tomcat-installation-directory>/logs.
Ces fichiers journaux donnent effectivement une indication de la fréquence des nouvelles erreurs ou des nouveaux problèmes. Pour cette raison, il est recommandé d'utiliser la fonction log() dans les clauses catch pour les exceptions qui ne se produisent pas normalement.
Utilisation du débogueur JDB
Vous pouvez utiliser la commande jdb pour déboguer des applets ou des applications afin de déboguer des servlets.
Pour déboguer un servlet, nous pouvons déboguer sun.servlet.http.HttpServer, puis le considérer comme HttpServer exécutant le servlet pour répondre aux requêtes HTTP du navigateur. Cela est très similaire au débogage d'applets. La différence avec le débogage d'une applet est que le programme réellement débogué est sun.applet.AppletViewer.
La plupart des débogueurs masquent automatiquement les détails de la façon de déboguer des applets. De même, pour les servlets, vous devez aider le débogueur à effectuer les opérations suivantes :
- Configurez le classpath de votre débogueur afin qu'il puisse trouver sun.servlet.http.HttpServer et les classes associées.
- Configurez le classpath de votre débogueur afin qu'il puisse trouver votre servlet et les classes de support, généralement dans server_root/servlets et server_root/classes.
Vous ne voulez généralement pas de server_root/servlets dans votre classpath, car cela désactive le rechargement des servlets. Mais cette règle d'inclusion est très utile pour le débogage. Elle permet à votre débogueur de définir des points d'arrêt dans le servlet avant que le chargeur de servlets personnalisé dans HttpServer ne charge le servlet.
Si vous avez défini le bon classpath, vous pouvez commencer à déboguer sun.servlet.http.HttpServer. Vous pouvez définir des points d'arrêt dans le code Servlet que vous voulez déboguer, puis utiliser un navigateur Web pour envoyer une requête à HttpServer avec le Servlet donné (http://localhost:8080/servlet/ServletToDebug). Vous verrez le programme s'arrêter au point d'arrêt.
Utilisation des commentaires
Les commentaires dans le code aident au débogage de diverses manières. Les commentaires peuvent être utilisés de bien d'autres manières pendant le processus de débogage.
Ce Servlet utilise les commentaires Java, et les commentaires sur une ligne (//...), les commentaires multi-lignes (/* ...*/) peuvent être utilisés pour supprimer temporairement des parties du code Java. Si le bug disparaît, examinez attentivement le code que vous venez de mettre en commentaire et découvrez le problème.
Informations d'en-tête client et serveur
Parfois, lorsqu'un Servlet ne se comporte pas comme prévu, il est très utile d'examiner la requête et la réponse HTTP brutes. Si vous connaissez la structure HTTP, vous pouvez lire la requête et la réponse pour voir exactement ce que sont ces en-têtes.
Conseils de débogage importants
Voici quelques astuces de débogage de Servlet :
- Notez que server_root/classes ne sera pas rechargé, tandis que server_root/servlets peut l'être.
- Demandez au navigateur d'afficher le contenu brut de la page qu'il affiche. Cela aide à identifier les problèmes de formatage. C'est généralement une option dans le menu « Affichage ».
- Assurez-vous que le navigateur n'a pas mis en cache la sortie de la requête précédente en forçant un rechargement complet de la page. Dans Netscape Navigator, utilisez Shift-Reload ; dans Internet Explorer, utilisez Shift-Refresh.
- Assurez-vous que la méthode init() du servlet accepte un paramètre ServletConfig et appelle super.init(config).