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

Quảng cáo

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.

Quảng cáo

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.

Các bạn ở Hà Nội có thể tham gia khóa học thứ 9 của vietjackteam (đang tuyển sinh) vào cuối tháng 10/2018 do anh Nguyễn Thanh Tuyền, admin vietjack.com trực tiếp giảng dạy tại Hà Nội. Chi tiết nội dung khóa học tham khỏa link : Khóa học Java.Các bạn học CNTT, điện tử viễn thông, đa phương tiện, điện-điện tử, toán tin có thể theo học khóa này. Số lượng các công việc Java hoặc .NET luôn gấp ít nhất 3 lần Android hoặc iOS trên thị trường tuyển dụng. Khóa online= Đi phỏng vấn, Khóa offline= Đi phỏng vấn+ 1.5 tháng thực tập ngoài doanh nghiệp. .

Mọi người có thể xem demo nội dung khóa học tại địa chỉ Video demo khóa học Offline

Các bạn ở xa học không có điều kiện thời gian có thể tham dự khóa Java online để chủ động cho việc học tập. Từ tháng 4/2018, VietJack khuyến mại giá SỐC chỉ còn 250k cho khóa học, các bạn có thể trả lại tiền nếu không hài lòng về chất lượng trong 1 tháng, liên hệ facebook admin fb.com/tuyen.vietjack để thanh toán chuyển khoản hoặc thẻ điện thoại, khóa học bằng Tiếng Việt với gần 100 video, các bạn có thể chủ động bất cứ lúc nào, và xem mãi mãi. Thông tin khóa học tại Khóa học Java Online trên Udemy

Follow fanpage của team https://www.facebook.com/vietjackteam/ hoặc facebook cá nhân Nguyễn Thanh Tuyền https://www.facebook.com/tuyen.vietjack để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile.... mới nhất của chúng tôi.

Các bài học SEO phổ biến khác tại VietJack: