Servlets - Gỡ lỗi
Việc kiểm tra / gỡ lỗi một servlet luôn khó khăn. Các Servlet có xu hướng liên quan đến một lượng lớn sự tương tác giữa máy khách / máy chủ, khiến cho các lỗi có thể xảy ra nhưng khó tái tạo.
Dưới đây là một số gợi ý và gợi ý có thể giúp bạn gỡ lỗi.
System.out.println ()
System.out.println () rất dễ sử dụng như một điểm đánh dấu để kiểm tra xem một đoạn mã nhất định có đang được thực thi hay không. Chúng tôi cũng có thể in ra các giá trị biến. Ngoài ra -
Vì đối tượng Hệ thống là một phần của các đối tượng Java cốt lõi, nó có thể được sử dụng ở mọi nơi mà không cần cài đặt thêm bất kỳ lớp bổ sung nào. Điều này bao gồm Servlet, JSP, RMI, EJB's, Beans và lớp thông thường, và các ứng dụng độc lập.
Kỹ thuật dừng tại các điểm ngắt dừng việc thực thi bình thường do đó mất nhiều thời gian hơn. Trong khi việc ghi vào System.out không can thiệp nhiều vào quy trình thực thi bình thường của ứng dụng, điều này làm cho nó rất có giá trị khi thời gian là quan trọng.
Sau đây là cú pháp để sử dụng System.out.println () -
System.out.println("Debugging message");
Tất cả các thông báo được tạo theo cú pháp trên sẽ được ghi vào tệp nhật ký máy chủ web.
Ghi nhật ký tin nhắn
Luôn luôn là một ý tưởng tuyệt vời khi sử dụng phương pháp ghi nhật ký thích hợp để ghi lại tất cả các thông báo gỡ lỗi, cảnh báo và lỗi bằng phương pháp ghi nhật ký chuẩn. Tôi sử dụng log4J để ghi lại tất cả các tin nhắn.
API Servlet cũng cung cấp một cách đơn giản để xuất ra thông tin bằng cách 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 ghi lại các tin nhắn văn bản của nó vào tệp nhật ký của vùng chứa servlet. Với Tomcat, các nhật ký này được tìm thấy trong <Tomcat-installation-directory> / logs.
Các tệp nhật ký đưa ra dấu hiệu về các lỗi mới xuất hiện hoặc tần suất của các vấn đề. Vì lý do đó, bạn nên sử dụng hàm log () trong mệnh đề bắt các ngoại lệ mà thông thường sẽ không xảy ra.
Sử dụng JDB Debugger
Bạn có thể gỡ lỗi các servlet bằng các lệnh jdb giống như bạn sử dụng để gỡ lỗi một applet hoặc một ứng dụng.
Để gỡ lỗi một servlet, chúng tôi gỡ lỗi sun.servlet.http.HttpServer và cẩn thận xem khi HttpServer thực thi các servlet để phản hồi các yêu cầu HTTP được thực hiện từ trình duyệt. Điều này rất giống với cách gỡ lỗi các applet. Sự khác biệt là với các applet, chương trình thực tế đang được gỡ lỗi là sun.applet.AppletViewer.
Hầu hết các trình gỡ lỗi đều ẩn chi tiết này bằng cách tự động biết cách gỡ lỗi các applet. Cho đến khi chúng làm tương tự cho các servlet, bạn phải trợ giúp trình gỡ lỗi của mình bằng cách thực hiện như sau:
Đặt classpath của trình gỡ lỗi của bạn để nó có thể tìm thấy sun.servlet.http.Http-Server và các lớp liên quan.
Đặt classpath của trình gỡ lỗi của bạn để nó cũng có thể tìm thấy các servlet và các lớp hỗ trợ của bạn, thường là server_root / servlets và server_root / class.
Thông thường bạn sẽ không muốn server_root / servlet trong classpath của mình vì nó vô hiệu hóa tải lại servlet. Tuy nhiên, bao gồm này rất hữu ích cho việc gỡ lỗi. Nó cho phép trình gỡ lỗi của bạn thiết lập các điểm ngắt trong một servlet trước khi trình tải servlet tùy chỉnh trong HttpServer tải servlet.
Khi bạn đã đặt classpath thích hợp, hãy bắt đầu gỡ lỗi sun.servlet.http.HttpServer. Bạn có thể đặt các điểm ngắt trong bất kỳ servlet nào mà bạn muốn gỡ lỗi, sau đó sử dụng trình duyệt web để thực hiện yêu cầu tới HttpServer cho servlet đã cho (http: // localhost: 8080 / servlet / ServletToDebug). Bạn sẽ thấy việc thực thi bị dừng tại các điểm ngắt của mình.
Sử dụng Nhận xét
Nhận xét trong mã của bạn có thể giúp quá trình gỡ lỗi theo nhiều cách khác nhau. Nhận xét có thể được sử dụng theo nhiều cách khác trong quá trình gỡ lỗi.
Servlet sử dụng các chú thích Java và chú thích một dòng (// ...) và nhiều dòng (/ * ... * /) có thể được sử dụng để tạm thời loại bỏ các phần trong mã Java của bạn. Nếu lỗi biến mất, hãy xem kỹ đoạn mã bạn vừa nhận xét và tìm ra vấn đề.
Tiêu đề Máy khách và Máy chủ
Đôi khi một servlet không hoạt động như mong đợi, sẽ hữu ích khi xem xét yêu cầu và phản hồi HTTP thô. Nếu bạn đã quen với cấu trúc của HTTP, bạn có thể đọc yêu cầu và phản hồi và xem chính xác điều gì đang diễn ra với các tiêu đề đó.
Mẹo gỡ lỗi quan trọng
Đây là danh sách một số mẹo gỡ lỗi khác về gỡ lỗi servlet -
Hãy nhớ rằng server_root / class không tải lại và server_root / servlets có thể làm được.
Yêu cầu trình duyệt hiển thị nội dung thô của trang mà trình duyệt đang hiển thị. Điều này có thể giúp xác định các vấn đề về định dạng. Nó thường là một tùy chọn trong menu View.
Đảm bảo rằng trình duyệt không lưu vào bộ nhớ đệm đầu ra của yêu cầu trước đó bằng cách buộc tải lại toàn bộ trang. Với Netscape Navigator, sử dụng Shift-Tải lại; với Internet Explorer, hãy sử dụng Shift-Refresh.
Xác minh rằng phương thức init () của servlet của bạn nhận tham số ServletConfig và gọi super.init (config) ngay lập tức.