2010-01-13 2 views
3

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

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

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

ответ

4

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

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

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

+0

, когда вы говорите, разворачивают WAR-файл в автономный Tomcat, это просто означает файл WAR в папке webapps в папке Apache Tomcat. Я прав? У вас есть что-то еще, чтобы развернуть его, или Tomcat автоматически развозит файл WAR для вас –

+1

Нет, Tomcat автоматически расширит WAR-файл. Вы узнаете, что это произошло, когда вы видите каталог под 'webapps' с тем же именем, что и файл WAR (например, если вы развернули' myapp.war', вы увидите каталог '$ CATALINA_HOME/webapps/myapp /). В зависимости от версии Tomcat, которую вы используете, вам может потребоваться перезапустить Tomcat, или это может произойти автоматически. – danben

0

вы должны исследовать жизненный цикл сервлета - это то, что Init() и разрушающие методы существуют для

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

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

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

1

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

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

+0

Спасибо. Ваш ответ мне очень помогает. Не всегда мой сервлет закрывается. Когда это произойдет, я постараюсь опубликовать точную ошибку. На данный момент я попытаюсь развернуть WAR-файл на автономный TOMCAT, как и другие. –

2

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

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

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

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

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

+0

Когда вы сказали, «убедитесь, что webapp полностью опубликован», означает ли это просто скопировать обновленный файл WAR в папку webapp в Tomcat? –

+0

Я не делаю Netbeans, но в Eclipse вы увидите статус «синхронизированный» в консоли сервера. Посмотрите, существует ли что-то подобное в Netbeans. – BalusC

Смежные вопросы