Servlet Отладка
Тестирование/отладка Servlets всегда является сложной частью разработки. Servlets часто включают много взаимодействия клиент/сервер, и могут возникать ошибки, которые трудно воспроизвести.
Вот несколько советов и рекомендаций, которые помогут вам в отладке.
System.out.println()
System.out.println() используется как маркер для проверки, был ли выполнен определённый фрагмент кода. Мы также можем выводить значения переменных. Кроме того:
- Поскольку объект System является частью основных объектов Java, его можно использовать где угодно без установки каких-либо дополнительных классов. Это включает Servlets, JSP, RMI, EJB's, обычные Beans и классы, а также автономные приложения.
- В отличие от остановки на точках останова, запись в 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");
// 调用两个 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 = "<!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 записывает свои текстовые сообщения в файлы журнала контейнера сервлетов. Для Tomcat эти журналы можно найти в каталоге <Tomcat-installation-directory>/logs.
Эти файлы журнала действительно дают представление о частоте новых ошибок или проблем. Поэтому рекомендуется использовать функцию log() в блоках catch для исключений, которые обычно не возникают.
Использование отладчика JDB
Вы можете использовать команду jdb для отладки апплетов или приложений, чтобы отлаживать сервлеты.
Чтобы отладить сервлет, мы можем отлаживать sun.servlet.http.HttpServer, а затем рассматривать его как HttpServer, выполняющий сервлет для ответа на HTTP-запросы браузера. Это очень похоже на отладку апплетов. Отличие от отладки апплета состоит в том, что фактически отлаживаемая программа — это sun.applet.AppletViewer.
Большинство отладчиков автоматически скрывают детали того, как отлаживать апплеты. Аналогично, для сервлетов вы должны помочь отладчику выполнить следующее:
- Настройте classpath вашего отладчика так, чтобы он мог находить sun.servlet.http.HttpServer и связанные классы.
- Настройте classpath вашего отладчика так, чтобы он мог находить ваш сервлет и вспомогательные классы, обычно в server_root/servlets и server_root/classes.
Обычно вы не хотите, чтобы server_root/servlets был в вашем classpath, потому что это отключает перезагрузку сервлетов. Но это правило включения очень полезно для отладки. Оно позволяет вашему отладчику устанавливать точки останова в сервлете до того, как пользовательский загрузчик сервлетов в HttpServer загрузит сервлет.
Если вы установили правильный classpath, вы можете начать отладку sun.servlet.http.HttpServer. Вы можете установить точки останова в коде Servlet, который хотите отладить, а затем с помощью веб-браузера отправить запрос к HttpServer с указанным Servlet (http://localhost:8080/servlet/ServletToDebug). Вы увидите, как программа остановится на точке останова.
Использование комментариев
Комментарии в коде помогают при отладке разными способами. Комментарии можно использовать и многими другими способами в процессе отладки.
Этот Servlet использует комментарии Java, и однострочные комментарии (//...), многострочные комментарии (/* ...*/) можно использовать, чтобы временно исключить части Java-кода. Если баг исчезнет, внимательно посмотрите на код, который вы только что закомментировали, и выясните проблему.
Информация о заголовках клиента и сервера
Иногда, когда Servlet ведет себя не так, как ожидается, очень полезно посмотреть на необработанные HTTP-запрос и ответ. Если вы знакомы со структурой HTTP, вы можете прочитать запрос и ответ, чтобы точно увидеть, что это за заголовки.
Важные советы по отладке
Вот несколько советов по отладке Servlet:
- Обратите внимание, что server_root/classes не перезагружается, тогда как server_root/servlets может перезагружаться.
- Попросите браузер отобразить необработанное содержимое страницы, которую он показывает. Это помогает выявить проблемы форматирования. Обычно это опция в меню "Вид".
- Убедитесь, что браузер не кэшировал вывод предыдущего запроса, принудительно выполнив полную перезагрузку страницы. В Netscape Navigator используйте Shift-Reload; в Internet Explorer используйте Shift-Refresh.
- Убедитесь, что метод init() сервлета принимает параметр ServletConfig и вызывает super.init(config).