Как работают сервлеты? - PullRequest
3 голосов
/ 13 января 2010

Я пишу пары программ сервлетов, однако не думаю, что полностью понимаю, как работает сервлет. Итак, вот вопрос пары, который у меня есть:

Весь код, который я написал о сервлете, запускается только на Netbeans, за ним следует apache tomcat. Когда я запускаю свой html-файл, который отправляет запрос сервлету, он обычно выдает ошибку, говорящую о том, что он не может найти сервлет, тогда я должен повторно развернуть сервлет, тогда все будет работать нормально. Похоже, у моего сервлета истекло время ожидания или что-то в этом роде.

Работает ли сервлет все время? В сервлете есть init () и destroy (), поэтому я думаю, что он не будет работать постоянно. Итак, когда это начинается и когда это заканчивается? Он начинается, когда есть запрос от клиента, и заканчивается, когда истекает время ожидания? И как я исправил свою проблему, что я должен постоянно повторно развертывать сервлет. Большое спасибо.

Ответы [ 4 ]

4 голосов
/ 13 января 2010

В нормальных условиях сервлет уничтожается только при завершении работы (т. Е. При закрытии контейнера приложения, такого как Tomcat). В противном случае он остается в памяти на время действия приложения. Я не могу сказать, что происходит с вашей установкой Netbeans, но попробуйте развернуть файл WAR в автономной установке Tomcat и посмотреть, не исчезнет ли проблема.

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

Что касается вашего вопроса о запросах, сервлет предназначен для обработки многих запросов. Говорят, что сервлет находится в области приложения, тогда как запрос имеет собственную область действия.

2 голосов
/ 15 января 2010

Вы, очевидно, в середине разработки с сервлетами. Вам необходимо обеспечить , чтобы веб-приложение было полностью опубликовано всякий раз, когда вы вносили изменения в web.xml или в любой из Servlet классов. В противном случае вы можете рискнуть, что ресурс не будет найден.

Проще говоря, ошибка «ресурс не найден» в основном совпадает с «404 страница не найдена». Контейнер сервлета не может найти ресурс, который соответствует URL или url-pattern. Вот и все.

Что касается жизненного цикла Servlet, он будет создан только один раз во время запуска веб-приложения (публикация, создание контекста), будет вызван метод init(), и экземпляр будет сохранен в память сервера в сортировке из Map<Url-Pattern, Servlet>. Если вы переопределили метод init() в вашего Servlet, он будет вызван. Контейнер сервлета будет делать то же самое для всех сервлетов, объявленных в web.xml (или в соответствии с Java EE 6, помеченных @WebServlet).

Каждый раз, когда запрос, URL-адрес которого соответствует url-pattern из Servlet, будет вызываться (унаследованный) метод service(). Нормальная реализация HttpServlet будет определять метод, который будет выполняться на основе HttpServletRequest#getMethod(). Если вы переопределили любой из этих методов (doGet(), doPost() и т. Д.) В your Servlet, то он будет вызван соответствующим образом.

Наконец, когда веб-приложение собирается завершить работу (отменить публикацию, уничтожить контекст), тогда destroy() будет вызван для любого из Servlet экземпляров, хранящихся в памяти сервера. Если вы переопределили метод destroy() в вашего Servlet, он будет вызван.

1 голос
/ 14 января 2010

Сервлет «запускается» только тогда, когда он вызывается. Сервер будет ожидать подключения от клиента, прочитает заголовки, найдет подходящий сервлет на основе отображений в web.xml, а затем вызовет метод service() этого сервлета. Объект сервлета будет оставаться в памяти до тех пор, пока контейнер не решит утилизировать его (что он может сделать в любое время, когда он не обслуживает запросы). Если сервер решит удалить конкретный экземпляр сервлета, он создаст новый при следующем поступлении запроса на сервлет.

Это означает, что вы не должны получать ошибку, которая говорит, что сервер не может найти ваш сервлет. Предполагая, что приложение было развернуто, и существует правильное отображение сервлета, контейнер сможет обработать запрос. Если вы отредактируете свой запрос и вставите точное сообщение об ошибке, кто-то может сказать вам, почему этого не происходит.

0 голосов
/ 13 января 2010

вам нужно исследовать жизненный цикл сервлета - вот что есть методы init () и destroy для

обычно init () вызывается один раз, когда serlvet вызывается впервые (если только вы не сделали что-то вроде установки автозапуска в tomcat)

и destroy () вызывается, когда контейнер выключается

dopost () или doGet () (если это HTTP-сервлет) вызываются для каждого запроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...