Резюме
При использовании IntelliJ IDEA для отладки JSP я вижу, что JSP запускается дважды перед фактическим запросом из браузера. Кто-нибудь знает почему?
Обновлено с тестом сервлета ниже.
Обзор
Я использую (оцениваю) IntelliJ IDEA впервые (эффективно). При отладке веб-приложений я вижу странное поведение, которое подсказывает мне, что у меня где-то что-то неправильно настроено: если у меня установлена точка останова в коде, который будет запускаться в ответ на страницу запуска, код запускается дважды до запуска браузера. и затем в третий раз в ответ на запрос браузера. Я хотел бы знать, возможно, я где-то ошибся (или если я не ошибся, что происходит).
Настройка
А) Создан новый проект веб-приложения
- Создан новый проект с нуля
- дал ему имя и идентифицировал его как модуль Java
- Принимается по умолчанию
src
каталог
- Выберите «Веб-приложение» из списка «Желаемые технологии»
Это дало мне стандартную структуру (src
, WEB-INF
и т. Д.) Со значением по умолчанию index.jsp
.
B) Добавлен простой код в JSP для вывода даты.
C) Поставьте точку останова в коде.
D) Настроил мой веб-браузер в Файл | Настройки | Веб-браузеры
E) Пошел на Run | Редактировать конфигурации ... и:
- Кликнул [+] | Tomcat Server | Местный
- дал имя
- Нажмите кнопку Настроить ... рядом с раскрывающимся списком серверов приложений (поскольку у меня его еще не было) и направили ее на мой автономный сервер Tomcat6 (см. Ниже), принимая все значения по умолчанию
- Вернувшись в конфигурацию отладки, сказал ему развернуть артефакт "война взорвался" для этой конфигурации
- Добавлена строка запроса "? Foo = bar" в начальный URL-адрес по умолчанию, поэтому: http://localhost:8080/?foo=bar (вы поймете почему ниже)
- Оставил все остальное по умолчанию
- Нажал ОК
Бег
- Выберите Выполнить | Debug . Он счастливо запускает сервер Tomcat.
- Он достигает точки останова. Изучение запроса показывает, что это GET из
user-agent
"Java / 1.6.0_20". Он имеет строку запроса, настроенную выше. Нет атрибутов, нет параметров, кроме строки запроса один.
- Нажмите кнопку Продолжить программу (F9).
- Это снова достигает точки останова. Это также GET из
user-agent
"Java / 1.6.0_20", но он не имеет строку запроса. Без атрибутов, без параметров.
- Нажмите кнопку Продолжить программу (F9).
- Он запускает браузер и снова достигает точки останова. Это GET из браузера (со строкой запроса) и выглядит совершенно нормально.
Я вижу поведение как со строкой запроса, так и без нее, я просто добавил ее, чтобы узнать, когда / обнаружится ли она.
Если я создаю класс и использую этот класс из кода в JSP и перемещаю свою точку останова в код класса, эта точка останова получает все три раза, так что если она выполняет реальную работу ( например, поиск чего-либо в базе данных), это действительно сделало бы эту работу. Я задавался вопросом, был ли это какой-то фантомный вызов перед компиляцией или что-то в этом роде, но А) это не должно быть, и Б) это не так.
Запуск с сервлетом
Я хотел еще немного дразнить поведение, поэтому я добавил сервлет в проект, сопоставил его с путем /foo
и изменил свою конфигурацию отладки так, чтобы она запускала http://localhost:8080/foo?foo=bar, а не страницу индекса , Я также добавил в проект еще одну JSP, которая называется root.jsp. Это выявило очень интересное поведение:
- Выберите Выполнить | Debug . Он счастливо запускает сервер Tomcat.
- Достигает точки останова в коде servlet .Изучение запроса показывает, что это GET из
user-agent
"Java / 1.6.0_20".У него есть строка запроса.Нет атрибутов, нет параметров, кроме строки запроса один. - Нажмите кнопку «Возобновить программу» (F9).
- Она достигает точки останова в index.jsp (?!).Это также GET из
user-agent
"Java / 1.6.0_20", но он не имеет строку запроса.Нет атрибутов, нет параметров.Обратите внимание, что index.jsp не имеет ничего общего с путем запуска /foo
. - Нажмите кнопку Возобновить программу (F9).
- Он запускает браузер и снова достигает точки останова в сервлете.Это GET из браузера (со строкой запроса) и выглядит совершенно нормально.
Точка останова в файле another.jsp никогда не попадает.Поэтому я подозревал, что запуск index.jsp (без строки запроса) связан с тем, что он является «файлом приветствия» по умолчанию.Поэтому я добавил welcome-file-list
в свой web.xml и настроил еще один .jsp как welcome-file
.Конечно же, теперь достигается точка останова в another.jsp, а не в index.jsp.
Подробнее
- Довольно универсальная настольная установка Ubuntu 10.04 LTS
- Недавно загруженная и распакованная установка IntelliJ IDEA Ultimate (30-дневная пробная версия)
- Недавно загруженная и распакованная автономная установка Tomcat6 (IDEA не понравилась центральная установка, которую я сделал через Synaptic, структура разделенного каталога перепутанатак что я остановил этот сервер и просто использовал простую версию для скачивания и распаковки)
- Sun's Java 6 JDK
Заранее спасибо!