Servlets: depuración
Siempre es difícil probar / depurar un servlets. Los servlets tienden a involucrar una gran cantidad de interacción cliente / servidor, lo que hace que los errores sean probables pero difíciles de reproducir.
A continuación, se incluyen algunos consejos y sugerencias que pueden ayudarle en la depuración.
System.out.println ()
System.out.println () es fácil de usar como marcador para probar si una determinada pieza de código se está ejecutando o no. También podemos imprimir valores de variables. Además -
Dado que el objeto System es parte de los objetos principales de Java, se puede utilizar en cualquier lugar sin la necesidad de instalar clases adicionales. Esto incluye Servlets, JSP, RMI, EJB, Beans y clases ordinarios y aplicaciones independientes.
La técnica de detenerse en los puntos de interrupción detiene la ejecución normal, por lo que lleva más tiempo. Mientras que escribir en System.out no interfiere mucho con el flujo de ejecución normal de la aplicación, lo que lo hace muy valioso cuando el tiempo es crucial.
A continuación se muestra la sintaxis para usar System.out.println () -
System.out.println("Debugging message");
Todos los mensajes generados por la sintaxis anterior se registrarán en el archivo de registro del servidor web.
Registro de mensajes
Siempre es una buena idea utilizar un método de registro adecuado para registrar todos los mensajes de depuración, advertencia y error utilizando un método de registro estándar. Utilizo log4J para registrar todos los mensajes.
La API de Servlet también proporciona una forma sencilla de generar información mediante el método log () de la siguiente manera:
// 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
}
El ServletContext registra sus mensajes de texto en el archivo de registro del contenedor de servlets. Con Tomcat, estos registros se encuentran en <Tomcat-installation-directory> / logs.
Los archivos de registro dan una indicación de nuevos errores emergentes o la frecuencia de los problemas. Por esa razón, es bueno usar la función log () en la cláusula catch de excepciones que normalmente no deberían ocurrir.
Utilizando JDB Debugger
Puede depurar servlets con los mismos comandos jdb que usa para depurar un applet o una aplicación.
Para depurar un servlet, depuramos sun.servlet.http.HttpServer y observamos con atención cómo HttpServer ejecuta los servlets en respuesta a las solicitudes HTTP realizadas desde el navegador. Esto es muy similar a cómo se depuran los subprogramas. La diferencia es que con los applets, el programa real que se está depurando es sun.applet.AppletViewer.
La mayoría de los depuradores ocultan este detalle al saber automáticamente cómo depurar los subprogramas. Hasta que hagan lo mismo con los servlets, debe ayudar a su depurador haciendo lo siguiente:
Configure la ruta de clase de su depurador para que pueda encontrar sun.servlet.http.Http-Server y las clases asociadas.
Configure la ruta de clase de su depurador para que también pueda encontrar sus servlets y clases de soporte, normalmente raíz_servidor / servlets y raíz_servidor / clases.
Normalmente no querrá server_root / servlets en su classpath porque deshabilita la recarga de servlets. Sin embargo, esta inclusión es útil para depurar. Permite a su depurador establecer puntos de interrupción en un servlet antes de que el cargador de servlet personalizado en HttpServer cargue el servlet.
Una vez que haya configurado la ruta de clases adecuada, comience a depurar sun.servlet.http.HttpServer. Puede establecer puntos de interrupción en cualquier servlet que esté interesado en depurar, luego use un navegador web para hacer una solicitud al HttpServer para el servlet dado (http: // localhost: 8080 / servlet / ServletToDebug). Debería ver que la ejecución se detiene en sus puntos de interrupción.
Uso de comentarios
Los comentarios en su código pueden ayudar al proceso de depuración de varias formas. Los comentarios se pueden utilizar de muchas otras formas en el proceso de depuración.
El servlet utiliza comentarios de Java y comentarios de una sola línea (// ...) y de varias líneas (/ * ... * /) para eliminar temporalmente partes de su código Java. Si el error desaparece, eche un vistazo más de cerca al código que acaba de comentar y descubra el problema.
Encabezados de cliente y servidor
A veces, cuando un servlet no se comporta como se esperaba, es útil observar la solicitud y respuesta HTTP sin procesar. Si está familiarizado con la estructura de HTTP, puede leer la solicitud y la respuesta y ver exactamente qué sucede exactamente con esos encabezados.
Consejos importantes de depuración
Aquí hay una lista de algunos consejos de depuración más sobre la depuración de servlets:
Recuerde que server_root / classes no se recarga y que server_root / servlets probablemente lo haga.
Pídale a un navegador que muestre el contenido sin procesar de la página que se muestra. Esto puede ayudar a identificar problemas de formato. Suele ser una opción del menú Ver.
Asegúrese de que el navegador no esté almacenando en caché la salida de una solicitud anterior forzando una recarga completa de la página. Con Netscape Navigator, use Shift-Reload; con Internet Explorer use Shift-Refresh.
Verifique que el método init () de su servlet tome un parámetro ServletConfig y llame a super.init (config) de inmediato.