Load-on-startup Tomcat
Как загрузить класс при запуске в Tomcat?
Я видел тэг load-on-startup
для файла web.xml
, но могу ли я его использовать и как я должен писать свой класс?
EDIT: Как я могу реализовать этот класс и xml?
<servlet-name>??</servlet-name>
<servlet-class>??</servlet-class>
<load-on-startup>10</load-on-startup>
Ответы
Ответ 1
Они предназначены для указания порядка загрузки сервлетов. Тем не менее, сервлеты больше предназначены для управления, предварительной обработки и/или постпроцессов HTTP-запросов/ответов, в то время как вы говорите, что хотите больше искать крючок при запуске webapp. В этом случае вы предпочитаете ServletContextListener
.
@WebListener
public class Config implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
// Do your thing during webapp startup.
}
public void contextDestroyed(ServletContextEvent event) {
// Do your thing during webapp shutdown.
}
}
Если вы еще не используете Servlet 3.0 (и, следовательно, не можете использовать @WebListener
), вам необходимо вручную зарегистрировать его в web.xml
следующим образом:
<listener>
<listener-class>com.example.Config</listener-class>
</listener>
См. также:
Ответ 2
Элемент load-on-startup указывает, что этот сервлет должен быть загружен (создается экземпляр и вызывается его init()) при запуске веб-приложения. Содержимое элемента этого элемента должно быть целым числом, указывающим порядок загрузки сервлета. Другими словами, контейнер загружает сервлеты в возрастающее целочисленное значение. Сначала будет загружено значение 0, затем 1, 2, 3 и т.д.
Попробуйте понять это на примере, приведенном ниже:
web.xml
<web-app>
....
//=====================servlet 1==============
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>com.javatpoint.FirstServlet</servlet-class>
<load-on-startup>0</load-on-startup> //value given 0(zero)
</servlet>
//=====================servlet 2==============
<servlet>
<servlet-name>servlet2</servlet-name>
<servlet-class>com.javatpoint.SecondServlet</servlet-class>
<load-on-startup>1</load-on-startup> //value given 1(one)
</servlet>
...
</web-app>
Определено 2 сервлета, оба сервлета будут загружены во время развертывания проекта или запуска сервера. Но сначала будет загружен servlet1, а затем servlet2.
Передача отрицательного значения: Если вы передадите отрицательное значение, сервлет будет загружен во время запроса с первого запроса.
Ответ 3
Это решение для Tomcat 7.0
Шаг 1: Создайте файл войны для вашего webapp/сервлета. Если вы используете файл Eclipse, File- > Export- > Web- > WAR и сохраните его в известном месте.
Шаг 2: Узнайте домашнюю папку для своего кота. Для этого перейдите в tomcat/apache-tomcat-7.0.41/bin и выполните. /startup.sh Это напечатает пару глобальных имен переменных. Запишите его для CATALINA_HOME.
Шаг 3: Скопируйте файл войны с шага 1 в CATALINA_HOME/webapps
Шаг 4: Затем создайте XML файл в CATALINA_HOME/conf/{Engine}/localhost/MyServlets.xml:
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<Context deployOnStartup="true" docBase="/home/ubuntu/Downloads/apache-tomcat-7.0.42/webapps/" reloadable="true">
<Manager pathname=""/>
</Context>
Измените docBase, чтобы указать на место, где вы скопировали файл войны на шаге 3.
Теперь вы можете пойти в tomcat/apache-tomcat-7.0.41/bin и выполнить. /startup.sh.
Ваши сервлеты будут автоматически запущены.
Надеюсь, это поможет.
Ответ 4
enfix,
Ваш XML выглядит хорошо.
Вы должны поместить метод init() в свой класс сервлета, который вызывается при загрузке вашего сервера. doGet, doPost и методы вызываются только тогда, когда есть входящий запрос.
public class YourServlet extends HttpServlet
{
public void init()
{
//initialize( or add a log statement to debug)
}
}