서블릿 디버깅
서블릿을 테스트/디버깅하는 것은 개발 및 사용 과정에서 항상 어려운 부분입니다. 서블릿에는 클라이언트/서버 상호 작용이 많이 포함되는 경우가 많으며 오류가 발생할 수 있지만 재현하기는 어렵습니다.
다음은 디버그에 도움이 되는 몇 가지 팁과 제안입니다.
System.out.println()
System.out.println()은 특정 코드 조각이 실행되는지 테스트하는 마커로 사용됩니다. 변수의 값을 인쇄할 수도 있습니다. 추가 사항:
시스템 개체는 핵심 Java 개체의 일부이므로 추가 클래스를 설치할 필요 없이 어디서나 사용할 수 있습니다. 여기에는 서블릿, JSP, RMI, EJB, 일반 Bean 및 클래스는 물론 독립형 애플리케이션이 포함됩니다.
중단점에서 중지하는 것과 달리 System.out에 쓰는 것은 애플리케이션의 일반적인 실행 흐름을 방해하지 않으므로 타이밍이 중요한 경우에 특히 유용합니다.
다음은 System.out.println()을 사용하는 구문입니다.
System.out.println("Debugging message");
위 구문으로 생성된 모든 메시지는 웹 서버 로그 파일에 기록됩니다. .
메시지 로그
모든 디버그, 경고 및 오류 메시지를 기록하려면 적절한 로깅 방법을 사용하는 것이 좋습니다. 모든 디버그, 경고 및 오류 메시지를 기록하려면 log4J를 사용하는 것이 좋습니다. 정보.
서블릿 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"); 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 }
ServletContext는 텍스트 메시지를 서블릿 컨테이너의 로그 파일에 기록합니다. Tomcat의 경우 이러한 로그는 <Tomcat-installation-directory>/logs 디렉터리에서 찾을 수 있습니다.
이러한 로그 파일은 새로운 오류나 문제의 빈도를 나타냅니다. 따라서 일반적으로 발생하지 않는 예외의 catch 절에는 log() 함수를 사용하는 것이 좋습니다.
JDB 디버거 사용
디버그 애플릿이나 애플리케이션의 jdb 명령을 사용하여 서블릿을 디버그할 수 있습니다.
서블릿을 디버깅하려면 sun.servlet.http.HttpServer를 디버깅한 다음 브라우저 측에서 HTTP 요청에 응답하기 위해 서블릿을 실행하는 HttpServer로 볼 수 있습니다. 이는 애플릿을 디버깅하는 것과 매우 유사합니다. 디버깅 애플릿과 달리 디버깅되는 실제 프로그램은 sun.applet.AppletViewer입니다.
대부분의 디버거는 애플릿 디버깅 방법에 대한 세부 정보를 자동으로 숨깁니다. 마찬가지로 서블릿의 경우 디버거에 대해 다음을 수행해야 합니다.
sun.servlet.http.Http-Server 및 관련 클래스를 찾을 수 있도록 디버거의 클래스 경로를 설정합니다.
일반적으로 server_root/servlets 및 server_root/classes에서 서블릿과 지원 클래스를 찾을 수 있도록 디버거의 클래스 경로를 설정합니다.
서블릿을 다시 로드할 수 없으므로 일반적으로 클래스 경로에 server_root/servlets를 사용하지 않는 것이 좋습니다. 하지만 이 포함 규칙은 디버깅에 매우 유용합니다. 이를 통해 디버거는 HttpServer의 사용자 정의 서블릿 로더에 의해 로드되기 전에 서블릿에 중단점을 설정할 수 있습니다.
올바른 클래스 경로를 설정했다면 sun.servlet.http.HttpServer 디버깅을 시작할 수 있습니다. 디버깅하려는 서블릿 코드에 중단점을 설정한 다음 해당 서블릿(http://localhost:8080/servlet/ServletToDebug)을 사용하여 웹 브라우저를 통해 HttpServer에 요청할 수 있습니다. 중단점에서 프로그램 실행이 중지되는 것을 볼 수 있습니다.
주석 사용
코드의 주석은 다양한 방법으로 디버깅에 도움이 됩니다. 주석은 프로세스를 디버깅하기 위해 다양한 방법으로 사용될 수 있습니다.
이 서블릿은 Java 주석과 한 줄 주석(//...)을 사용합니다. 여러 줄 주석(/* ...*/)을 사용하여 Java 코드의 일부를 일시적으로 제거할 수 있습니다. 버그가 사라지면 방금 주석 처리한 코드를 자세히 살펴보고 문제가 있는 위치를 파악하세요.
클라이언트 및 서버측 헤더 정보
때때로 서블릿이 예상대로 작동하지 않는 경우 원시 HTTP 요청 및 응답을 보는 것이 유용합니다. HTTP 구조에 익숙하다면 요청과 응답을 읽고 이러한 헤더가 무엇인지 확인할 수 있습니다.
중요 디버깅 팁
다음은 일부 서블릿 디버깅 팁입니다.
server_root/classes는 다시 로드되지 않을 수 있습니다. .
표시되는 페이지의 원본 콘텐츠를 표시하도록 브라우저에 요청합니다. 이는 형식 문제를 식별하는 데 도움이 됩니다. 일반적으로 보기 메뉴 아래에 있는 옵션입니다.
페이지를 완전히 다시 로드하여 브라우저가 이전 요청의 출력을 캐시하지 않았는지 확인합니다. Netscape Navigator에서는 Shift-Reload를 사용하고 Internet Explorer에서는 Shift-Refresh를 사용하십시오.
서블릿의 init() 메소드가 ServletConfig 매개변수를 승인하고 super.init(config)를 호출하는지 확인하세요.