English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

ت调试 Servlet

测试/调试 Servlet 始终是开发使用过程中的难点。Servlet 往往涉及大量的客户端/服务器交互,可能会出现错误但又难以重现。

这里有一些提示和建议,可以帮助您调试。

System.out.println()

System.out.println() 是作为一个标记来使用的,用来测试一段特定的代码是否被执行。我们也可以打印出变量的值。此外:

  • 由于 System 对象是核心 Java 对象的一部分,它可以在不需要安装任何额外类的情况下被用于任何地方。这包括 Servlet、JSP、RMI、EJB's、普通的 Beans 和类,以及独立的应用程序。

  • 与在断点处停止不同,写入到 System.out 不会干扰到应用程序的正常执行流程,这使得它在时序是至关重要的时候显得尤为有价值。

下面是使用 System.out.println() 的语法:

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

通过上面的语法生成的所有消息将被记录在 Web 服务器日志文件中。

消息日志

使用适当的日志记录方法来记录所有调试、警告和错误消息,这是非常好的想法,推荐使用 log4J 来记录所有的消息。

Servlet API 还提供了一个简单的输出信息的方式,使用 log() 方法,如下所示:

// 导入必需的 java 库
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");
      // 调用两个 ServletContext.log 方法
      ServletContext context = getServletContext( );
      if (par == null || par.equals(""))
      // 通过 Throwable 参数记录版本
      context.log("No message received:",
          new IllegalStateException("Missing parameter"));
      else
          context.log("Here is the visitor's message: " + par);
      
      response.setContentType("text/html;charset=UTF-8");
      java.io.PrintWriter out = response.getWriter( );
      String title = "Context Log";
      String docType = " \n";
      out.println(docType +
        "\n" +
        "" + title + "\n" +
        "\n" +
        "" + title + "\n" +
        "Messages sent\n" +
        ");
    } // doGet
}

يحفظ ServletContext رسائل النص في ملفات السجلات الخاصة بمنفذ Servlet. بالنسبة لتومكات، يمكن العثور على هذه الملفات في دليل <Tomcat-installation-directory>/logs.

هذه الملفات المسجلة تقدم إشارات حول تردد الأخطاء أو المشاكل الجديدة. لذا، يُنصح باستخدام دالة log() في جملة catch التي لا تحدث عادة.

استخدام محول JDB لت调试

يمكنك استخدام أمر jdb لت调试 Servlet.

لت调试 Servlet، يمكننا ت调试 sun.servlet.http.HttpServer، ثم نعتبره تنفيذ Servlet بواسطة HttpServer للرد على طلبات HTTP من الجانب المطلوب. هذا يشبه بشكل كبير ت调试 applet. يختلف ذلك عن ت调试 applet، حيث يكون البرنامج الذي يتم ت调试ه هو sun.applet.AppletViewer.

معظم محولات الت调试 تتمكن من إخفاء التفاصيل المتعلقة بت调试 applet تلقائيًا. بنفس الطريقة، بالنسبة لـ servlet، يجب أن تساعد محول الت调试 في تنفيذ ما يلي:

  • حدد مسار classpath لدى محول الت调试 ليجد sun.servlet.http.Http-Server والدوال المرتبطة.

  • حدد مسار classpath لدى محول الت调试 ليجد servletات والدوال المدعومة، عادةً في دليل server_root/servlets و server_root/classes.

عادةً لا تريد أن يكون دليل server_root/servlets في مسار classpath، لأنه سيفصل إعادة تحميل servlet. ولكن هذه القاعدة تتضمن هيكلية الملفات تكون مفيدة جدًا للت调试. تسمح لهذا بتشغيل نقاط التوقف في servlet قبل تحميل Servlet بواسطة محميل Servlet المخصص في HttpServer.

إذا كنت قد قمت بتعيين المسار الصحيح لـ classpath، يمكنك البدء في الت调试 لـ sun.servlet.http.HttpServer. يمكنك تعيين نقاط التوقف في كود Servlet الذي تريد الت调试، ثم استخدام Servlet المقدم (http://localhost:8080/servlet/ServletToDebug) عبر متصفح الويب لإرسال طلب إلى HttpServer. ستشاهد البرنامج يتوقف عند نقطة التوقف.

استخدام التعليقات

تعليقات الكود تساعد في ت调试 بطرق متعددة. يمكن استخدام التعليقات في العديد من طرق ت调试.

يستخدم Servlet التعليقات باللغة Java و التعليقات على السطر الواحد (//...). يمكن استخدام التعليقات على السطر المتعدد (/* ...*/) لازالة جزء من كود Java مؤقتًا. إذا اختفت المشكلة، راقب الكود الذي قمت بتعليقه بعناية وابحث عن المشكلة.

معلومات العناوين للعميل والخادم

في بعض الأحيان، عندما لا يعمل Servlet كما هو متوقع، يمكن أن يكون النظر في الطلبات والاستجابات HTTP الأصلية مفيدًا جدًا. إذا كنت مطلعًا على بنية HTTP، يمكنك قراءة الطلبات والإجابات لمعرفة ما هي هذه المعلومات في العناوين.

نصائح ت调试 مهمة

إليك بعض النصائح حول ت调试 Servlet:

  • لا يتم إعادة تحميل server_root/classes، ولكن قد يتم إعادة تحميل server_root/servlets.

  • اطلب من المتصفح عرض المحتوى الأصلي للصفحة التي يعرضها. هذا يساعد في تحديد مشاكل الت формат. عادة ما يكون هذا خيارًا تحت قائمة "عرض".

  • تأكد من إعادة تحميل الصفحة بشكل كامل لضمان عدم تضمين المتصفح لنتائج الطلب السابق في المخزن المؤقت. في Netscape Navigator، استخدم Shift-Reload، وفي Internet Explorer، استخدم Shift-Refresh.

  • أكد أن دالة init() لـ servlet تأخذ ServletConfig كمعامل وتقوم بتشغيل super.init(config).