JSP나 서블릿 프로그램을 테스트/디버깅하는 것은 항상 어렵습니다. JSP 및 Servlet 프로그램은 클라이언트/서버 상호 작용이 많이 포함되는 경향이 있어 오류가 발생할 가능성이 매우 높으며 오류 환경을 재현하기가 어렵습니다.
다음으로, 프로그램 디버깅에 도움이 되는 몇 가지 팁과 제안을 제공하겠습니다.
System.out.println()은 코드 조각이 실행되었는지 여부를 쉽게 표시할 수 있습니다. 물론 다양한 값을 출력할 수도 있습니다. 또한:
System 객체는 핵심 Java 객체가 되었기 때문에 별도의 클래스 도입 없이 어디서든지 사용할 수 있습니다. 사용 범위에는 서블릿, JSP, RMI, EJB, Bean, 클래스 및 독립형 애플리케이션이 포함됩니다.
중단점에서 실행을 중지하는 것과 비교할 때 System.out을 사용하여 출력하는 것은 애플리케이션의 실행 프로세스에 큰 영향을 미치지 않습니다. 이 기능은 타이밍 메커니즘이 매우 중요한 애플리케이션에 매우 유용합니다.
System.out.println()을 사용하는 구문은 다음과 같습니다.
System.out.println("디버깅 메시지");다음은 System.out.print()를 사용한 간단한 예입니다.
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><html><head><title>System.out.println</title></ head><body><c:forEach var="counter" Begin="1" end="10" step="1" > <c:out value="${counter-5}"/></br> <% System.out.println( "카운터= " + pageContext.findAttribute("counter") ) %></c:forEach></body></html>이제 위의 예제를 실행하면 다음과 같은 결과가 생성됩니다.
-4-3-2-1012345Tomcat 서버를 사용하는 경우 로그 디렉터리의 stdout.log 파일에서 다음 추가 콘텐츠를 찾을 수 있습니다.
카운터=1카운터=2카운터=3카운터=4카운터=5카운터=6카운터=7카운터=8카운터=9카운터=10이 방법을 사용하면 문제의 근본 원인을 분석하고 찾기 위해 변수 및 기타 정보를 시스템 로그에 출력할 수 있습니다.
J2SE 로깅 프레임워크는 JVM에서 실행되는 모든 클래스에 대한 로깅 서비스를 제공합니다. 따라서 우리는 이 프레임워크를 사용하여 모든 정보를 기록할 수 있습니다.
JDK에서 로거 API를 사용하도록 위 코드를 다시 작성해 보겠습니다.
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@page import="java.util.logging.Logger" %><html> <head><title>Logger.info</title></head><body><% Logger logger=Logger.getLogger(this.getClass().getName());%><c:forEach var="counter " Begin="1" end="10" step="1" > <c:set var="myCount" value="${counter-5}" /> <c:out value="${myCount}"/ ></br> <% String message = "counter=" + pageContext.findAttribute("counter") + " myCount=" + pageContext.findAttribute("myCount")( message ); :forEach></body></html>결과는 이전 결과와 유사하지만 stdout.log 파일에 추가 정보를 출력할 수 있습니다. 여기서는 로거의 info 메소드를 사용합니다. 아래에는 stdout.log 파일의 스냅샷이 나와 있습니다.
2013년 9월 24일 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter=1 myCount=-424-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter=2 myCount=- 2013년 9월 324일 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: 카운터=3 myCount=-224-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: 카운터=4 myCount=-124-9월-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter=5 myCount=024-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter=6 myCount=124-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter= 7myCount=2013년 9월 224일 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: 카운터=8 myCount=324-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: 카운터=9 myCount=424-Sep-2013 23: 31:31 org.apache.jsp.main_jsp _jspServiceINFO: 카운터=10 myCount=5sever(), warning(), info(), config(), Fine(), finer() 및 Finest() 메서드를 사용하여 다양한 우선순위로 메시지를 보낼 수 있습니다. 가장 좋은 정보를 기록하려면 Fine() 메소드를 사용하고, 가장 심각한 정보를 기록하려면 sever() 메소드를 사용합니다.
Log4J 프레임워크를 사용하여 심각도와 중요도에 따라 분류된 다양한 파일에 메시지를 기록합니다.
NetBeans는 독립적인 Java 애플리케이션 및 네트워크 애플리케이션 개발을 지원하고 JSP 디버깅도 지원하는 트리 구조이자 오픈 소스 Java 종합 개발 환경입니다.
NetBeans는 다음과 같은 기본 디버깅 기능을 지원합니다.
중단점
단일 단계 추적
관측소
자세한 내용은 NetBeans 매뉴얼에서 확인할 수 있습니다.
JSP 및 서블릿에서 jdb 명령을 사용하여 일반 애플리케이션처럼 디버깅할 수 있습니다.
일반적으로 우리는 HttpServer가 HTTP 요청에 대한 응답으로 JSP/Servlet을 실행하는 방법을 확인하기 위해 sun.servlet.http.HttpServer 개체를 직접 디버깅합니다. 이는 애플릿 디버깅과 매우 유사합니다. 차이점은 애플릿 프로그램이 실제로 디버깅하는 것은 sun.applet.AppletViewer라는 것입니다.
대부분의 디버거는 애플릿을 디버깅하는 방법을 알고 있기 때문에 애플릿을 디버깅할 때 일부 세부 사항을 자동으로 무시할 수 있습니다. 디버깅 객체를 JSP로 전송하려면 다음 두 가지 작업을 수행해야 합니다.
sun.servlet.http.Http-Server 및 관련 클래스를 찾을 수 있도록 디버거의 클래스 경로를 설정합니다.
JSP 파일 및 관련 클래스를 찾을 수 있도록 디버거의 클래스 경로를 설정하십시오.
클래스 경로를 설정한 후 sun.servlet.http.Http-Server 디버깅을 시작합니다. JSP 파일의 원하는 위치에 중단점을 설정한 다음 브라우저를 사용하여 서버에 요청을 보내면 프로그램이 중단점에서 중지되는 것을 볼 수 있습니다.
프로그램의 주석은 여러 가지 방법으로 프로그램을 디버깅하는 데 특정 역할을 합니다. 주석은 프로그램 디버깅의 다양한 측면에서 사용될 수 있습니다.
JSP는 Java 주석을 사용합니다. 버그가 사라지면 방금 주석 처리한 코드를 자세히 살펴보면 대개 그 이유를 알 수 있습니다.
때로는 JSP가 의도한 대로 작동하지 않을 때 원시 HTTP 요청 및 응답을 보는 것이 유용할 수도 있습니다. HTTP의 구조에 익숙하다면 요청과 응답을 직접 관찰하고 이러한 헤더 모듈에서 무슨 일이 일어나는지 확인할 수 있습니다.
여기서는 JSP 디버깅을 위한 두 가지 팁을 더 공개합니다.
형식 문제가 있는지 구별하기 위해 브라우저를 사용하여 원본 페이지 콘텐츠를 표시합니다. 이 옵션은 일반적으로 보기 메뉴 아래에 있습니다.
페이지를 강제로 다시 로드할 때 브라우저가 이전 요청 출력을 캡처하지 않는지 확인하세요. Netscape Navigator 브라우저를 사용하는 경우 Shift-Reload를 사용하고, IE 브라우저를 사용하는 경우 Shift-Refresh를 사용하십시오.