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

Servlet 디버깅

테스트/Servlet 디버깅은 항상 개발 과정에서의 어려움입니다. Servlet은 일반적으로 많은 클라이언트를 포함합니다./서버와의 상호작용에서는 오류가 발생할 수 있지만 재현이 어려울 수 있습니다.

다음은 디버깅을 돕는 몇 가지 팁과 조언입니다.

System.out.println()

System.out.println()는 특정 코드가 실행되었는지 테스트하기 위해 사용되는 표시기로 사용됩니다. 또한 변수의 값을 출력할 수도 있습니다. 또한:

  • System 객체는 핵심 Java 객체의 일부이므로, 추가 클래스를 설치하지 않고 어디서든 사용할 수 있습니다. 이는 Servlet, JSP, RMI, EJB's, 일반 Beans 및 클래스, 독립 애플리케이션에도 적용됩니다.

  • 불량 점에 멈추는 것과 달리 System.out에 기록된 것은 애플리케이션의 정상적인 실행流程을 방해하지 않으며, 시간이 매우 중요한 경우 특히 유용합니다.

아래는 System.out.println()의 문법입니다:

System.out.println("디버깅 메시지");

위 문법으로 생성된 모든 메시지는 웹 서버 로그 파일에 기록됩니다.

메시지 로그

적절한 로그 기록 방법을 사용하여 모든 디버깅, 경고 및 오류 메시지를 기록하는 것은 매우 좋은 아이디어입니다. 추천합니다. 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="#f0f0f0">\n" +
        "<h1 align="center">" + title + "</h1>\n" +
        "<h2 align="center">Messages sent</h2>\n" +
        "</body></html>");
    } //doGet
}

ServletContext 把它的文本消息记录到 Servlet 容器的日志文件中。对于 Tomcat,这些日志可以在 <Tomcat-installation-directory>/logs 目录中找到。

这些日志文件确实对新出现的错误或问题的频率给出指示。正因为如此,建议在通常不会发生的异常的 catch 子句中使用 log() 函数。

使用 JDB 调试器

您可以使用调试 applet 或应用程序的 jdb 命令来调试 Servlet。

为了调试一个 Servlet,我们可以调试 sun.servlet.http.HttpServer,然后把它看成是 HttpServer 执行 Servlet 来响应浏览器端的 HTTP 请求。这与调试 applet 小程序非常相似。与调试 applet 不同的是,实际被调试的程序是 sun.applet.AppletViewer。

大多数调试器会自动隐藏如何调试 applet 的细节。同样的,对于 servlet,您必须帮调试器执行以下操作:

  • 设置您的调试器的类路径 classpath,以便它可以找到 sun.servlet.http.Http-Server 和相关的类。

  • 设置您的调试器的类路径 classpath,以便它可以找到您的 servlet 和支持的类,通常是在 server_root/servlets 和 server_root/classes 中。

您通常不会希望 server_root/servlets 在您的 classpath 中,因为它会禁用 servlet 的重新加载。但是这种包含规则对于调试是非常有用的。它允许您的调试器在 HttpServer 中的自定义 Servlet 加载器加载 Servlet 之前在 Servlet 中设置断点。

如果您已经设置了正确的类路径 classpath,就可以开始调试 sun.servlet.http.HttpServer。可以在您想要调试的 Servlet 代码中设置断点,然后通过 Web 浏览器使用给定的 Servlet(http://localhost:8080/서블릿/ServletToDebug)向 HttpServer 发出请求。您会看到程序执行到断点处会停止。

주석을 사용하여

코드에 주석은 다양한 방식으로 디버깅에 도움이 됩니다. 주석은 디버깅 과정의 다른 여러 방법에서 사용될 수 있습니다.

이 Servlet은 Java 주석과 단一行 주석(//...),다중 행 주석(/* ...*/),부분 Java 코드를 일시적으로 제거할 수 있습니다. 버그가 사라지면, 언락한 코드를 주의 깊게 확인하여 문제를 찾으십시오.

클라이언트 및 서버 헤더 정보

Servlet이 예상대로 작동하지 않을 때, 원래의 HTTP 요청과 응답을 확인하는 것은 매우 유용할 수 있습니다. HTTP 구조에 익숙하다면, 요청과 응답을 읽어 이 헤더 정보가 무엇인지 확인할 수 있습니다.

중요한 디버깅 기술

아래는 Servlet 디버깅의 기술을 나열했습니다:

  • 주의하십시오, server_root/classes는 재로드되지 않지만 server_root/servlet이 될 수 있습니다.

  • 브라우저가 표시한 페이지의 원래 내용을 표시하도록 요청합니다. 형식 문제를 식별하는 데 도움이 됩니다. 일반적으로 "보기" 메뉴 아래의 옵션입니다.

  • 브라우저가 이전 요청의 출력을 캐시하지 않도록 전면적으로 페이지를 다시 로드하여 보장하십시오. Netscape Navigator에서는 Shift를 사용하십시오.-재로드, Internet Explorer에서는 Shift를 사용하십시오.-새로 고침

  • servlet의 init() 메서드가 ServletConfig 파라미터를 받아 super.init(config)를 호출하도록 확인하십시오.