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)
    }
}