![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| DEER |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 749 Регистрация: 12.4.2005 Где: г. Рязань Репутация: нет Всего: 13 |
Привет всем!
Можно ли сделать такой сервлет, метод init которго быдет вызываться при начале работы приложения? Наподобии ActionServlet из struts, просто ActionServlet мне не подходит, так как он уже есть, и делает много разных дел, и запихивать туда ещё одну большую функциональность не хочется... -------------------- |
|||
|
||||
| tux |
|
||||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
Можно сделать Listener.
web.xml:
SomeContextListener.java:
Будет запускаться при инициализации приложения. |
||||
|
|||||
| DEER |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 749 Регистрация: 12.4.2005 Где: г. Рязань Репутация: нет Всего: 13 |
и "жить" всё время пока приложение не выключат?
мне там поток надо запустить -------------------- |
|||
|
||||
| tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
||||
|
||||
| DEER |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 749 Регистрация: 12.4.2005 Где: г. Рязань Репутация: нет Всего: 13 |
чтобы потом его корректно завершить.
закрыть все конекшены и сказать "пока" спасибо tux -------------------- |
|||
|
||||
| DEER |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 749 Регистрация: 12.4.2005 Где: г. Рязань Репутация: нет Всего: 13 |
попробовал создать простой listener,
запускаю debug чтобы осмотреть как он отработает, и что же я вижу? Он туда заходит ДВА раза!! Первый раз при начале загрузки tomkat'а, а второй раз уже непосредственно когда приложение стартовало. Скажите, так и должно быть? Я использовать в сервлет и написать в его описании load-on-startup не решит мою проблему? -------------------- |
|||
|
||||
| 3x3 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 261 Регистрация: 17.9.2006 Репутация: 5 Всего: 8 |
Кстати, вы уверены, что два раза он заходит по разным событиям? У меня было ощущение/подозрение (на почве эксперимента с одновременной загрузкой 9ти идентичных страничек во фреймсет), что томкат по дефолту стартует два (или три) процесса для обслуживания HTTP-запросов и озадачивает их по очереди. Не может так быть что листенер инитится для каждого из них персонально? -------------------- Зачем платить больше, когда можно заплатить дважды? |
|||
|
||||
| y3u |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 440 Регистрация: 9.9.2006 Где: Москва Репутация: 7 Всего: 13 |
ну есть еще старый добрый вариант, которым мало кто теперь пользуется - это сделать сервелет, сделать ему <load-on-startup>1</load-on-startup> но не мепить его ни на како контекст... можно в нем тогда перекрыть init() и destoy()... уж сервлет то должен заинициалайзиться точно только один раз...
Это сообщение отредактировал(а) y3u - 15.12.2006, 20:13 -------------------- В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах |
|||
|
||||
| Stampede |
|
|||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 66 Всего: 144 |
Все-таки иделогически более правильно делать такие вещи через ServletContextListener. То, что он два раза вызывается - это какой-то глюк. Надо просто его отловить и потом спокойно пользоваться.
Как отловить глюк? Ну давай для начала посмотрим, что говорит стек вызовов. Если есть отладчик (какая IDE?), то делается вообще на раз, через брейкпойнт. Если отладчика нету, то можно сделать так:
И сразу все станет ясно. Должно, по крайней мере. Если что - кидай вывод в форум, попробуем разобраться. |
|||
|
||||
| Greg |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 16.9.2006 Где: Беларусь, г.Минск Репутация: 5 Всего: 7 |
Тебе нужен сервлет который вызывается только в самом начале ? Смущает сравнение с ActionServlet который отрабатывает на каждом запросе к контейнеру. --------------------
Страх перед возможностью ошибки не должен отвращать нас от поисков истины. |
|||
|
||||
| 3x3 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 261 Регистрация: 17.9.2006 Репутация: 5 Всего: 8 |
Попробовал поэкспериментировать с Томкатом (v.5.5.17) на ту тему, о которой писал выше, но использовал JSP. Похоже он действительно дважды создаёт сервлет.
Непосредственно после запуска сервера (или первого обращения к JSP-странице) пользовательские запросы какое-то время выполняет один экземпляр класса, а потом (через секунду-две) в работу включается другой, и остаётся уже навсегда. Вот вырожденный случай - первый файл это просто фреймсет 3х3 одинаковых фреймов, содержимое которых генерится jsp-шкой, код которой занимается лишь деланием toString() объекта и представлен во втором файле: test4.html
test4.jsp
Так вот что выводится во фреймах (первая цифра - номер фрейма): 1. this: org.apache.jsp.test4_jsp@1493995 2. this: org.apache.jsp.test4_jsp@1493995 3. this: org.apache.jsp.test4_jsp@1493995 4. this: org.apache.jsp.test4_jsp@1493995 5. this: org.apache.jsp.test4_jsp@1493995 6. this: org.apache.jsp.test4_jsp@2c39d2 7. this: org.apache.jsp.test4_jsp@2c39d2 8. this: org.apache.jsp.test4_jsp@2c39d2 9. this: org.apache.jsp.test4_jsp@2c39d2 Если заглушить спячку в JSP-файле, то во все фреймы выводится одинаковый ID объекта, но при самой первой загрузке он один, а при последующих - другой, и при том уже, похоже, больше уже не меняется. Интересно, что это за первый инстанс, который сначала отрабатывает запросы и потом заменяется другим экземпляром того же объекта и нафига он нужен? -------------------- Зачем платить больше, когда можно заплатить дважды? |
||||
|
|||||
| tux |
|
||||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
У меня есть версия почему так может происходить. Если war описан с помощью тэга <Context> в server.xml и при этом лежит в каталоге ${CATALINA_HOME}/webapps, для которого включен autoDeploy, то Tomcat инициализирует приложение дважды, как следствие ServletContextListener вызывается два раза. Насчет JSP действительно интересно. У меня получилось тоже самое. Потом покопался в документации и вот чего обнаружил. В Tomcat 5.5 используется Jasper 2 и одно из его свойств:
То есть JSP может компилироваться (судя по всему делается это когда JSP изменился и при старте приложения) в фоновом режиме и какое-то время пока выполняется компиляция будет использоваться старый экземпляр. А вот когда приложение запустилось первый раз, Tomcat зачем-то первый раз компилит JSP в связи с тем, что он вообще еще не компилировался, а затем второй раз в связи с тем, что приложение запустилось. Зачем не понятно. Видимо Jasper 2 все еще недостаточно интеллектуален. |
||||
|
|||||
| 3x3 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 261 Регистрация: 17.9.2006 Репутация: 5 Всего: 8 |
Да, точно, к сервлету это не относится. -------------------- Зачем платить больше, когда можно заплатить дважды? |
|||
|
||||
| DEER |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 749 Регистрация: 12.4.2005 Где: г. Рязань Репутация: нет Всего: 13 |
ДаДаДа
короче запускается ВСЁ по два раза, но не из за того что это Листенер-ы, потому что и сервлеты, у который прописано <load-on-startup>1</load-on-startup> тоже по два раза отрабатывают это потому что,
ну или по крайней мере приблизительно потому что, короче у меня проект лежит в одном каталоге, а деплоится при запуске в другой, из за этого и происходит... На других рабочих станциях всё нормально работает! Всем спасибо!!! Добавлено @ 10:48 Stampede, вот чо пишется в консоли при запуске
некоторые строки помечены Duplicate Это сообщение отредактировал(а) DEER - 18.12.2006, 10:41 -------------------- |
||||
|
|||||
| Катена |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 8.1.2007 Репутация: нет Всего: нет |
Помогите пожалуйста!!!!!!!
.java не компилируется в .class Установила j2se, j2ee, прописала все переменные окружения ошибку выдает на import javax.servlet.*; и import javax.servlet.http.*; |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |