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 parameter
      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 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 đó.

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ỳ 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.

Viết câu trả lời

Drop Images

0 Bình luận