Servlets - Depuração
É sempre difícil testar / depurar servlets. Os servlets tendem a envolver uma grande quantidade de interação cliente / servidor, tornando os erros prováveis, mas difíceis de reproduzir.
Aqui estão algumas dicas e sugestões que podem ajudá-lo em sua depuração.
System.out.println ()
System.out.println () é fácil de usar como marcador para testar se uma determinada parte do código está sendo executada ou não. Podemos imprimir os valores das variáveis também. Adicionalmente -
Como o objeto System faz parte dos objetos Java principais, ele pode ser usado em qualquer lugar sem a necessidade de instalar nenhuma classe extra. Isso inclui Servlets, JSP, RMI, EJBs, Beans e classes comuns e aplicativos independentes.
A técnica de parada em pontos de interrupção interrompe a execução normal, portanto, leva mais tempo. Já a gravação em System.out não interfere muito no fluxo normal de execução do aplicativo, o que o torna muito valioso quando o tempo é crucial.
A seguir está a sintaxe para usar System.out.println () -
System.out.println("Debugging message");
Todas as mensagens geradas pela sintaxe acima seriam registradas no arquivo de log do servidor web.
Registro de mensagens
É sempre uma boa ideia usar o método de registro adequado para registrar todas as mensagens de depuração, aviso e erro usando um método de registro padrão. Eu uso o log4J para registrar todas as mensagens.
A API Servlet também fornece uma maneira simples de enviar informações usando o método log () da seguinte forma -
// 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
}
O ServletContext registra suas mensagens de texto no arquivo de log do contêiner de servlet. Com o Tomcat, esses registros são encontrados em <Tomcat-installation-directory> / logs.
Os arquivos de log fornecem uma indicação de novos bugs emergentes ou da frequência dos problemas. Por esse motivo, é bom usar a função log () na cláusula catch de exceções que normalmente não deveriam ocorrer.
Usando o JDB Debugger
Você pode depurar servlets com os mesmos comandos jdb que usa para depurar um miniaplicativo ou aplicativo.
Para depurar um servlet, depuramos sun.servlet.http.HttpServer e observamos cuidadosamente enquanto o HttpServer executa servlets em resposta às solicitações HTTP feitas do navegador. Isso é muito semelhante a como os miniaplicativos são depurados. A diferença é que, com os miniaplicativos, o programa real sendo depurado é sun.applet.AppletViewer.
A maioria dos depuradores esconde esse detalhe sabendo automaticamente como depurar miniaplicativos. Até que eles façam o mesmo com os servlets, você precisa ajudar o seu depurador fazendo o seguinte -
Defina o classpath do depurador para que ele possa localizar sun.servlet.http.Http-Server e classes associadas.
Defina o classpath do seu depurador para que ele também possa encontrar seus servlets e classes de suporte, normalmente server_root / servlets e server_root / classes.
Você normalmente não gostaria de server_root / servlets em seu classpath porque desabilita o recarregamento de servlet. Essa inclusão, no entanto, é útil para depuração. Ele permite que seu depurador defina pontos de interrupção em um servlet antes que o carregador de servlet personalizado em HttpServer carregue o servlet.
Depois de definir o classpath adequado, comece a depurar sun.servlet.http.HttpServer. Você pode definir pontos de interrupção em qualquer servlet que esteja interessado em depurar e, em seguida, usar um navegador da web para fazer uma solicitação ao HttpServer para o servlet fornecido (http: // localhost: 8080 / servlet / ServletToDebug). Você deve ver a execução sendo interrompida em seus pontos de interrupção.
Usando comentários
Os comentários em seu código podem ajudar o processo de depuração de várias maneiras. Os comentários podem ser usados de muitas outras maneiras no processo de depuração.
O Servlet usa comentários Java e comentários de linha única (// ...) e linha múltipla (/ * ... * /) podem ser usados para remover temporariamente partes de seu código Java. Se o bug desaparecer, dê uma olhada no código que você acabou de comentar e descubra o problema.
Cabeçalhos de cliente e servidor
Às vezes, quando um servlet não se comporta conforme o esperado, é útil examinar a solicitação e a resposta HTTP brutas. Se você estiver familiarizado com a estrutura do HTTP, poderá ler a solicitação e a resposta e ver exatamente o que está acontecendo com esses cabeçalhos.
Dicas importantes de depuração
Aqui está uma lista de mais algumas dicas de depuração sobre depuração de servlet -
Lembre-se de que server_root / classes não recarrega e que server_root / servlets provavelmente sim.
Peça a um navegador para mostrar o conteúdo bruto da página que está exibindo. Isso pode ajudar a identificar problemas de formatação. Geralmente é uma opção do menu Exibir.
Certifique-se de que o navegador não esteja armazenando em cache a saída de uma solicitação anterior, forçando um recarregamento completo da página. Com o Netscape Navigator, use Shift-Reload; com o Internet Explorer, use Shift-Refresh.
Verifique se o método init () do seu servlet usa um parâmetro ServletConfig e chama super.init (config) imediatamente.