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.. Sử dụn
Trang 1Debug trong Servlet
Nó là rất khó để test/debug một Servlet Các Servlet bao gồm một lượng lớn các tương tác
Client/Server, vì thế việc tạo ra các Error là hoàn toàn có thể
Sau đây là một số gợi ý có thể giúp bạn trong việc debug cá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");
Tất cả message được tạo bởi cú pháp trên sẽ được log trong log file trên Web Server
Log các message
Để log tất cả thông báo debug, warning, và error bạn nên sử dụng một phương thức
logging chuẩn Chúng tôi sử dụng log4J để log tất cả các message
Servlet API cũng cung cấp một cách đơn giản để output thông tin bởi sử dụng phương thức
log() như sau:
// Import required java libraries 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"); //Call the two
ServletContext.log methods ServletContext context = getServletContext( );
if (par == null || par.equals("")) //log version with Throwable
Trang 2parameter 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>"); }
ServletContext sẽ log các text message tới log file của Servlet container Với Tomcat,
những log này được tìm thấy trong <Tomcat-installation-directory>/logs
Các log file này cung cấp dấu hiệu về một bug mới hoặc các tần suất của các vấn đề Với
những lý do đó, nó là tốt để sử dụng hàm log() trong mệnh đề catch của exception
Sử dụng JDB Debugger
Bạn có thể debug các 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 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 Servlet của bạn và
hỗ trợ các class, đặc trưng là server_root/servlets and server_root/classes
Thường thì, bạn không muốn server_root/servlets trong classpath bởi vì nó vô hiệu hóa
việc reload của Servlet Tuy nhiên, sự bao gồm này là hữu ích để debug Nó cho phép
debugger của bạn thiết lập các Breakpoint trong một Servlet trước khi Custom Servlet
loader trong HttpServer tải Servlet đó
Trang 3Khi 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ỳ Servlet 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 Servlet đã cho (http://localhost:8080/servlet/ServletToDebug) Bạn nên quan sát việc dừng sự thực thi tại các Breakpoint
Sử dụng Comment
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
Servlet 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 Servlet 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 Servlet
Sau đây là một số lời khuyên cho việc debug các Servlet:
• Nhận thấy rằng server_root/classes không reload và điều tương tự có thể với server_root/servlets
• 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
• Xác minh phương thức init() của Servlet nhận một tham số là ServletConfig và gọi phương thức super.init(config) theo đúng cách