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 и классы, а также автономные приложения.

  • В отличие от остановки на breakpoint, запись в System.out не干扰ит нормальный процесс выполнения приложения, что делает его особенно ценным в тех случаях, когда время выполнения критично.

Ниже приведен синтаксис использования System.out.println():

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

Все сообщения, сгенерированные этой грамматикой, будут записаны в файл журнала веб-сервера.

Журнал сообщений

Использование подходящих методов записи лога для записи всех отладочных, предупреждающих и ошибочных сообщений является очень хорошей идеей и рекомендуется. 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");
      // Call two ServletContext.log methods
      ServletContext context = getServletContext( );
      if (par == null || par.equals(""))
      // Through the Throwable parameter to record the version
      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 = "<!DOCTYPE html> \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 записывает свои текстовые сообщения в лог-файл контейнера Servlet. Для Tomcat эти логи можно найти в каталоге <Tomcat-installation-directory>/logs.

Эти лог-файлы действительно указывают на частоту возникновения новых ошибок или проблем. Поэтому рекомендуется использовать функцию log() в блоке catch для нестандартных исключений.

Использование отладчика JDB

Вы можете использовать команду jdb для отладки Servlet, как для отладки applet или приложения.

Чтобы отладить Servlet, мы можем отладить HttpServer из пакета sun.servlet.http и рассматривать его как выполнение Servlet для ответа на 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 в HttpServer.

Если вы уже настроили правильный путь класса classpath, вы можете начать отладку HttpServer из пакета sun.servlet.http. Вы можете установить точку останова в вашем Servlet коде и затем отправить запрос HttpServer через веб-браузер, используя предоставленный Servlet (http://localhost:8080/servlet/ServletToDebug). Вы увидите, что программа остановится на точке останова.

Использование комментариев

Комментарии в коде помогают в отладке различными способами. Комментарии могут использоваться во многих других способах отладки процесса.

Этот Servlet использует Java-комментарии и однolinейные комментарии (//...), многolinейные комментарии (/* ...*/) могут использоваться для временного удаления части 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).