Debug trong JSP



Công việc test/debug một JSP vfa Servlet luôn luôn là khó khăn và phức tạp. JSP và Servlet bao gồm một lượng tương tác Server-Client lớn, do đó, việc tạo ra lỗi là không thể không tránh khỏi.

Dưới đây là một số gợi ý có thể sẽ giúp ích cho bạn trong việc debug chương trình JSP hoặc Servlet.

Phương thức System.out.printIn()

Phương thức System.out.printIn() là dễ để sử dụng như là một Marker để kiểm tra có hay không một phần nào đó của code đang được thực thi hoặc không. Chúng ta cũng có thể in các giá trị của biến. Ngoài ra:

  • Vì đối tượng System là một phần của các đối tượng Core Java, nó có thể được sử dụng bất cứ đâu mà không cần cài đặt bất kỳ lớp bổ sung nào. Nó bao gồm Servlet, JSP, RMI, EJB's, ordinary Beans, các class, và các standalone application.

  • So sánh với việc dừng tại các Breakpoint, việc write tới System.out không gây trở ngại nhiều tới luồng thực thi thông thường của ứng dụng, mà làm cho nó đáng quý.

Sau đây là cú pháp của System.out.printIn():

System.out.println("Debugging message");

Dưới đây là ví dụ đơn giản sử dụng phương thức System.out.printIn():

<%@taglib prefix="c" uri="http://java.sun.com../jsp/jstl/core" %>

System.out.println


   
<% System.out.println( "counter= " + pageContext.findAttribute("counter") ); %>

Bây giờ nếu bạn truy cập JSP trên, nó sẽ cho kết quả sau:

-4
-3
-2
-1
0
1
2
3
4
5

Nếu bạn đang sử dụng Tomcat, bạn cũng sẽ tìm thấy các dòng này được phụ thêm tới phần cuối của stdout.log trong thư mục logs.

counter=1
counter=2
counter=3
counter=4
counter=5
counter=6
counter=7
counter=8
counter=9
counter=10

Với cách này, bạn có thể in các biến và thông tin khác vào trong system log, mà có thể được phân tích để tìm nguyên nhân chính của vấn đề hoặc cho các nguyên do khác.

Sử dụng JDB Logger

J2SE Logging Framework được thiết kế để cung cấp các dịch vụ log cho bất kỳ class nào đang chạy trong JVM. Vì thế, chúng ta có thể sử dụng Framework này để log bất kỳ thông tin nào.

Chúng ta viết lại ví dụ trên, sử dụng JDK logger API:

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page import="java.util.logging.Logger" %>
Logger.info

<% Logger logger=Logger.getLogger(this.getClass().getName());%>
   
   
<% String message = "counter=" + pageContext.findAttribute("counter") + " myCount=" + pageContext.findAttribute("myCount"); logger.info( message ); %>

Code này sẽ cho kết quả giống như trên tại trình duyệt và trong stdout.log, nhưng bạn sẽ có thông tin bổ sung trong stdout.log. Tại đây, chúng ta đang sử dụng phương thức info của Logger, bởi vì chúng ta đang log các thông báo chỉ cho mục đích thông tin. Dưới đây là snapshot (ảnh chụp màn hình) của stdout.log file:

24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=1 myCount=-4
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=2 myCount=-3
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=3 myCount=-2
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=4 myCount=-1
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=5 myCount=0
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=6 myCount=1
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=7 myCount=2
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=8 myCount=3
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=9 myCount=4
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=10 myCount=5

Các message có thể được gửi tại các level khác nhau bởi sử dụng các hàm như: severe(), warning(), info(), config(), fine(), finer(), và finest(). Tại đây, phương thức finest() có thể được sử dụng để log thông tin finest và phương thức severe() để log thông tin severe.

Bạn có thể sử dụng Log4J Framework để log các thông báo trong các file khác nhau dựa trên các mức độ và tính quan trọng.

Công cụ Debug trong JSP

NetBeans là một môi trường lập trình miễn phí và mã nguồn mở được tích hợp với Java. Môi trường, mà hỗ trợ phát triển các Java application và Web application độc lập, hỗ trợ JSP và Servlet và cũng bao gồm các JSP Debugger.

NetBeans hỗ trợ các tính năng debug cơ bản sau:

  • Breakpoints

  • Stepping through code

  • Watchpoints

Bạn có thể tham khảo NetBeans Documentation để hiểu chi tiết các tính năng debug trên.

Sử dụng JDB Debugger

Bạn có thể debug các chương trình JSP và Servlet với các lệnh jdb tương tự như khi bạn sử dụng để debug một applet hoặc một application.

Để debug một JSP hoặc Servlet, chúng ta có thể debug sun.servlet.http.HttpServer, sau đó quan sát khi HttpServer thực thi các Servlet này trong phản hồi tới các HTTP Request chúng ta tạo từ một trình duyệt. Nó tương tự như cách các applet được debug. Điểm khác nhau là với applet, chương trình thực sự được debug là sun.applet.AppletViewer.

Hầu hết debugger ẩn chi tiết này bởi việc tự động biết cách để debug các applet. Tới khi chúng thực hiện điều tương tự với các Servlet, bạn phải giúp debugger của mình bởi thực hiện các điều sau:

  • Thiết lập Classpath của debugger của bạn để mà nó có thể tìm sun.servlet.http.Http-Server và các class liên kết.

  • Thiết lập Classpath của debugger để mà nó cũng có thể tìm các JSP của bạn và hỗ trợ các class, đặc trưng là ROOT\WEB-INF\classes.

Khi bạn đã thiết lập classpath thích hợp, bắt đầu việc debug sun.servlet.http.HttpServer. Bạn có thể thiết lập các Breakpoint trong bất kỳ JSP nào bạn quan tâm, sau đó sử dụng một trình duyệt web để tạo một yêu cầu tới HttpServer cho JSP đã cho (http://localhost:8080/JSPToDebug). Bạn nên quan sát việc dừng sự thực thi tại các Breakpoint.

Sử dụng Comment trong JSP

Các Comment trong code của bạn có thể giúp tiến trình debug theo nhiều cách. Các comment có thể được sử dụng theo nhiều cách trong tiến trình debug.

JSP sử dụng Java comment và các comment đơn dòng (// …) và đa dòng (/* … */) có thể được sử dụng để tạm thời gỡ bỏ các phần của Java code. Nếu bug biến mất, quan sát cẩn thận code mà bạn đã comment và tìm ra vấn đề.

Các trường Header trên Client và Server

Đôi khi, khi một JSP không vận hành như mong đợi, nó là hữu ích khi nhìn vào HTTP Request và HTTP Response thô. Nếu bạn chưa làm quen với cấu trúc của HTTP, bạn có thể đọc Request và Response và xem chính xác những gì đang diễn ra với các Header này.

Lời khuyên tốt cho Debug trong JSP

Sau đây là một số lời khuyên cho việc debug chương trình JSP:

  • Yêu cầu các trình duyệt hiển thị nội dung thô của trang nó đang hiển thị. Điều này giúp nhận diện các vấn đề về định dạng. Nó thường là một option ở dưới View menu.

  • Đảm bảo rằng trình duyệt không cache kết quả của yêu cầu trước đó bằng việc bắt buộc Full Reload trang. Với Netscape Navigator, sử dụng Shift-Reload; với Internet Explorer, sử dụng Shift-Refresh.

Các bài học JSP khác tại VietJack: