English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Depuração Servlet

Teste/Depurar Servlet sempre é um desafio no processo de desenvolvimento./Interação com o servidor, pode ocorrer erros que são difíceis de reproduzir.

Aqui estão algumas dicas e sugestões que podem ajudar a depurar.

System.out.println()

System.out.println() é usado como um marcador para verificar se um determinado código foi executado. Também podemos imprimir os valores das variáveis. Além disso:

  • Como parte do conjunto de objetos Java central, o objeto System pode ser usado em qualquer lugar sem a necessidade de instalar nenhuma classe adicional. Isso inclui Servlet, JSP, RMI, EJB's, Beans normais e classes, bem como aplicativos independentes.

  • Diferente de parar no ponto de interrupção, escrever no System.out não interfere no fluxo normal de execução do aplicativo, o que torna-o particularmente valioso quando a sequência é crucial.

A seguir está a sintaxe do System.out.println():

System.out.println("message de depuração");

Todas as mensagens geradas pela sintaxe acima serão registradas no arquivo de log do servidor da web.

Diário de mensagens

Usar o método apropriado de registro de log para registrar todas as mensagens de depuração, alerta e erro, é uma ideia muito boa, recomenda-se usar log4J 来记录所有的消息。

Servlet API 还提供了一个简单的输出信息的方式,使用 log() 方法,如下所示:

// 导入必需的 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=\ +
        "<h1 align=\ + title + "</h1>\n" +
        "<h2 align=\/h2>\n" +
        "</body></html>
    } //doGet
}

ServletContext registra suas mensagens de texto no arquivo de log do container Servlet. Para o Tomcat, esses logs podem ser encontrados em <Tomcat-instalação-diretório>/encontrados no diretório logs.

Esses arquivos de log realmente indicam a frequência de novos erros ou problemas. Por esse motivo, é recomendável usar a função log() nas cláusulas catch de exceções que geralmente não ocorrem.

Usando o depurador JDB

Você pode usar o comando jdb para depurar Servlets, que é usado para depurar applets ou aplicativos.

Para depurar um Servlet, podemos depurar sun.servlet.http.HttpServer e vê-lo como HttpServer executando Servlets para responder a solicitações HTTP do lado do navegador. Isso é muito semelhante ao depurar applets. Diferente do depuração de applets, o programa realmente depurado é sun.applet.AppletViewer.

A maioria dos depuradores oculta automaticamente os detalhes de como depurar applets. Da mesma forma, para servlets, você precisa ajudar o depurador a executar as seguintes operações:

  • Configure o caminho de classes classpath do seu depurador para que ele possa encontrar sun.servlet.http.Http-Server e classes relacionadas.

  • Configure o caminho de classes classpath do seu depurador para que ele possa encontrar seus servlets e classes suportadas, geralmente no server_root/servlets e server_root/classes.

Você geralmente não deseja que server_root/Os servlets no seu classpath, pois isso desativa a recarga de servlets. No entanto, essa regra de inclusão é muito útil para a depuração. Ela permite que o seu depurador defina pontos de interrupção no Servlet antes de o carregador personalizado do Servlet no HttpServer carregá-lo.

Se você já configurou o caminho de classes classpath correto, você pode começar a depurar sun.servlet.http.HttpServer. Você pode definir pontos de interrupção no código do Servlet que você deseja depurar e, em seguida, usar o navegador web para acessar o Servlet fornecido (http://localhost:8080/servlet/ServletToDebug) envia uma solicitação para HttpServer. Você verá que o programa parará no ponto de interrupção.

Usar comentários

Os comentários no código ajudam de várias maneiras a depurar. Os comentários podem ser usados em muitos outros aspectos do processo de depuração.

Este servlet usa comentários Java e comentários em uma linha (//...),comentários em várias linhas(/* ...*/)Pode ser usado para remover temporariamente parte do código Java. Se o bug desaparecer, veja atentamente o código que você comentou recentemente e encontre o problema.

Informações de cabeçalho do cliente e do servidor

Às vezes, quando um servlet não está funcionando conforme o esperado, verificar a solicitação HTTP original e a resposta pode ser muito útil. Se você estiver familiarizado com a estrutura HTTP, você pode ler a solicitação e a resposta para ver o que esses cabeçalhos são.

Truques de Depuração Importantes

A seguir, estão listados alguns truques de depuração de servlet:

  • Observe que o server_root/As classes não recarregam, enquanto o server_root/Os servlets podem.

  • Exigir que o navegador mostre o conteúdo original da página que ele está exibindo. Isso ajuda a identificar problemas de formatação. Isso geralmente é uma opção sob o menu "Visualizar".

  • Forçar a recarga completa da página para garantir que o navegador ainda não tenha cacheado a saída da última solicitação. No Netscape Navigator, use Shift-Recarregar, no Internet Explorer, use Shift-Recarregar.

  • Por favor, confirme se o método init() do servlet aceita um parâmetro ServletConfig e chama super.init(config).